你的位置:首页 > Java教程

[Java教程]第二十二章 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   @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)去动态读取

 

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