分散式配置中心apollo
隨著java技術的發展,分散式,叢集一步步的走過來,java的配置是越來越繁瑣了,而且多個節點的話也需要每個節點單獨配置,java生態環境中各個大佬也在不斷的優化解決這些問題,首先是由springboot開始興起的“約定優於配置”這一概念,簡化了大量配置,使得開發變得更有效率,只需配置與一般做法不同的即可,然後就是隨著目前主流的開發流程分開發,測試,預釋出,生產,幾步,我們開發的專案需要走完這幾個環境才能正式的上線給使用者使用,這其中每個環境的配置都不一樣,並且每個專案還有多個節點(且數目不定,隨時可能新增),這給我們隊配置的維護帶來了很大的不變,基於此,近年來,有了分散式配置中心這一概念的產生,springcloud自帶的spring config ,百度的disconf,阿里的Diamond,今天我們介紹的是攜程的apollo,它也是基於springcloud的註冊中心eureka
一、簡介
Apollo(阿波羅)是攜程框架部門研發的分散式配置中心,能夠集中化管理應用不同環境、不同叢集的配置,配置修改後能夠實時推送到應用端,並且具備規範的許可權、流程治理等特性,適用於微服務配置管理場景。
官方github:https://github.com/ctripcorp/apollo
作者對Apollo對介紹:https://github.com/ctripcorp/apollo/wiki/Apollo配置中心介紹
apollo其實是很多獨特的優勢的,比如配置修改實時生效,灰度釋出 ,釋出與回滾等。
二、服務端的部署
服務端的程式碼只需從git上下載下來,按官方文件初始化資料庫,更改配置即可,本篇主要闡述客戶端的操作
三、java客戶端的配置(集成於springcloud)
使用配置中心配置資訊
maven引入上面步驟編譯打包成功的apollo-core和apollo-client包:
<dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-core</artifactId> <version>0.11.0-SNAPSHOT</version> </dependency> <dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-client</artifactId> <version>0.11.0-SNAPSHOT</version> </dependency>
然後配置appid和apollo中心的地址(使用springcloud時配置為eureka的地址待研究)這裡有兩種方法可以配置,
第一在properties配置檔案中直接新增配置
//該項木的標識,即註冊到apollo配置中心上的名字 app.id=demo //環境資訊,apollo服務端預設有dev,fat,pro等,也可在服務端自定義 env=DEV
//服務端地址
dev.meta=http://192.168.0.1:8018
第二,可以通過jvm引數來完成配置,新增如下jvm引數
-Denv=YOUR-ENVIRONMENT -Ddev_meta=http://192.168.0.1:8018
測試
新增一個測試的類DemoConfiguration,主要是添加註解@EnableApolloConfig,啟用apollo的配置,當然配置中心要有下面配置的配置資訊:
@Configuration @EnableApolloConfig public class DemoConfiguration { @Value("${demo}") private String demo; }
四、apollo的本地快取
在客戶端連不上服務端時,他會使用上一次從服務端獲得的配置,該配置放於
Mac/Linux: /opt/data/{appId}/config-cache
Windows: C:\opt\data{appId}\config-cache
五、監聽修改配置
apollo的配置更新是實時推送的,但是我們採用配置有時是會初始化一些東西的,此時需要監聽配置的變化來實時的做一些切換或重新載入的策略,apollo也為我們提供了這樣的介面
Config config = ConfigService.getAppConfig(); config.addChangeListener(new ConfigChangeListener() { @Override public void onChange(ConfigChangeEvent changeEvent) { for (String key : changeEvent.changedKeys()) { ConfigChange change = changeEvent.getChange(key); System.out.println(String.format( "Found change - key: %s, oldValue: %s, newValue: %s, changeType: %s", change.getPropertyName(), change.getOldValue(), change.getNewValue(), change.getChangeType())); } } });