分佈式配置管理平臺XXL-CONF 原 薦

《分佈式配置管理平臺XXL-CONF》

Build Status Docker Status Maven Central GitHub release License donate

一、簡介

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-confDownload
http://gitee.com/xuxueli0323/xxl-confDownload

中央倉庫地址

<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.

捐贈

無論捐贈金額多少都足夠表達您這份心意,非常感謝 :) 前往捐贈

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章