第二十二章 springboot + archaius + consul(組態管理),springbootarchaius
archaius(netflix出品)
特點:
- 可以實現動態擷取配置
- 原理是每隔60s(預設,可配置)從配置源讀取一次內容,這樣修改了設定檔後不需要重啟服務就可以使修改後的內容生效
- 前提:使用archaius的API來讀取,如果是通過Environment和@value註解,需要重啟服務來使新值生效,所以,經常需要變動的值使用下邊代碼的方式來讀取,而直接注入到spring bean中的值不需要變動的使用Environment和@value就可以了!!!
- 配置的操作都是安全執行緒的
作用:
一、啟動consul並建立KV
啟動consul與建立KV查看:第二十章 springboot + consul(1)
注意:kv的建立可以使用手動的方式去建立。
結果如下:
說明:
- key:service/"服務名"/"服務tag"/config
- value:application.properties檔案中的配置內容
二、編寫程式
1、引入jar
1 <!-- archaius --> 2 <dependency> 3 <groupId>com.netflix.archaius</groupId> 4 <artifactId>archaius-core</artifactId> 5 <version>0.6.6</version> 6 </dependency> 7 <!-- 動態配置,archaius底層 --> 8 <dependency> 9 <groupId>commons-configuration</groupId>10 <artifactId>commons-configuration</artifactId>11 <version>1.8</version>12 </dependency>
注意:引入的commons-configuration就是archaius的底層實現。
2、構建archaius讀取配置的源頭
1 package com.microservice.archaius; 2 3 import java.io.StringReader; 4 import java.util.HashMap; 5 import java.util.Map; 6 import java.util.Properties; 7 8 import org.apache.commons.lang3.StringUtils; 9 10 import com.google.common.base.Optional;11 import com.netflix.config.PollResult;12 import com.netflix.config.PolledConfigurationSource;13 import com.orbitz.consul.Consul;14 import com.orbitz.consul.KeyValueClient;15 16 /**17 * 指定archaius讀取配置的源頭18 */19 public class ConsulConfigurationSource implements PolledConfigurationSource {20 21 private String keyName;22 23 public ConsulConfigurationSource(String keyName) {24 this.keyName = keyName;25 }26 27 /**28 * 預設情況下,每隔60s,該方法會執行一次29 */30 @Override31 public PollResult poll(boolean initial, Object checkPoint) throws Exception {32 Consul consul = Consul.builder().build();33 KeyValueClient kvClient = consul.keyValueClient();34 Optional<String> kvOpt = kvClient.getValueAsString(keyName);35 String kvStr = StringUtils.EMPTY;36 if (kvOpt.isPresent()) {37 kvStr = kvOpt.get();38 }39 40 Properties props = new Properties();41 props.load(new StringReader(kvStr));//String->Properties42 43 Map<String, Object> propMap = new HashMap<>();44 for (Object key : props.keySet()) {45 propMap.put((String) key, props.get(key));46 }47 return PollResult.createFull(propMap);48 }49 50 }
注意:
- String->properties使用prop.load(new StringReader(str));
- poll方法每隔60s(預設)就會執行一次(即從consul上拉取一次值)
3、組態管理員並動態讀取
1 @ApiOperation("get KV from consul by archaius") 2 @RequestMapping(value="/kv2/",method=RequestMethod.GET) 3 public void getKVByArchaius(@RequestParam("key") String key) throws IOException { 4 5 PolledConfigurationSource source = new ConsulConfigurationSource(key);//定義讀取配置的源頭 6 AbstractPollingScheduler scheduler = new FixedDelayPollingScheduler();//設定讀取設定檔的 7 DynamicConfiguration configuration = new DynamicConfiguration(source, scheduler); 8 9 ConfigurationManager.install(configuration);10 11 DynamicStringProperty dsp = DynamicPropertyFactory.getInstance().getStringProperty("mysql.driverClassName", "zhaojigangDriver");12 System.out.println("目前時間:" + LocalDateTime.now() + "-->值:" + dsp.get());13 try {14 Thread.sleep(60000);//睡60s15 } catch (InterruptedException e) {16 e.printStackTrace();17 }18 System.out.println("目前時間:" + LocalDateTime.now() + "-->值:" + dsp.get());19 }
步驟:
- 根據資料配置源PolledConfigurationSource與調度器AbstractPollingScheduler構建DynamicConfiguration(該類實際上就是一個Property)
- 將DynamicConfiguration加入到ConfigurationManager中
- 使用DynamicPropertyFactory.getInstance().getStringProperty(String key, String defaultValue)去動態讀取
微服務中的配置統一管理與動態管理完成!!!