做者 李波html
項目代碼中常常會用到各類配置項,好比下面的代碼中是從系統環境變量中獲取prop
:java
String prop = System.getProperty(myProperty); int x = DEFAULT_VALUE; try { x = Integer.parseInt(prop); } catch (NumberFormatException e) { // handle format issues } myMethod(x);
相似使用環境變量或者properties
和xml
等文件方式傳入配置進而控制應用表現的方法普遍應用於開發過程當中,這樣作能夠將外部配置與業務代碼解耦,如有變更只需修改配置參數而不須要從新編譯構建項目。可是這種將配置和代碼放在一塊兒的方式可能會泄露隱私信息(好比密碼),由於代碼可能會公開,出於安全的考慮,配置和代碼分離管理的方式開始普遍使用,常見的方法好比將配置放在CI服務器上經過打包腳本打入應用包中,或者直接放到運行應用的服務器的特定目錄下,或者存儲到數據庫中。這種方式在傳統的單體應用中簡單有效,但也帶來一些新的挑戰:git
此外,面對微服務爆發式增加的應用數量和服務器數量帶來新的困難github
這種背景下,中心化的配置服務即配置中心應運而生,簡單來講,配置中心就是一種統一管理各類應用配置的基礎服務組件,一個合格的配置中心須要知足:redis
開源社區目前主流的配置中心有spring-cloud-config, ctrip apollo, disconf 等,下表是對其功能特性、技術路線、可用性和易用性等發麪的比較[3]供參考。spring
spring-cloud-config | ctrip apollo | disconf | |
靜態配置管理 | 基於文件 | 支持 | 支持 |
動態配置管理 | 支持 | 支持 | 支持 |
統一管理 | 無,須要github | 支持 | 支持 |
多維度管理 | 無,須要github | 支持 | 支持 |
本地配置緩存 | 無 | 支持 | 支持 |
配置生效時間 | 重啓或手動refresh生效 | 實時 | 實時 |
配置更新推送 | 手動觸發 | 支持 | 支持 |
配置定時拉取 | 無 | 支持 | 依賴事件驅動 |
受權、審計、審覈 | 無,須要github | 支持 | 無 |
配置版本管理 | git作版本管理 | 界面上提供發佈歷史和回滾按鈕 | 操做記錄在數據庫,無查詢接口 |
實例配置監控 | 須要結合spring admin | 支持 | 支持 |
灰度發佈 | 不支持 | 支持 | 不支持部分更新 |
告警通知 | 不支持 | 支持,郵件方式告警 | 支持,郵件方式告警 |
多數據中心部署 | 支持 | 支持 | 支持 |
配置界面 | 無,經過git操做 | 統一界面 | 統一界面 |
綜合比較後,ServiceComb選擇了Apollo[4]做爲配置中心進行對接。Apollo是攜程框架部門研發並貢獻到開源社區的分佈式配置中心,活躍貢獻者近百人。最新版本的ServiceComb Java Chassis已實現支持Apollo,用戶可使用該配置中心結合Chassis中集成的Archaius實如今不須要從新啓動或從新部署應用的前提下進行配置項的集中管理和動態修改。基於ServiceComb優秀的插件化設計,用戶能夠很是簡單的對接到其餘開源或自研的配置中心。docker
Apollo服務能夠經過docker或二進制啓動,方法參考官網文檔[5],推薦使用docker啓動。 數據庫
git clone https://github.com/lijasonvip/apollo-image-for-servicecomb.git cd apollo-image-for-servicecomb && docker-compose up
出現apollo-quick-start | Portal started. You can visit http://localhost:8070 now!
後表示Apollo已經啓動成功,瀏覽器訪問http://localhost:8070
便可訪問portal
服務,默認登陸帳號爲apollo/admin
。apache
登陸後點擊建立項目,填入應用名稱,其餘選默認便可,建立應用後須要進入應用點擊發布才能生效。瀏覽器
應用發佈後咱們須要獲取一個TOKEN,在http://localhost:8070/open/manage.html
頁面填入剛纔建立的應用ID和應用名稱並選擇項目和部門信息後點擊建立便可生成一個TOKEN,保存此TOKEN並配置到Chassis應用的配置文件中。
在Chassis應用的pom文件中引入依賴config-apollo
:
<dependency> <groupId>org.apache.servicecomb</groupId> <artifactId>config-apollo</artifactId> </dependency>
在Chassis應用的配置文件microservice.yaml
中增長如下配置:
apollo: config: serverUri: http://127.0.0.1:8070 serviceName: provider-id #建立應用時的AppID env: DEV clusters: default namespace: application token: de3c5b2e6d8535b96 refreshInterval: 10
至此,經過簡單的4步應用已經成功的對接到了Apollo配置中心,啓動應用後能夠在Apollo頁面經過對配置項的新增、更新、回滾等操做進行服務治理啦!Demo參考[6]。
Chassis動態配置基於Netflix的Archaius實現[7],Archaius擴展數據源方法參考文檔[8]和demo[9],Chassis按照[8]擴展了PolledConfigurationSource
和 AbstractPollingScheduler
,啓動的時候用SPI機制找到Source接口的實現類。
對接到一個新的配置中心只要擴展實現ConfigCenterConfigurationSource
接口,實現init
方法,在init
方法中實現鏈接配置中心,刷新配置項的邏輯便可,具體代碼請參考[10]。
對接到新的配置中心能夠設計新的配置參數,定義新的工具類獲取這些參數,並指定默認值,參考ApolloConfig
類對新增apollo.config.serverUri
等參數的處理
init函數實現固定時間間隔或實時獲取配置中心的配置項邏輯。ApolloClient
中refreshApolloConfig
函數啓動了一個定時執行的線程刷新配置項:
public void refreshApolloConfig() { EXECUTOR .scheduleWithFixedDelay(new ConfigRefresh(serviceUri), firstRefreshInterval, refreshInterval, TimeUnit.SECONDS); }
ConfigRefresh
線程的run
中會從Apollo配置中心獲取最新配置項並和以前的配置項對比分析出新增、修改和刪除的配置參數,而後去執行對應的更新操做。對配置項的修改更新都是基於Archaius的WatchedUpdateListener
進而實現應用內參數的動態更新。
ServiceComb目前在Apache基金會孵化,誠摯的歡迎開發者和用戶一塊兒參與社區討論和貢獻,加入社區的方法有訂閱郵件列表,關注微信公衆號,加入社區微信羣等,詳細方法請參考[1]。
掃描下方二維碼添加ServiceComb助手和關注社區公衆號。
ServiceComb小助手
ServiceComb公衆號
[1] 加入ServiceComb社區 http://mp.weixin.qq.com/s/a8dJupGGLPG0zhnhVq-Rdg
[2] ServiceComb 項目地址 https://github.com/apache/incubator-servicecomb-java-chassis
[3] 開源配置中心比較 https://github.com/ctripcorp/apollo/wiki/FAQ
[4] ctrip apollo https://github.com/ctripcorp/apollo/
[5] Apollo啓動 https://github.com/ctripcorp/apollo/wiki/Quick-Start
[6] Chassis應用使用Apollo配置中心Demo https://github.com/apache/incubator-servicecomb-java-chassis/tree/master/samples/config-apollo-sample
[7] Netflix Archaius https://github.com/Netflix/archaius/
[8] Archaius 擴展數據源 https://github.com/Netflix/archaius/wiki/Users-Guide
[9] Archaius 對接Redis Demo https://github.com/cnwrinc/archaius-redis
[10] Chassis對接配置中心代碼 https://github.com/apache/incubator-servicecomb-java-chassis/tree/master/dynamic-config/config-apollo