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)去动态读取
微服务中的配置统一管理与动态管理完成!!!
原标题:第二十二章 springboot + archaius + consul(配置管理)
关键词:Spring