《分佈式配置管理平臺XXL-CONF》
一、簡介
1.1 概述
XXL-CONF 是一個輕量級分佈式配置管理平臺,擁有"輕量級、秒級動態推送、多環境、跨語言、跨機房、配置監聽、權限控制、版本回滾"等特性。現已開放源代碼,開箱即用。
1.2 特性
- 1、簡單易用: 接入靈活方便,一分鐘上手;
- 2、輕量級: 部署簡單,不依賴第三方服務,一分鐘上手;
- 3、配置中心HA:配置中心支持集羣部署,提升配置中心繫統容災和可用性。
- 4、在線管理: 提供配置中心, 通過Web界面在線操作配置數據,直觀高效;
- 5、多環境支持:單個配置中心集羣,支持自定義多套環境,管理多個環境的的配置數據;環境之間相互隔離;
- 6、多數據類型配置:支持多種數據類型配置,如:String、Boolean、Short、Integer、Long、Float、Double 等;
- 7、跨語言:底層通過http服務(long-polling)拉取配置數據並實時感知配置變更,從而實現多語言支持。
- 8、跨機房:得益於配置中心集羣關係對等特性,集羣各節點提供冪等的配置服務;因此,異地跨機房部署時,只需要請求本機房配置中心即可,實現異地多活;
- 9、高性能:得益於配置中心的 "磁盤配置" 與客戶端的 "LocalCache",因此配置服務性能非常高;單機可承擔大量配置請求;
- 10、實時性: 秒級動態推送;配置更新後, 實時推送配置信息, 項目中配置數據會實時更新並生效, 不需要重啓線上機器;
- 11、配置變更監聽功能:可開發Listener邏輯,監聽配置變更事件,可據此動態刷新JDBC連接池等高級功能;
- 12、最終一致性:底層藉助內置廣播機制,保障配置數據的最終一致性,從而保證配置數據的同步;
- 13、配置備份: 配置數據同時在磁盤與MySQL中存儲和備份,並定期同步, 提高配置數據的安全性;
- 14、多種獲取配置方式:支持 "API、 註解、XML佔位符" 等多種方式獲取配置,可靈活選擇使用;
- 15、兼容Spring原生配置:兼容Spring原生配置方式 "@Value"、"${}" 加載本地配置功能;與分佈式配置獲取方式隔離,互不干擾;
- 16、分佈式: 支持多業務線接入並統一管理配置信息,支撐分佈式業務場景;
- 17、項目隔離: 以項目爲維度管理配置, 方便隔離不同業務線配置;
- 18、高性能: 通過LocalCache對配置數據做緩存, 提高性能;
- 19、客戶端斷線重連強化:設置守護線程,週期性檢測客戶端連接、配置同步,提高異常情況下配置穩定性和時效性;
- 20、空配置處理:主動緩存null或不存在類型配置,避免配置請求穿透到遠程配置Server引發雪崩問題;
- 21、用戶管理:支持在線添加和維護用戶,包括普通用戶和管理員兩種類型用戶;
- 22、配置權限控制;以項目爲維度進行配置權限控制,管理員擁有全部項目權限,普通用戶只有分配才擁有項目下配置的查看和管理權限;
- 23、歷史版本回滾:記錄配置變更歷史,方便歷史配置版本回溯,默認記錄10個歷史版本;
- 24、配置快照:客戶端從配置中心獲取到的配置數據後,會週期性緩存到本地快照文件中,當從配置中心獲取配置失敗時,將會使用使用本地快照文件中的配置數據;提高系統可用性;
- 25、訪問令牌(accessToken):爲提升系統安全性,配置中心和客戶端進行安全性校驗,雙方AccessToken匹配才允許通訊;
1.3 發展
於2015年,我在github上創建XXL-CONF項目倉庫並提交第一個commit,隨之進行系統結構設計,UI選型,交互設計……
至今,XXL-CONF已接入多家公司的線上產品線,接入場景如電商業務,O2O業務和核心中間件配置動態化等,截止2018-10-24爲止,XXL-CONF已接入的公司包括不限於:
- 1、深圳市綻放工場科技有限公司
- 2、深圳雙猴科技有限公司
- 3、商智神州軟件有限公司
- 4、浙江力太科技
- ……
更多接入的公司,歡迎在 登記地址 登記,登記僅僅爲了產品推廣。
歡迎大家的關注和使用,XXL-CONF也將擁抱變化,持續發展。
1.4 背景
why not properties
常規項目開發過程中, 通常會將配置信息位於在項目resource目錄下的properties文件文件中, 配置信息通常包括有: jdbc地址配置、redis地址配置、活動開關、閾值配置、黑白名單……等等。使用properties維護配置信息將會導致以下幾個問題:
- 1、需要手動修改properties文件;
- 2、需要重新編譯打包;
- 3、需要重啓線上服務器 (項目集羣時,更加令人崩潰) ;
- 4、配置生效不及時: 因爲流程複雜, 新的配置生效需要經歷比較長的時間纔可以生效;
- 5、不同環境上線包不一致: 例如JDBC連接, 不同環境需要差異化配置;
why XXL-CONF
- 1、不需要 (手動修改properties文件) : 在配置中心提供的Web界面中, 定位到指定配置項, 輸入新的配置的值, 點擊更新按鈕即可;
- 2、不需要 (重新編譯打包) : 配置更新後, 實時推送新配置信息至項目中, 不需要編譯打包;
- 3、不需要 (重啓線上服務器) : 配置更新後, 實時推送新配置信息至項目中, 實時生效, 不需要重啓線上機器; (在項目集羣部署時, 將會節省大量的時間, 避免了集羣機器一個一個的重啓, 費時費力)
- 4、配置生效 "非常及時" : 點擊更新按鈕, 新的配置信息將會即可推送到項目中, 瞬間生效, 非常及時。比如一些開關類型的配置, 配置變更後, 將會立刻推送至項目中並生效, 相對常規配置修改繁瑣的流程, 及時性可謂天壤之別;
- 5、不同環境 "同一個上線包" : 因爲差異化的配置託管在配置中心, 因此一個上線包可以複用在生產、測試等各個運行環境, 提供能效;
1.5 下載
文檔地址
源碼倉庫地址
源碼倉庫地址 | Release Download |
---|---|
https://github.com/xuxueli/xxl-conf | Download |
http://gitee.com/xuxueli0323/xxl-conf | Download |
中央倉庫地址
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-conf-core</artifactId>
<version>{最新穩定版}</version>
</dependency>
技術交流
1.6 環境
- Maven3+
- Jdk1.7+
- Mysql5.6+
二、快速入門
2.1 環境準備
初始化“數據庫”
請下載項目源碼並解壓,獲取 "數據庫初始化SQL腳本(Mysql)" 並執行即可。腳本位置如下:
xxl-conf/doc/db/xxl-conf.sql
2.2 編譯源碼
解壓源碼,按照maven格式將源碼導入IDE, 使用maven進行編譯即可,源碼結構如下圖所示:
- xxl-conf-admin:配置中心
- xxl-conf-core:公共依賴
- xxl-conf-samples: 接入XXl-CONF的示例項目,供用戶參考學習
- xxl-conf-sample-frameless: 無框架版本,main方法直接啓動運行
- xxl-conf-sample-spring: spring版本
- xxl-conf-sample-springboot: springboot版本
- xxl-conf-sample-jfinal: jfinal版本
- xxl-conf-sample-nutz: nutz版本
2.3 “配置中心” 搭建(支持集羣)
項目:xxl-conf-admin
作用:提供一個完善強大的配置管理平臺,包含:環境管理、用戶管理、項目管理、配置管理等功能,全部操作通過Web界面在線完成;
方式1:源碼編譯方式搭建:
- 配置文件位置:
/xxl-conf/xxl-conf-admin/src/main/resources/application.properties
- 配置項說明:
# 配置中心數據庫配置,存儲配置元數據
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl-conf?Unicode=true&characterEncoding=UTF-8
# 配置中心配置數據磁盤路徑地址,務必對該路徑存在讀寫權限
xxl.conf.confdata.filepath=/data/applogs/xxl-conf/confdata
# 配置中心接入驗證TOKEN,選填,非空時啓用,進行安全嚴重
xxl.conf.access.token=
- 配置中心啓動:
項目編譯打包後,可直接通過命令行啓動;
// 方式1:使用默認配置,mysql默認爲本地地址;
java -jar xxl-conf-admin.jar
// 方式2:支持自定義 mysql 地址;
java -jar xxl-conf-admin.jar --spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl-conf?Unicode=true&characterEncoding=UTF-8
方式2:Docker 鏡像方式搭建:
- 下載鏡像
// Docker地址:https://hub.docker.com/r/xuxueli/xxl-conf-admin/
docker pull xuxueli/xxl-conf-admin
- 創建容器並運行
docker run -p 8080:8080 -v /tmp:/data/applogs --name xxl-conf-admin -d xuxueli/xxl-conf-admin
/**
* 如需自定義 mysql 等配置,可通過 "PARAMS" 指定;
* 配置項參考文件:/xxl-conf/xxl-conf-admin/src/main/resources/application.properties
*/
docker run -e PARAMS="--spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl-conf?Unicode=true&characterEncoding=UTF-8 " -p 8080:8080 -v /tmp:/data/applogs --name xxl-conf-admin -d xuxueli/xxl-conf-admin
"配置中心" 集羣:
配置中心支持集羣部署,提高配置中心負載能力和可用性。
配置中心集羣部署時,項目配置文件保持一致即可。
2.4 “接入XXL-CONF的示例項目” 項目配置
項目:xxl-conf-sample-springboot
作用:接入XXl-CONF的示例項目,供用戶參考學習。這裏以 springboot 版本進行介紹,其他版本可參考各自sample項目。
A、引入maven依賴
<!-- xxl-conf-client -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-conf-core</artifactId>
<version>{最新穩定版}</version>
</dependency>
B、添加“XXL-CONF 配置信息”
可參考配置文件:
/xxl-conf/xxl-conf-samples/xxl-conf-sample-springboot/src/main/resources/application.properties
配置項說明
# 配置中心跟地址,必填;
xxl.conf.admin.address=http://localhost:8080/xxl-conf-admin
# 環境配置,必填;如"test、ppe、product"等,指定配置加載環境;
xxl.conf.env=test
# 配置中心接入驗證TOKEN,選填,非空時啓用,進行安全嚴重
xxl.conf.access.token=
# 配置快照文件地址,必填;會週期性緩存到本地快照文件中,當從配置中心獲取配置失敗時,將會使用使用本地快照文件中的配置數據;提高系統可用性;
xxl.conf.mirrorfile=/data/applogs/xxl-conf/xxl-conf-mirror-sample.properties
C、設置“XXL-CONF 配置工廠”
可參考配置文件:
/xxl-conf/xxl-conf-samples/xxl-conf-sample-springboot/src/main/java/com/xxl/conf/sample/config/XxlConfConfig.java
配置項說明
@Bean
public XxlConfFactory xxlConfFactory() {
XxlConfFactory xxlConf = new XxlConfFactory();
xxlConf.setAdminAddress(adminAddress);
xxlConf.setEnv(env);
xxlConf.setAccessToken(accessToken);
xxlConf.setMirrorfile(mirrorfile);
logger.info(">>>>>>>>>>> xxl-conf config init.");
return xxlConf;
}
至此,配置完成。
2.5 功能測試
a、添加和更新配置
參考章節 "4.2 配置管理" 添加或更新配置信息;
b、獲取配置並接受動態推送更新
參考章節 "三、客戶端配置獲取" 獲取配置並接受動態推送更新;
三、客戶端配置獲取
XXL-CONF 提供多種配置方式,包括 "API、 @XxlConf、XML" 等多種配置方式,介紹如下。
可參考項目 "xxl-conf-sample-spring"(接入XXl-CONF的示例項目,供用戶參考學習),代碼位置:com.xxl.conf.sample.controller.IndexController.index()
3.1 方式1: API方式
參考 "IndexController" 代碼如下:
String paramByApi = XxlConfClient.get("default.key01", null);
- 用法:代碼中直接調用API即可,示例代碼 ""XxlConfClient.get("key", null)"";
- 優點:
- 配置從配置中心自動加載;
- 存在LocalCache,不用擔心性能問題;
- 支持動態推送更新;
- 支持多數據類型;
3.2 方式2: @XxlConf 註解方式
參考 "DemoConf.paramByAnno" 屬性配置;示例代碼
@XxlConf("default.key02")
public String paramByAnno;
- 用法:對象Field上加註解 ""@XxlConf("key")",支持設置默認值,支持設置是否開啓動態刷新;
- 優點:
- 配置從配置中心自動加載;
- 存在LocalCache,不用擔心性能問題;
- 支持動態推送更新;
- 支持設置配置默認值;
- 可配置是否開啓 "動態推送更新";
“@XxlConf”註解屬性 | 說明 |
---|---|
value | 配置Key |
defaultValue | 配置爲空時的默認值 |
callback | 配置更新時,是否需要同步刷新配置 |
3.3 方式3: XML佔位符方式
參考 "applicationcontext-xxl-conf.xml" 中 "DemoConf.paramByXml" 屬性配置;示例代碼如下:
<bean id="demoConf" class="com.xxl.conf.sample.demo.DemoConf">
<property name="paramByXml" value="$XxlConf{default.key03}" />
</bean>
- 用法:佔位符方式 "$XxlConf{key}";
- 優點:
- 配置從配置中心自動加載;
- 存在LocalCache,不用擔心性能問題;
- 支持動態推送更新;
3.4 方式4: "XML + API" 混合方式
參考如下代碼:
<bean id="demoConf" class="com.xxl.conf.sample.demo.DemoConf2">
<constructor-arg index="0" value="#{T(com.xxl.conf.core.XxlConfClient).get('key')}" />
<property name="paramByXml" value="#{T(com.xxl.conf.core.XxlConfClient).get('default.key03')}" />
</bean>
- 用法:佔位符方式 "#{T(com.xxl.conf.core.XxlConfClient).get('key')}";
- 優點:
- 配置從配置中心自動加載;
- 存在LocalCache,不用擔心性能問題;
- 兼容性好:在一些特殊的XML配置加載場景,如 "XML構造器傳參"、"自定義spring的schema/xsd" ,上述幾種方式不適用,此時可以考慮這種方式,兼容各種場景格式;
- 缺點:
- 不支持動態推送更新;
3.5 其他方式: 配置變更監聽
可開發Listener邏輯,監聽配置變更事件;可據此實現動態刷新JDBC連接池等高級功能;
參考 "IndexController" 代碼如下:
XxlConfClient.addListener("default.key01", new XxlConfListener(){
@Override
public void onChange(String key, String value) throws Exception {
logger.info("配置變更事件通知:{}={}", key, value);
}
});
四、管理中心操作指南
4.1、環境管理
進入 "環境管理" 界面,可自定義和管理環境信息。
單個配置中心集羣,支持自定義多套環境,管理多個環境的的配置數據;環境之間相互隔離;
新增環境:點擊 "新增環境" 按鈕可添加新的環境配置,環境屬性說明如下:
- Env:每個環境擁有一個維護的Env,作爲環境標識;
- 環境名稱:該環境的名稱;
環境切換:配置中心頂部菜單展示當前操作的配置中心環境,可通過該菜單切換不同配置中心環境,從而管理不同環境中的配置數據;
4.2、用戶(權限)管理
進入 "用戶管理" 界面,可查看配置中心中所有用戶信息。
新增用戶:點擊 "新增用戶" 按鈕,可添加新用戶,用戶屬性說明如下:
- 權限:
- 管理員:擁有配置中心所有權限,包括:用戶管理、環境管理、項目管理、配置管理等;
- 普通用戶:僅允許操作自己擁有權限的項目下的配置;
- 用戶名:配置中心登陸賬號
- 密碼:配置中心登陸密碼
系統默認提供了一個管理員用戶和一個普通用戶。
分配項目權限:選中普通用戶,點擊右側 "分配項目權限" 按鈕,可爲用戶分配項目權限,權限細粒度到 "環境 + 項目"。 擁有環境項目權限後,該用戶可以查看和操作該環境項目下全部配置數據。
修改用戶密碼:配置中心右上角下拉框,點擊 "修改密碼" 按鈕,可修改當前登錄用戶的登錄密碼 (除此之外,管理員用戶,可通過編輯用戶信息功能來修改其他用戶的登錄密碼);
4.3、項目管理
系統以 "項目" 爲維度進行權限控制,以及配置隔離。可進入 "配置管理界面" 操作和維護項目,項目屬性說明如下:
- AppName:每個項目擁有唯一的AppName,作爲項目標識,同時作爲該項目下配置的統一前綴;
- 項目名稱:該項目的名稱;
系統默認提供了一個示例項目。
4.4 配置管理
進入"配置管理" 界面, 選擇項目,然後可查看和操作該項目下配置數據。
新增配置:點擊 "新增配置" 按鈕可添加配置數據,配置屬性說明如下:
- KEY:配置的KEY,創建時將會自動添加所屬項目的APPName所謂前綴,生成最終的Key。可通過客戶端使用最終的Key獲取配置;
- 描述:該配置的描述信息;
- VALUE:配置的值;
至此, 一條配置信息已經添加完成;
通過客戶端可以獲取該配置, 並且支持動態推送更新。
歷史版本回滾:配置存在歷史變更操作時,點擊右側的 "變更歷史" 按鈕,可查看該配置的歷史變更記錄。 包括操作時間、操作人,設置的配置值等歷史數據,因此可以根據歷史數據,重新編輯配置並回滾到歷史版本;
五、總體設計
5.1 架構圖
5.2 "配置中心" 設計
配置中心由以下幾個核心部分組成:
- 1、管理平臺:提供一個完善強大的配置管理平臺,包含:環境管理、用戶管理、項目管理、配置管理等功能,全部操作通過Web界面在線完成;
- 2、管理平臺DB:存儲配置信息備份、配置的版本變更信息等,進一步保證數據的安全性;同時也存儲"管理平臺"中多個模塊的底層數據;
- 3、磁盤配置數據:配置中心在每個配置中心集羣節點磁盤中維護一份鏡像數據,當配置新增、更新等操作時,將會廣播通知並實時刷新每個集羣節點磁盤中的配置數據, 最終實時通知接入方客戶端;
- 4、客戶端:可參考章節 "5.3 客戶端 設計" ;
5.3 "客戶端" 設計
客戶端基於多層設計,核心四層設計如下:
- 1、API層:提供業務方可直接使用的上層API, 簡單易用, 一行代碼獲取配置信息;同時保證配置的實時性、高性能;
- 2、LocalCache層:客戶端的Local Cache,極大提升API層的性能,降低對配置中心集羣的壓力;首次加載配置、監聽配置變更、底層異步週期性同步配置時,將會寫入或更新緩存;
- 4、Mirror-File層:配置數據的本地快照文件,會週期性同步 "LocalCache層" 中的配置數據寫入到 "Mirror-File" 中;當無法從配置中心獲取配置,如配置中心宕機時,將會使用 "Mirror-File" 中的配置數據,提高系統的可用性;
- 3、Remote層:配置中心遠程客戶端的封裝,用於加載遠程配置、實時監聽配置變更,提高配置時效性;
得益於客戶端的多層設計,以及 LocalCache 和 Mirror-File 等特性,因此業務方可以在高QPS、高併發場景下使用XXL-CONF的客戶端, 不必擔心併發壓力或配置中心宕機導致系統問題。
5.4 配置中心 http 服務(多語言支持)
Java語言應用,可以直接通過依賴提供的Client包的方式,方便快速的接入和使用配置中心;可參考章節 "二、快速入門":
非Java語言,可藉助 XXL-CONF 提供的 "配置中心http服務",獲取配置、實時感知配置更新,從而實現多語言支持。
配置中心提供的 "配置中心http服務" 只會讀磁盤配置數據,因此性能極高,而且配置中心支持通過集羣無線橫向擴展;
"配置中心http服務" 接口文檔如下:
a、配置批量獲取接口:
說明:用於批量查詢配置數據;
// 接口地址格式
{配置中心跟地址}/conf/find?env={環境}&keys={配置Key}&keys={配置Key02}
// 示例
http://localhost:8080/xxl-conf-admin/conf/find?env=test&keys=default.key01&keys=default.key02
// 請求參數:get/post方式均可
accessToken : 配置中心接入驗證TOKEN,選填,非空時啓用,進行安全嚴重
env : 環境配置,必填;如"test、ppe、product"等,指定配置加載環境;
keys : 配置Key,支持傳遞多個,
// 響應數據格式:
{
"code": 200, // 200 表示正常、其他失敗
"msg": null, // 錯誤提示消息
"data": { // 配置信息,KV格式
"default.key02": "22",
"default.key01": "111"
}
}
b、配置實時監控接口:
說明:用於實時監控配置數據更新,爲 long-polling 接口,請求後將會立即阻塞,期間如若參數中配置Key有變動則立即響應通知請求方,否則將會一直阻塞,默認阻塞30s;
// 接口地址格式
{配置中心跟地址}/conf/monitor?env={環境}&keys={配置Key}&keys={配置Key02}
// 示例
http://localhost:8080/xxl-conf-admin/conf/monitor?env=test&keys=default.key01&keys=default.key02
// 請求參數:get/post方式均可
accessToken : 配置中心接入驗證TOKEN,選填,非空時啓用,進行安全嚴重
env : 環境配置,必填;如"test、ppe、product"等,指定配置加載環境;
keys : 配置Key,支持傳遞多個,
// 響應數據格式:
{
"code": 501, // 200 表示正常,一直阻塞到結束,說明配置數據沒變動;501 表示配置數據有變化;其他標示請求失敗
"msg": "Monitor key update." // 錯誤提示消息
}
接入方可以藉助上面兩個接口,獲取配置、實時感知配置更新;
5.5 配置快照功能
客戶端從配置中心獲取到的配置數據後,會週期性緩存到本地快照文件中,當從配置中心獲取配置失敗時,將會使用使用本地快照文件中的配置數據;提高系統可用性;
5.6 多環境支持
單個配置中心集羣,支持自定義多套環境,管理多個環境的的配置數據;環境之間相互隔離;
此處給出一些多環境配置的建議:
- 機器資源緊缺、系統規模較小時:建議部署單個配置中心集羣,比如部署 "配置中心集羣",通過定義多套環境,如 "dev、test、ppe、product" 隔離不同環境配置數據;優點是,可以同享配置中心資源;
- 機器資源充足、系統規模較大時:建議部署多個配置中心集羣,比如部署 "配置中心集羣A",定義環境 "ppe、product";部署 "配置中心集羣B",定義環境 "dev、test"等;優點是,可以避免多個集羣相互影響;
5.7 對象代理情況下配置獲取
在配置所屬對象存在代理(JDK、CGLib)的特殊情況下,推薦使用以下方式獲取配置:(非代理情況下,可以忽略本章節)
- 1、採用“API方式”獲取配置:最穩定的配置獲取方式,API方式底層存在Local Cache不必擔心性能問題;
- 2、爲配置屬性添加 get、set 方法,不要直接訪問配置屬性,而是通過配置屬性相應的 get 方法獲取;
5.8 容災性
XXL-CONF擁有極高的容災性,首先配置數據進行多級存儲, 可分爲以下幾層:
- DB:完整的配置數據存儲在數據庫中,極大的方便配置數據的備份與遷移;
- 配置中心磁盤:配置中心在每個配置中心集羣節點磁盤中維護一份鏡像數據,並實時同步更新;
- Client-鏡像文件:接入配置中心的客戶端應用會自動對使用的配置生成鏡像文件,遠程配置中心故障時降級實用鏡像文件;
- Client-LocalCache:接入配置中心的客戶端引用,優先使用LocalCache內存中的配置數據,提高性能的同時,降低對底層配置服務的壓力;
- Client-Api:最後暴露給業務的API,用戶可具體加載配置數據,完成業務;
鑑於以上基礎,在配置服務故障時,可以快速進行配置服務降級與恢復:
- 配置中心宕機時:對業務系統無影響,業務系統從配置中心磁盤與Client端鏡像文件中獲取配置數據;
- DB宕機:對業務系統無影響,業務系統從配置中心磁盤與Client端鏡像文件中獲取配置數據;
- 配置中心宕機 + DB宕機 + Client端鏡像文件被刪除:此時,只需要手動創建一份配置鏡像文件,上傳到Client端應用指定位置即可,業務無影響;
5.9 跨機房(異地多活)
得益於配置中心集羣關係對等特性,集羣各節點提供冪等的配置服務;因此,異地跨機房部署時,只需要請求本機房配置中心即可,實現異地多活;
舉個例子:比如機房A、B 內分別部署配置中心集羣節點。即機房A部署 a1、a2 兩個配置中心服務節點,機房B部署 b1、b2 兩個配置中心服務節點;
那麼各機房內應用只需要請求本機房內部署的配置中心節點即可,不需要跨機房調用。即機房A內業務應用請求 a1、a2 獲取配置、機房B內業務應用 b1、b2 獲取配置。
這種跨機房部署方式實現了配置服務的 "異地多活",擁有以下幾點好處:
- 1、配置服務加載更快:配置請求本機房內搞定;
- 2、配置服務更穩定:配置請求不需要跨機房,不需要考慮複雜的網絡情況,更加穩定;
- 2、容災性:即使一個機房內配置中心全部宕機,僅會影響到本機房內應用加載服務,其他機房不會受到影響。
六、歷史版本
6.1 版本 v1.0.0 特性[2015-11-13]
- 初始版本導入;
6.2 版本 v1.1.0 特性[2016-08-17]
- 1、簡單易用: 上手非常簡單, 只需要引入maven依賴和一行配置即可;
- 2、在線管理: 提供配置中心, 支持在線管理配置信息;
- 3、實時推送: 配置信息更新後, Zookeeper實時推送配置信息, 項目中配置數據會實時更新並生效, 不需要重啓線上機器;
- 4、高性能: 系統會對Zookeeper推送的配置信息, 在Encache中做本地緩存, 在接受推送更新或者緩存失效時會及時更新緩存數據, 因此業務中對配置數據的查詢並不存在性能問題;
- 5、配置備份: 配置數據首先會保存在Zookeeper中, 同時, 在MySQL中會對配置信息做備份, 保證配置數據的安全性;
- 6、HA: 配置中心基於Zookeeper集羣, 只要集羣節點保證存活數量大於N/2+1, 就可保證服務穩定, 避免單點風險;
- 7、分佈式: 可方便的接入線上分佈式部署的各個業務線, 統一管理配置信息;
- 8、配置共享: 平臺中的配置信息針對各個業務線是平等的, 各個業務線可以共享配置中心的配置信息, 當然也可以配置業務內專屬配置信息;
6.3 版本 v1.2.0 新特性[2016-10-08]
- 1、配置分組: 支持對配置進行分組管理, 每條配置將會生成全局唯一標示GroupKey,在client端使用時,需要通過該值匹配對應的配置信息;
6.4 版本 v1.3.0 新特性[2016-10-08]
- 1、支持在線維護配置分組;
- 2、項目groupId從com.xxl遷移至com.xuxueli,爲推送maven中央倉庫做準備;
- 3、v1.3.0版本開始,推送公共依賴至中央倉庫;
6.5 版本 v1.3.1-beta 新特性[2017-08-10]
- 1、本地配置優先加載邏輯調整;
- 2、zookeeper地址方式從磁盤遷移至項目內;
6.6 版本 v1.3.1-beta2 新特性[2017-08-19]
- 1、配置文件統一問題fix;
6.7 版本 v1.4.0 新特性[2018-03-02]
- 1、支持通過 "@XxlConf" 註解獲取配置;
- 2、動態推送更新:目前支持 "XML、 @XxlConf、API" 三種配置方式,均支持配置動態刷新;
- 3、配置變更監聽功能:可開發Listener邏輯,監聽配置變更事件,可據此動態刷新JDBC連接池等高級功能;
- 4、用戶管理:支持在線添加和維護用戶,包括普通用戶和管理員兩種類型用戶;
- 5、配置權限控制;以項目爲維度進行配置權限控制,管理員擁有全部項目權限,普通用戶只有分配才擁有項目下配置的查看和管理權限;
- 6、配置變更版本記錄:記錄配置變更歷史,方便歷史配置版本回溯,默認記錄10個歷史版本;
- 7、客戶端斷線重連強化,除了依賴ZK之外,新增守護線程,週期性刷新Local Cache中配置數據並watch,進一步提高配置時效性;
- 8、ZK過期重連時,主動刷新LocalCache中配置數據,提高異常情況下配置時效性;
- 9、ZK重入鎖做二次校驗,防止併發衝突;
- 10、主動緩存null或不存在類型配置,避免配置請求穿透到ZK引發雪崩問題;
- 11、Local Cache緩存長度固定爲1000,採用LRU策略移除。
- 12、表結構優化;
- 13、重構核心代碼,規範代碼結構;
- 14、環境配置文件,支持自定義存放位置,項目resource下或磁盤目錄下均可;
- 15、支持設置ZK中配置存儲路徑,方便實現多環境複用ZK集羣;
- 16、用戶在線修改密碼;
- 17、升級依賴版本,如Ehcache、Spring等;
- 18、彈框插件改爲使用Layui;
- 19、AdminLTE版本升級;
- 20、Sample項目目錄結構規範;
- 21、新增SpringBoot類型Sample項目;
6.8 版本 v1.4.1 新特性[2018-04-12]
- 1、Ehcache緩存對象CacheNode序列化優化;
- 2、XML配置方式,Bean初始化時配置加載邏輯優化;
- 3、升級多項依賴至較新版本:spring、spring-boot、jackson、freemarker、mybatis等;
6.9 版本 v1.4.2 新特性[2018-05-30]
- 1、多環境支持:單個配置中心集羣,支持自定義多套環境,管理多個環境的的配置數據;環境之間相互隔離;
- 2、多數據類型配置:支持多種數據類型配置,如:String、Boolean、Short、Integer、Long、Float、Double 等;
- 3、多語言支持:提供配置Agent服務,可據此通過Http獲取配置數據,從而實現多語言支持。Agent存在Ehcache緩存性能極高,並且支持集羣橫向擴展;
- 4、新增 "Jfinal" 類型Sample項目;
- 5、新增 "Nutz" 類型Sample項目;
- 6、支持ZK鑑權信息配置;
- 7、Local Cache緩存長度擴充爲100000,採用LRU過期策略。
- 8、配置數據強制編碼 UTF-8,解決因操作系統編碼格式不一致導致的配置亂碼問題;
- 9、XxlConf與原生配置加載方式( "@Value"、"${...}" )兼容,相互隔離,互不影響;替代原LocalConf層;
- 10、移除Spring強制依賴。在保持對Spring良好支持情況下,提高對非Spring環境的兼容性;
- 11、容器組件初始化順序調整,修復@PostConstruct無法識別問題;
- 12、配置優化,移除冗餘配置項;
- 13、小概率情況下BeanRefresh重複刷新問題修復;
- 14、升級pom依賴至較新版本,如Spring、Zookeeper等;
6.10 版本 v1.5.0 新特性[2018-06-15]
- 1、配置中心Agent服務增強:針對非Java應用提供Agent服務獲取配置,提供同步、異步兩種Http請求方式,原生支持 long-polling(Http) 的方式獲取配置數據、並實時感知配置變更。同時,強化請求權限校驗;
- 2、配置同步功能:將會檢測對應項目下的全部未同步配置項,使用DB中配置數據覆蓋ZK中配置數據並推送更新;在配置中心異常恢復、新配置中心集羣初始化等場景中十分有效;
- 3、配置快照:客戶端從配置中心獲取到的配置數據後,會週期性緩存到本地快照文件中,當從配置中心獲取配置失敗時,將會使用使用本地快照文件中的配置數據;提高系統可用性;
- 4、配置中心,遷移爲spring boot項目;
- 5、配置中心,提供官方docker鏡像;
- 6、Cglib代理情況下,如 "@Configuration" 註解,Bean無法注入配置問題修復;
- 7、springboot項目加載prop失敗的問題修復;
- 8、升級多項maven依賴至較新版本,如spring等;
6.11 版本 v1.5.1 新特性[2018-10-24]
- 1、ftl變量判空問題修復;
- 2、配置快照文件生成時自動創建多層父目錄;
- 3、移除ehcache依賴,取消local cache容量限制;
- 4、ZK初始化邏輯優化,避免併發初始化,阻塞至TCP連接創建成功才允許後續操作;
- 5、升級多項maven依賴至較新版本,如spring等;
6.12 版本 v1.5.2 Release Notes[2018-11-13]
- 1、ZK節點watch邏輯優化,配置中心取消冗餘的watch操作;
- 2、ZK初始化時unlock邏輯調整,優化斷線重連特性;
- 3、Client端ZK初始化邏輯調整,取消對ZK狀態的強依賴,連接失敗也允許啓動,此時使用鏡像配置文件;
- 4、修復配置監聽首次無效的問題,監聽前先get一次該配置;
- 5、新增無框架接入配置中心Sample示例項目 "xxl-conf-sample-frameless"。不依賴第三方框架,快速接入配置中心,只需main方法即可啓動運行;
- 6、權限控制增強,細粒度到環境權限校驗;
6.13 版本 v1.6.0 Release Notes[2018-11-29]
- 1、輕量級改造:廢棄ZK,改爲 "DB + 磁盤 + long polling" 方案,部署更輕量,學習更簡單;集羣部署更方便,與單機一致;
- 2、pom依賴清理、升級;客戶端唯一依賴組件爲 "slf4j-api",徹底的零依賴。配置中心升級部分依賴;
- 3、Docker基礎鏡像切換,精簡鏡像;
- 4、高性能:得益於配置中心的 "磁盤配置" 與客戶端的 "LocalCache",因此配置服務性能非常高;單機可承擔大量配置請求;
- 5、跨語言:底層通過http服務(long-polling)拉取配置數據並實時感知配置變更,從而實現多語言支持。
- 6、訪問令牌(accessToken):爲提升系統安全性,配置中心和客戶端進行安全性校驗,雙方AccessToken匹配才允許通訊;
- 7、啓動時,優先全量加載鏡像數據到registry層,避免逐個請求耗時;
6.14 版本 v1.6.1 Release Notes[迭代中]
TODO LIST
- 本地優先配置:優先加載該配置中數據,常用於本地調試。早期版本功能實用性低,現已移除,考慮是否完全移除;
- 註冊中心特性:原生支持註冊中心功能,強一致性推送註冊信息;
- 分佈式鎖特性:原生支持分佈式鎖功能;
- 支持託管配置文件,properties或yml,待考慮,不利於配置複用與細粒度管理;
- 配置中心告警功能;
- 灰度發佈:將配置推送到指定環境上的指定ip或者指定模塊進程;
- 配置的發佈也可以考慮增加審覈功能;
- XxlConfClient 更名爲 XxlConf。
- 配置告警:底層DB異常時,主動推送告警信息;推送粒度爲管理員還是配置影響用戶,未定;
- 配置列表只展示有權限的項目列表,無有權限項目時限制不允許登陸;
- 配置日誌優化,支持一件回滾與對比:
- 配置鎖:項目粒度,管理員鎖定後,禁止普通用戶直接操作;
- 鎖定Key變更,需要申請和審覈;
- 灰度發佈
- 配置關注:關注Key變更發送郵件通知;
七、其他
7.1 項目貢獻
歡迎參與項目貢獻!比如提交PR修一個bug,或者新建 Issue 討論新特性或者變更。
7.2 用戶接入登記
更多接入的公司,歡迎在 登記地址 登記,登記僅僅爲了產品推廣。
7.3 開源協議和版權
產品開源免費,並且將持續提供免費的社區技術支持。個人或企業內部可自由的接入和使用。
- Licensed under the GNU General Public License (GPL) v3.
- Copyright (c) 2015-present, xuxueli.
捐贈
無論捐贈金額多少都足夠表達您這份心意,非常感謝 :) 前往捐贈