XXL-CONF 是一個輕量級分佈式配置管理平臺,擁有"輕量級、秒級動態推送、多環境、跨語言、跨機房、配置監聽、權限控制、版本回滾"等特性。現已開放源代碼,開箱即用。html
於2015年,我在github上建立XXL-CONF項目倉庫並提交第一個commit,隨之進行系統結構設計,UI選型,交互設計……java
至今,XXL-CONF已接入多家公司的線上產品線,接入場景如電商業務,O2O業務和核心中間件配置動態化等,截止2018-10-24爲止,XXL-CONF已接入的公司包括不限於:mysql
- 一、深圳市綻開工場科技有限公司
- 二、深圳雙猴科技有限公司
- 三、商智神州軟件有限公司
- 四、浙江力太科技
- ……
更多接入的公司,歡迎在 登記地址 登記,登記僅僅爲了產品推廣。git
歡迎你們的關注和使用,XXL-CONF也將擁抱變化,持續發展。github
why not propertiesredis
常規項目開發過程當中, 一般會將配置信息位於在項目resource目錄下的properties文件文件中, 配置信息一般包括有: jdbc地址配置、redis地址配置、活動開關、閾值配置、黑白名單……等等。使用properties維護配置信息將會致使如下幾個問題:spring
why XXL-CONFsql
源碼倉庫地址 | 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>
請下載項目源碼並解壓,獲取 "數據庫初始化SQL腳本(Mysql)" 並執行便可。腳本位置以下:docker
xxl-conf/doc/db/xxl-conf.sql
解壓源碼,按照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版本
項目:xxl-conf-admin
做用:提供一個完善強大的配置管理平臺,包含:環境管理、用戶管理、項目管理、配置管理等功能,所有操做經過Web界面在線完成;
/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
// 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
配置中心支持集羣部署,提升配置中心負載能力和可用性。
配置中心集羣部署時,項目配置文件保持一致便可。
項目:xxl-conf-sample-springboot
做用:接入XXl-CONF的示例項目,供用戶參考學習。這裏以 springboot 版本進行介紹,其餘版本可參考各自sample項目。
<!-- xxl-conf-client -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-conf-core</artifactId>
<version>{最新穩定版}</version>
</dependency>
可參考配置文件:
/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
可參考配置文件:
/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;
}
至此,配置完成。
參考章節 "4.2 配置管理" 添加或更新配置信息;
參考章節 "3、客戶端配置獲取" 獲取配置並接受動態推送更新;
XXL-CONF 提供多種配置方式,包括 "API、 @XxlConf、XML" 等多種配置方式,介紹以下。
可參考項目 "xxl-conf-sample-spring"(接入XXl-CONF的示例項目,供用戶參考學習),代碼位置:com.xxl.conf.sample.controller.IndexController.index()
參考 "IndexController" 代碼以下:
String paramByApi = XxlConfClient.get("default.key01", null);
參考 "DemoConf.paramByAnno" 屬性配置;示例代碼
@XxlConf("default.key02")
public String paramByAnno;
「@XxlConf」註解屬性 | 說明 |
---|---|
value | 配置Key |
defaultValue | 配置爲空時的默認值 |
callback | 配置更新時,是否須要同步刷新配置 |
參考 "applicationcontext-xxl-conf.xml" 中 "DemoConf.paramByXml" 屬性配置;示例代碼以下:
<bean id="demoConf" class="com.xxl.conf.sample.demo.DemoConf">
<property name="paramByXml" value="$XxlConf{default.key03}" />
</bean>
參考以下代碼:
<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>
可開發Listener邏輯,監聽配置變動事件;可據此實現動態刷新JDBC鏈接池等高級功能;
參考 "IndexController" 代碼以下:
XxlConfClient.addListener("default.key01", new XxlConfListener(){
@Override
public void onChange(String key, String value) throws Exception {
logger.info("配置變動事件通知:{}={}", key, value);
}
});
進入 "環境管理" 界面,可自定義和管理環境信息。
單個配置中心集羣,支持自定義多套環境,管理多個環境的的配置數據;環境之間相互隔離;
新增環境:點擊 "新增環境" 按鈕可添加新的環境配置,環境屬性說明以下:
- Env:每一個環境擁有一個維護的Env,做爲環境標識;
- 環境名稱:該環境的名稱;
環境切換:配置中心頂部菜單展現當前操做的配置中心環境,可經過該菜單切換不一樣配置中心環境,從而管理不一樣環境中的配置數據;
進入 "用戶管理" 界面,可查看配置中心中全部用戶信息。
新增用戶:點擊 "新增用戶" 按鈕,可添加新用戶,用戶屬性說明以下:
- 權限:
- 管理員:擁有配置中心全部權限,包括:用戶管理、環境管理、項目管理、配置管理等;
- 普通用戶:僅容許操做本身擁有權限的項目下的配置;
- 用戶名:配置中心登錄帳號
- 密碼:配置中心登錄密碼
系統默認提供了一個管理員用戶和一個普通用戶。
分配項目權限:選中普通用戶,點擊右側 "分配項目權限" 按鈕,可爲用戶分配項目權限,權限細粒度到 "環境 + 項目"。 擁有環境項目權限後,該用戶能夠查看和操做該環境項目下所有配置數據。
修改用戶密碼:配置中心右上角下拉框,點擊 "修改密碼" 按鈕,可修改當前登陸用戶的登陸密碼 (除此以外,管理員用戶,可經過編輯用戶信息功能來修改其餘用戶的登陸密碼);
系統以 "項目" 爲維度進行權限控制,以及配置隔離。可進入 "配置管理界面" 操做和維護項目,項目屬性說明以下:
- AppName:每一個項目擁有惟一的AppName,做爲項目標識,同時做爲該項目下配置的統一前綴;
- 項目名稱:該項目的名稱;
系統默認提供了一個示例項目。
進入"配置管理" 界面, 選擇項目,而後可查看和操做該項目下配置數據。
新增配置:點擊 "新增配置" 按鈕可添加配置數據,配置屬性說明以下:
- KEY:配置的KEY,建立時將會自動添加所屬項目的APPName所謂前綴,生成最終的Key。可經過客戶端使用最終的Key獲取配置;
- 描述:該配置的描述信息;
- VALUE:配置的值;
至此, 一條配置信息已經添加完成;
經過客戶端能夠獲取該配置, 而且支持動態推送更新。
歷史版本回滾:配置存在歷史變動操做時,點擊右側的 "變動歷史" 按鈕,可查看該配置的歷史變動記錄。 包括操做時間、操做人,設置的配置值等歷史數據,所以能夠根據歷史數據,從新編輯配置並回滾到歷史版本;
配置中心由如下幾個核心部分組成:
客戶端基於多層設計,核心四層設計以下:
得益於客戶端的多層設計,以及 LocalCache 和 Mirror-File 等特性,所以業務方能夠在高QPS、高併發場景下使用XXL-CONF的客戶端, 沒必要擔憂併發壓力或配置中心宕機致使系統問題。
Java語言應用,能夠直接經過依賴提供的Client包的方式,方便快速的接入和使用配置中心;可參考章節 "2、快速入門":
非Java語言,可藉助 XXL-CONF 提供的 "配置中心http服務",獲取配置、實時感知配置更新,從而實現多語言支持。
配置中心提供的 "配置中心http服務" 只會讀磁盤配置數據,所以性能極高,並且配置中心支持經過集羣無線橫向擴展;
"配置中心http服務" 接口文檔以下:
說明:查詢配置數據;
------
地址格式:{配置中心跟地址}/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"
}
}
說明: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." // 錯誤提示消息
}
接入方能夠藉助上面兩個接口,獲取配置、實時感知配置更新;
客戶端從配置中心獲取到的配置數據後,會週期性緩存到本地快照文件中,當從配置中心獲取配置失敗時,將會使用使用本地快照文件中的配置數據;提升系統可用性;
單個配置中心集羣,支持自定義多套環境,管理多個環境的的配置數據;環境之間相互隔離;
此處給出一些多環境配置的建議:
在配置所屬對象存在代理(JDK、CGLib)的特殊狀況下,推薦使用如下方式獲取配置:(非代理狀況下,能夠忽略本章節)
XXL-CONF擁有極高的容災性,首先配置數據進行多級存儲, 可分爲如下幾層:
鑑於以上基礎,在配置服務故障時,能夠快速進行配置服務降級與恢復:
得益於配置中心集羣關係對等特性,集羣各節點提供冪等的配置服務;所以,異地跨機房部署時,只須要請求本機房配置中心便可,實現異地多活;
舉個例子:好比機房A、B 內分別部署配置中心集羣節點。即機房A部署 a一、a2 兩個配置中心服務節點,機房B部署 b一、b2 兩個配置中心服務節點;
那麼各機房內應用只須要請求本機房內部署的配置中心節點便可,不須要跨機房調用。即機房A內業務應用請求 a一、a2 獲取配置、機房B內業務應用 b一、b2 獲取配置。
這種跨機房部署方式實現了配置服務的 "異地多活",擁有如下幾點好處:
歡迎參與項目貢獻!好比提交PR修一個bug,或者新建 Issue 討論新特性或者變動。
更多接入的公司,歡迎在 登記地址 登記,登記僅僅爲了產品推廣。
產品開源免費,而且將持續提供免費的社區技術支持。我的或企業內部可自由的接入和使用。
不管捐贈金額多少都足夠表達您這份心意,很是感謝 :) 前往捐贈