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

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

Build Status Docker Status Maven Central GitHub release License donate

1、簡介

1.1 概述

XXL-CONF 是一個輕量級分佈式配置管理平臺,擁有"輕量級、秒級動態推送、多環境、跨語言、跨機房、配置監聽、權限控制、版本回滾"等特性。現已開放源代碼,開箱即用。html

1.2 特性

  • 一、簡單易用: 接入靈活方便,一分鐘上手;
  • 二、輕量級: 部署簡單,不依賴第三方服務,一分鐘上手;
  • 三、配置中心HA:配置中心支持集羣部署,提高配置中心繫統容災和可用性。
  • 四、在線管理: 提供配置中心, 經過Web界面在線操做配置數據,直觀高效;
  • 五、多環境支持:單個配置中心集羣,支持自定義多套環境,管理多個環境的的配置數據;環境之間相互隔離;
  • 六、多數據類型配置:支持多種數據類型配置,如:String、Boolean、Short、Integer、Long、Float、Double 等;
  • 七、跨語言:底層經過http服務(long-polling)拉取配置數據並實時感知配置變動,從而實現多語言支持。
  • 八、跨機房:得益於配置中心集羣關係對等特性,集羣各節點提供冪等的配置服務;所以,異地跨機房部署時,只須要請求本機房配置中心便可,實現異地多活;
  • 九、高性能:得益於配置中心的 "磁盤配置" 與客戶端的 "LocalCache",所以配置服務性能很是高;單機可承擔大量配置請求;
  • 十、實時性: 秒級動態推送;配置更新後, 實時推送配置信息, 項目中配置數據會實時更新並生效, 不須要重啓線上機器;
  • 十一、配置變動監聽功能:可開發Listener邏輯,監聽配置變動事件,可據此動態刷新JDBC鏈接池等高級功能;
  • 十二、最終一致性:底層藉助內置廣播機制,保障配置數據的最終一致性,從而保證配置數據的同步;
  • 1三、配置備份: 配置數據同時在磁盤與MySQL中存儲和備份,並按期同步, 提升配置數據的安全性;
  • 1四、多種獲取配置方式:支持 "API、 註解、XML佔位符" 等多種方式獲取配置,可靈活選擇使用;
  • 1五、兼容Spring原生配置:兼容Spring原生配置方式 "@Value"、"${}" 加載本地配置功能;與分佈式配置獲取方式隔離,互不干擾;
  • 1六、分佈式: 支持多業務線接入並統一管理配置信息,支撐分佈式業務場景;
  • 1七、項目隔離: 以項目爲維度管理配置, 方便隔離不一樣業務線配置;
  • 1八、高性能: 經過LocalCache對配置數據作緩存, 提升性能;
  • 1九、客戶端斷線重連強化:設置守護線程,週期性檢測客戶端鏈接、配置同步,提升異常狀況下配置穩定性和時效性;
  • 20、空配置處理:主動緩存null或不存在類型配置,避免配置請求穿透到遠程配置Server引起雪崩問題;
  • 2一、用戶管理:支持在線添加和維護用戶,包括普通用戶和管理員兩種類型用戶;
  • 2二、配置權限控制;以項目爲維度進行配置權限控制,管理員擁有所有項目權限,普通用戶只有分配才擁有項目下配置的查看和管理權限;
  • 2三、歷史版本回滾:記錄配置變動歷史,方便歷史配置版本回溯,默認記錄10個歷史版本;
  • 2四、配置快照:客戶端從配置中心獲取到的配置數據後,會週期性緩存到本地快照文件中,當從配置中心獲取配置失敗時,將會使用使用本地快照文件中的配置數據;提升系統可用性;
  • 2五、訪問令牌(accessToken):爲提高系統安全性,配置中心和客戶端進行安全性校驗,雙方AccessToken匹配才容許通信;

1.3 發展

於2015年,我在github上建立XXL-CONF項目倉庫並提交第一個commit,隨之進行系統結構設計,UI選型,交互設計……java

至今,XXL-CONF已接入多家公司的線上產品線,接入場景如電商業務,O2O業務和核心中間件配置動態化等,截止2018-10-24爲止,XXL-CONF已接入的公司包括不限於:mysql

- 一、深圳市綻開工場科技有限公司
- 二、深圳雙猴科技有限公司
- 三、商智神州軟件有限公司
- 四、浙江力太科技
- ……

更多接入的公司,歡迎在 登記地址 登記,登記僅僅爲了產品推廣。git

