程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 第二十二章 springboot + archaius + consul(配置管理),springbootarchaius

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

編輯:JAVA綜合教程

第二十二章 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     @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)去動態讀取

 

微服務中的配置統一管理與動態管理完成!!!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved