第二十二章 springboot + archaius + consul(配置管理)

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)去动态读取

 

微服务中的配置统一管理与动态管理完成!!!

转载于:https://my.oschina.net/xiaominmin/blog/3058303

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值