歡迎你們的關注和使用,XXL-CONF也將擁抱變化,持續發展。github

1.4 背景

why not propertiesredis

常規項目開發過程當中, 一般會將配置信息位於在項目resource目錄下的properties文件文件中, 配置信息一般包括有: jdbc地址配置、redis地址配置、活動開關、閾值配置、黑白名單……等等。使用properties維護配置信息將會致使如下幾個問題:spring

  • 一、須要手動修改properties文件;
  • 二、須要從新編譯打包;
  • 三、須要重啓線上服務器 (項目集羣時,更加使人崩潰) ;
  • 四、配置生效不及時: 由於流程複雜, 新的配置生效須要經歷比較長的時間才能夠生效;
  • 五、不一樣環境上線包不一致: 例如JDBC鏈接, 不一樣環境須要差別化配置;

why XXL-CONFsql

  • 一、不須要 (手動修改properties文件) : 在配置中心提供的Web界面中, 定位到指定配置項, 輸入新的配置的值, 點擊更新按鈕便可;
  • 二、不須要 (從新編譯打包) : 配置更新後, 實時推送新配置信息至項目中, 不須要編譯打包;
  • 三、不須要 (重啓線上服務器) : 配置更新後, 實時推送新配置信息至項目中, 實時生效, 不須要重啓線上機器; (在項目集羣部署時, 將會節省大量的時間, 避免了集羣機器一個一個的重啓, 費時費力)
  • 四、配置生效 "很是及時" : 點擊更新按鈕, 新的配置信息將會便可推送到項目中, 瞬間生效, 很是及時。好比一些開關類型的配置, 配置變動後, 將會馬上推送至項目中並生效, 相對常規配置修改繁瑣的流程, 及時性可謂天壤之別;
  • 五、不一樣環境 "同一個上線包" : 由於差別化的配置託管在配置中心, 所以一個上線包能夠複用在生產、測試等各個運行環境, 提供能效;

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、快速入門

2.1 環境準備

初始化「數據庫」

請下載項目源碼並解壓,獲取 "數據庫初始化SQL腳本(Mysql)" 並執行便可。腳本位置以下:docker

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" 指定,參數格式 RAMS="--key=value  --key2=value2" ;
* 配置項參考文件:/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、獲取配置並接受動態推送更新

參考章節 "3、客戶端配置獲取" 獲取配置並接受動態推送更新;

3、客戶端配置獲取

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、管理中心操做指南

4.一、環境管理

進入 "環境管理" 界面,可自定義和管理環境信息。
單個配置中心集羣,支持自定義多套環境,管理多個環境的的配置數據;環境之間相互隔離;

輸入圖片說明

新增環境:點擊 "新增環境" 按鈕可添加新的環境配置,環境屬性說明以下:

- Env:每一個環境擁有一個維護的Env,做爲環境標識;
- 環境名稱:該環境的名稱;

輸入圖片說明

環境切換:配置中心頂部菜單展現當前操做的配置中心環境,可經過該菜單切換不一樣配置中心環境,從而管理不一樣環境中的配置數據;

輸入圖片說明

4.二、用戶(權限)管理

進入 "用戶管理" 界面,可查看配置中心中全部用戶信息。 輸入圖片說明

新增用戶:點擊 "新增用戶" 按鈕,可添加新用戶,用戶屬性說明以下:

- 權限:
    - 管理員:擁有配置中心全部權限,包括:用戶管理、環境管理、項目管理、配置管理等;
    - 普通用戶:僅容許操做本身擁有權限的項目下的配置;
- 用戶名:配置中心登錄帳號
- 密碼:配置中心登錄密碼

系統默認提供了一個管理員用戶和一個普通用戶。

輸入圖片說明

分配項目權限:選中普通用戶,點擊右側 "分配項目權限" 按鈕,可爲用戶分配項目權限,權限細粒度到 "環境 + 項目"。 擁有環境項目權限後,該用戶能夠查看和操做該環境項目下所有配置數據。

輸入圖片說明

修改用戶密碼:配置中心右上角下拉框,點擊 "修改密碼" 按鈕,可修改當前登陸用戶的登陸密碼 (除此以外,管理員用戶,可經過編輯用戶信息功能來修改其餘用戶的登陸密碼);

輸入圖片說明

4.三、項目管理

系統以 "項目" 爲維度進行權限控制,以及配置隔離。可進入 "配置管理界面" 操做和維護項目,項目屬性說明以下:

