第二十二章 springboot + archaius + consul(組態管理),springbootarchaius

來源:互聯網
上載者:User

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

 

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.