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 @Override
31 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->Properties
42
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);//睡60s
15 } 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)去动态读取
微服务中的配置统一管理与动态管理完成!!!