- AppName:每一個項目擁有惟一的AppName,做爲項目標識,同時做爲該項目下配置的統一前綴;
- 項目名稱:該項目的名稱;

系統默認提供了一個示例項目。

輸入圖片說明

4.4 配置管理

進入"配置管理" 界面, 選擇項目,而後可查看和操做該項目下配置數據。

輸入圖片說明

新增配置:點擊 "新增配置" 按鈕可添加配置數據,配置屬性說明以下:

- KEY:配置的KEY,建立時將會自動添加所屬項目的APPName所謂前綴,生成最終的Key。可經過客戶端使用最終的Key獲取配置;
- 描述:該配置的描述信息;
- VALUE:配置的值;

輸入圖片說明

至此, 一條配置信息已經添加完成;
經過客戶端能夠獲取該配置, 而且支持動態推送更新。

歷史版本回滾:配置存在歷史變動操做時,點擊右側的 "變動歷史" 按鈕,可查看該配置的歷史變動記錄。 包括操做時間、操做人,設置的配置值等歷史數據,所以能夠根據歷史數據,從新編輯配置並回滾到歷史版本;

輸入圖片說明

5、整體設計

5.1 架構圖

輸入圖片說明

5.2 "配置中心" 設計

配置中心由如下幾個核心部分組成:

  • 一、管理平臺:提供一個完善強大的配置管理平臺,包含:環境管理、用戶管理、項目管理、配置管理等功能,所有操做經過Web界面在線完成;
  • 二、管理平臺DB:存儲配置信息備份、配置的版本變動信息等,進一步保證數據的安全性;同時也存儲"管理平臺"中多個模塊的底層數據;
  • 三、磁盤配置數據:配置中心在每一個配置中心集羣節點磁盤中維護一份鏡像數據,當配置新增、更新等操做時,將會廣播通知並實時刷新每一個集羣節點磁盤中的配置數據, 最終實時通知接入方客戶端;
  • 四、客戶端:可參考章節 "5.3 客戶端 設計" ;

5.3 "客戶端" 設計

輸入圖片說明

客戶端基於多層設計,核心四層設計以下:

  • 一、API層:提供業務方可直接使用的上層API, 簡單易用, 一行代碼獲取配置信息;同時保證配置的實時性、高性能;
  • 二、LocalCache層:客戶端的Local Cache,極大提高API層的性能,下降對配置中心集羣的壓力;首次加載配置、監聽配置變動、底層異步週期性同步配置時,將會寫入或更新緩存;
  • 四、Mirror-File層:配置數據的本地快照文件,會週期性同步 "LocalCache層" 中的配置數據寫入到 "Mirror-File" 中;當沒法從配置中心獲取配置,如配置中心宕機時,將會使用 "Mirror-File" 中的配置數據,提升系統的可用性;
  • 三、Remote層:配置中心遠程客戶端的封裝,用於加載遠程配置、實時監聽配置變動,提升配置時效性;

得益於客戶端的多層設計,以及 LocalCache 和 Mirror-File 等特性,所以業務方能夠在高QPS、高併發場景下使用XXL-CONF的客戶端, 沒必要擔憂併發壓力或配置中心宕機致使系統問題。

5.4 配置中心 http 服務(多語言支持)

Java語言應用,能夠直接經過依賴提供的Client包的方式,方便快速的接入和使用配置中心;可參考章節 "2、快速入門":

非Java語言,可藉助 XXL-CONF 提供的 "配置中心http服務",獲取配置、實時感知配置更新,從而實現多語言支持。

配置中心提供的 "配置中心http服務" 只會讀磁盤配置數據,所以性能極高,並且配置中心支持經過集羣無線橫向擴展;

"配置中心http服務" 接口文檔以下:

a、配置批量獲取接口:

說明:查詢配置數據;

------

地址格式:{配置中心跟地址}/find

請求參數說明:
 一、accessToken:請求令牌;
 二、env:環境標識
 三、keys:配置Key列表
 
請求數據格式以下,放置在 RequestBody 中,JSON格式:
    {
        "accessToken" : "xx",
        "env" : "xx",
        "keys" : [
            "key01",
            "key02"
        ]
    }

// 響應數據格式:
{
  "code": 200,      // 200 表示正常、其餘失敗
  "msg": null,      // 錯誤提示消息
  "data": {         // 配置信息,KV格式
    "key01": "22",
    "key02": "111"
  }
}

b、配置實時監控接口:

說明:long-polling 接口,主動阻塞一段時間(默認30s);直至阻塞超時或配置信息變更時響應;

------

地址格式:{配置中心跟地址}/find

請求參數說明:
 一、accessToken:請求令牌;
 二、env:環境標識
 三、keys:配置Key列表
 
請求數據格式以下,放置在 RequestBody 中,JSON格式:
    {
        "accessToken" : "xx",
        "env" : "xx",
        "keys" : [
            "key01",
            "key02"
        ]
    }

響應數據格式:
{
  "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)的特殊狀況下,推薦使用如下方式獲取配置:(非代理狀況下,能夠忽略本章節)

  • 一、採用「API方式」獲取配置:最穩定的配置獲取方式,API方式底層存在Local Cache沒必要擔憂性能問題;
  • 二、爲配置屬性添加 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部署 a一、a2 兩個配置中心服務節點,機房B部署 b一、b2 兩個配置中心服務節點;

那麼各機房內應用只須要請求本機房內部署的配置中心節點便可,不須要跨機房調用。即機房A內業務應用請求 a一、a2 獲取配置、機房B內業務應用 b一、b2 獲取配置。

這種跨機房部署方式實現了配置服務的 "異地多活",擁有如下幾點好處:

  • 一、配置服務加載更快:配置請求本機房內搞定;
  • 二、配置服務更穩定:配置請求不須要跨機房,不須要考慮複雜的網絡狀況,更加穩定;
  • 二、容災性:即便一個機房內配置中心所有宕機,僅會影響到本機房內應用加載服務,其餘機房不會受到影響。

6、歷史版本

6.1 版本 v1.0.0 特性[2015-11-13]

  • 初始版本導入;

6.2 版本 v1.1.0 特性[2016-08-17]

  • 一、簡單易用: 上手很是簡單, 只須要引入maven依賴和一行配置便可;
  • 二、在線管理: 提供配置中心, 支持在線管理配置信息;
  • 三、實時推送: 配置信息更新後, Zookeeper實時推送配置信息, 項目中配置數據會實時更新並生效, 不須要重啓線上機器;
  • 四、高性能: 系統會對Zookeeper推送的配置信息, 在Encache中作本地緩存, 在接受推送更新或者緩存失效時會及時更新緩存數據, 所以業務中對配置數據的查詢並不存在性能問題;
  • 五、配置備份: 配置數據首先會保存在Zookeeper中, 同時, 在MySQL中會對配置信息作備份, 保證配置數據的安全性;
  • 六、HA: 配置中心基於Zookeeper集羣, 只要集羣節點保證存活數量大於N/2+1, 就可保證服務穩定, 避免單點風險;
  • 七、分佈式: 可方便的接入線上分佈式部署的各個業務線, 統一管理配置信息;
  • 八、配置共享: 平臺中的配置信息針對各個業務線是平等的, 各個業務線能夠共享配置中心的配置信息, 固然也能夠配置業務內專屬配置信息;

6.3 版本 v1.2.0 新特性[2016-10-08]

  • 一、配置分組: 支持對配置進行分組管理, 每條配置將會生成全局惟一標示GroupKey,在client端使用時,須要經過該值匹配對應的配置信息;

6.4 版本 v1.3.0 新特性[2016-10-08]

  • 一、支持在線維護配置分組;
  • 二、項目groupId從com.xxl遷移至com.xuxueli,爲推送maven中央倉庫作準備;
  • 三、v1.3.0版本開始,推送公共依賴至中央倉庫;

6.5 版本 v1.3.1-beta 新特性[2017-08-10]

  • 一、本地配置優先加載邏輯調整;
  • 二、zookeeper地址方式從磁盤遷移至項目內;

6.6 版本 v1.3.1-beta2 新特性[2017-08-19]

  • 一、配置文件統一問題fix;

6.7 版本 v1.4.0 新特性[2018-03-02]

  • 一、支持經過 "@XxlConf" 註解獲取配置;
  • 二、動態推送更新:目前支持 "XML、 @XxlConf、API" 三種配置方式,均支持配置動態刷新;
  • 三、配置變動監聽功能:可開發Listener邏輯,監聽配置變動事件,可據此動態刷新JDBC鏈接池等高級功能;
  • 四、用戶管理:支持在線添加和維護用戶,包括普通用戶和管理員兩種類型用戶;
  • 五、配置權限控制;以項目爲維度進行配置權限控制,管理員擁有所有項目權限,普通用戶只有分配才擁有項目下配置的查看和管理權限;
  • 六、配置變動版本記錄:記錄配置變動歷史,方便歷史配置版本回溯,默認記錄10個歷史版本;
  • 七、客戶端斷線重連強化,除了依賴ZK以外,新增守護線程,週期性刷新Local Cache中配置數據並watch,進一步提升配置時效性;
  • 八、ZK過時重連時,主動刷新LocalCache中配置數據,提升異常狀況下配置時效性;
  • 九、ZK重入鎖作二次校驗,防止併發衝突;
  • 十、主動緩存null或不存在類型配置,避免配置請求穿透到ZK引起雪崩問題;
  • 十一、Local Cache緩存長度固定爲1000,採用LRU策略移除。
  • 十二、表結構優化;
  • 1三、重構核心代碼,規範代碼結構;
  • 1四、環境配置文件,支持自定義存放位置,項目resource下或磁盤目錄下都可;
  • 1五、支持設置ZK中配置存儲路徑,方便實現多環境複用ZK集羣;
  • 1六、用戶在線修改密碼;
  • 1七、升級依賴版本,如Ehcache、Spring等;
  • 1八、彈框插件改成使用Layui;
  • 1九、AdminLTE版本升級;
  • 20、Sample項目目錄結構規範;
  • 2一、新增SpringBoot類型Sample項目;

6.8 版本 v1.4.1 新特性[2018-04-12]

  • 一、Ehcache緩存對象CacheNode序列化優化;
  • 二、XML配置方式,Bean初始化時配置加載邏輯優化;
  • 三、升級多項依賴至較新版本:spring、spring-boot、jackson、freemarker、mybatis等;

6.9 版本 v1.4.2 新特性[2018-05-30]

  • 一、多環境支持:單個配置中心集羣,支持自定義多套環境,管理多個環境的的配置數據;環境之間相互隔離;
  • 二、多數據類型配置:支持多種數據類型配置,如:String、Boolean、Short、Integer、Long、Float、Double 等;
  • 三、多語言支持:提供配置Agent服務,可據此經過Http獲取配置數據,從而實現多語言支持。Agent存在Ehcache緩存性能極高,而且支持集羣橫向擴展;
  • 四、新增 "Jfinal" 類型Sample項目;
  • 五、新增 "Nutz" 類型Sample項目;
  • 六、支持ZK鑑權信息配置;
  • 七、Local Cache緩存長度擴充爲100000,採用LRU過時策略。
  • 八、配置數據強制編碼 UTF-8,解決因操做系統編碼格式不一致致使的配置亂碼問題;
  • 九、XxlConf與原生配置加載方式( "@Value"、"${...}" )兼容,相互隔離,互不影響;替代原LocalConf層;
  • 十、移除Spring強制依賴。在保持對Spring良好支持狀況下,提升對非Spring環境的兼容性;
  • 十一、容器組件初始化順序調整,修復@PostConstruct沒法識別問題;
  • 十二、配置優化,移除冗餘配置項;
  • 1三、小几率狀況下BeanRefresh重複刷新問題修復;
  • 1四、升級pom依賴至較新版本,如Spring、Zookeeper等;

6.10 版本 v1.5.0 新特性[2018-06-15]

  • 一、配置中心Agent服務加強:針對非Java應用提供Agent服務獲取配置,提供同步、異步兩種Http請求方式,原生支持 long-polling(Http) 的方式獲取配置數據、並實時感知配置變動。同時,強化請求權限校驗;
  • 二、配置同步功能:將會檢測對應項目下的所有未同步配置項,使用DB中配置數據覆蓋ZK中配置數據並推送更新;在配置中心異常恢復、新配置中心集羣初始化等場景中十分有效;
  • 三、配置快照:客戶端從配置中心獲取到的配置數據後,會週期性緩存到本地快照文件中,當從配置中心獲取配置失敗時,將會使用使用本地快照文件中的配置數據;提升系統可用性;
  • 四、配置中心,遷移爲spring boot項目;
  • 五、配置中心,提供官方docker鏡像;
  • 六、Cglib代理狀況下,如 "@Configuration" 註解,Bean沒法注入配置問題修復;
  • 七、springboot項目加載prop失敗的問題修復;
  • 八、升級多項maven依賴至較新版本,如spring等;

6.11 版本 v1.5.1 新特性[2018-10-24]

  • 一、ftl變量判空問題修復;
  • 二、配置快照文件生成時自動建立多層父目錄;
  • 三、移除ehcache依賴,取消local cache容量限制;
  • 四、ZK初始化邏輯優化,避免併發初始化,阻塞至TCP鏈接建立成功才容許後續操做;
  • 五、升級多項maven依賴至較新版本,如spring等;

6.12 版本 v1.5.2 Release Notes[2018-11-13]

  • 一、ZK節點watch邏輯優化,配置中心取消冗餘的watch操做;
  • 二、ZK初始化時unlock邏輯調整,優化斷線重連特性;
  • 三、Client端ZK初始化邏輯調整,取消對ZK狀態的強依賴,鏈接失敗也容許啓動,此時使用鏡像配置文件;
  • 四、修復配置監聽首次無效的問題,監聽前先get一次該配置;
  • 五、新增無框架接入配置中心Sample示例項目 "xxl-conf-sample-frameless"。不依賴第三方框架,快速接入配置中心,只需main方法便可啓動運行;
  • 六、權限控制加強,細粒度到環境權限校驗;

6.13 版本 v1.6.0 Release Notes[2018-11-29]

  • 一、輕量級改造:廢棄ZK,改成 "DB + 磁盤 + long polling" 方案,部署更輕量,學習更簡單;集羣部署更方便,與單機一致;
  • 二、pom依賴清理、升級;客戶端惟一依賴組件爲 "slf4j-api",完全的零依賴。配置中心升級部分依賴;
  • 三、Docker基礎鏡像切換,精簡鏡像;
  • 四、高性能:得益於配置中心的 "磁盤配置" 與客戶端的 "LocalCache",所以配置服務性能很是高;單機可承擔大量配置請求;
  • 五、跨語言:底層經過http服務(long-polling)拉取配置數據並實時感知配置變動,從而實現多語言支持。
  • 六、訪問令牌(accessToken):爲提高系統安全性,配置中心和客戶端進行安全性校驗,雙方AccessToken匹配才容許通信;
  • 七、啓動時,優先全量加載鏡像數據到registry層,避免逐個請求耗時;

6.14 版本 v1.6.1 Release Notes[2018-12-21]

  • 一、在未設置accessToken狀況下,非法請求惡意構造配置Key可遍歷讀取文件漏洞修復;(From:360代碼衛士團隊)
  • 二、項目名正則校驗問題修復,項目名中劃線分隔,配置點分隔;
  • 三、底層HTTP工具類優化;
  • 四、RESTFUL 接口格式調整,改成POST請求,兼容大數據量配置請求;
  • 五、配置Key合法性校驗邏輯優化,非法Key服務端自動過濾,避免阻塞正常配置的查詢加載;
  • 六、升級pom依賴至較新版本;

6.15 版本 v1.6.2 Release Notes[迭代中]

TODO LIST

  • 本地優先配置:優先加載該配置中數據,經常使用於本地調試。早期版本功能實用性低,現已移除,考慮是否徹底移除;
  • 註冊中心特性:原生支持註冊中心功能,強一致性推送註冊信息;
  • 分佈式鎖特性:原生支持分佈式鎖功能;
  • 支持託管配置文件,properties或yml,待考慮,不利於配置複用與細粒度管理;
  • 配置中心告警功能;
  • 灰度發佈:將配置推送到指定環境上的指定ip或者指定模塊進程;
  • 配置的發佈也能夠考慮增長審覈功能;
  • XxlConfClient 改名爲 XxlConf。
  • 配置告警:底層DB異常時,主動推送告警信息;推送粒度爲管理員仍是配置影響用戶,未定;
  • 配置列表只展現有權限的項目列表,無有權限項目時限制不容許登錄;
  • 配置日誌優化,支持一件回滾與對比:
  • 配置鎖:項目粒度,管理員鎖定後,禁止普通用戶直接操做;
  • 鎖定Key變動,須要申請和審覈;
  • 灰度發佈
  • 配置關注:關注Key變動發送郵件通知;
  • 權限粒度細分,支持配置 "管理、查看" 權限;

7、其餘

7.1 項目貢獻

歡迎參與項目貢獻!好比提交PR修一個bug,或者新建 Issue 討論新特性或者變動。

7.2 用戶接入登記

更多接入的公司,歡迎在 登記地址 登記,登記僅僅爲了產品推廣。

7.3 開源協議和版權

產品開源免費,而且將持續提供免費的社區技術支持。我的或企業內部可自由的接入和使用。

  • Licensed under the GNU General Public License (GPL) v3.
  • Copyright (c) 2015-present, xuxueli.

捐贈

不管捐贈金額多少都足夠表達您這份心意,很是感謝 :) 前往捐贈

相關文章
相關標籤/搜索