ConfigKeeper分布式配置中心
ConfigKeeper 是由隨行付架構(gòu)部基于Spring Cloud研發(fā)的分布式配置中心。
在微服務(wù)架構(gòu)中,配置中心是個(gè)必不可少的基礎(chǔ)服務(wù)。應(yīng)用部署到生產(chǎn)環(huán)境后,由于各種原因,需要調(diào)整一些配置。如果每次修改配置都需要經(jīng)過修改代碼、重新打包、重新部署等過程,為了避免重新部署造成請求錯(cuò)誤,還需要將應(yīng)用從負(fù)載均衡中下線,部署成功后再重新上線,當(dāng)部署的實(shí)例比較多的情況下,那就會嚴(yán)重影響投產(chǎn)效率,如果是為了解決生產(chǎn)上的問題而調(diào)整配置,那么這個(gè)過程耗時(shí)越多,帶來的風(fēng)險(xiǎn)也就越大。所以我們需要在不停機(jī)、不重新打包、不重新部署的情況下,可以動態(tài)修改配置(比如:功能開關(guān)、性能參數(shù)等)。為了方便動態(tài)更新應(yīng)用配置,需要把配置放到應(yīng)用執(zhí)行包之外的配置中心。配置文件不需要打進(jìn)應(yīng)用執(zhí)行包中后,可以帶來以下幾個(gè)好處:一個(gè)可執(zhí)行包就可以在不同的環(huán)境下運(yùn)行,可以降低包的版本管理成本,也可以降低docker鏡像的版本管理成本。
Spring cloud 雖然已經(jīng)為我們提供了基于git或mongodb等實(shí)現(xiàn)的配置中心,但是這些方案實(shí)現(xiàn)都過于簡單,沒有達(dá)到實(shí)際可用的標(biāo)準(zhǔn),比如:沒有提供統(tǒng)一的管理頁面,不便于操作和使用;沒有權(quán)限管理功能;沒有數(shù)據(jù)驗(yàn)證功能等等。但Spring cloud config的核心技術(shù)還是可以為我們所有,沒有必要重新造輪子。
ConfigKeeper 是由隨行付架構(gòu)部基于Spring Cloud研發(fā)的分布式配置中心?;赟pring Cloud開發(fā)。與Spring Boot、Spring Cloud應(yīng)用無縫兼容。下面我們將詳細(xì)介紹ConfigKeeper配置中心(有圖有真像):
1. 支持權(quán)限管理,保證數(shù)據(jù)的安全
下圖為用戶管理及權(quán)限設(shè)置界面的截圖:

角色設(shè)計(jì)比較簡單,只有管理員和普通用戶兩種,管理員擁有最高權(quán)限,而普通用戶只能查看和操作為其分配的配置,以保證數(shù)據(jù)的安全。
2. 支持多環(huán)境部署,也支持多環(huán)境配置集中管理

企業(yè)可以根據(jù)自身的情況設(shè)置不同的環(huán)境,比如:測試、rc以及生產(chǎn)環(huán)境??梢远喹h(huán)境共用一個(gè)配置中心,也可以每個(gè)環(huán)境單獨(dú)使用一個(gè)配置中心,根據(jù)企業(yè)需求靈活部署。
3. 配置管理簡單實(shí)用
為了避免配置內(nèi)容耦合問題,我們只設(shè)計(jì)了全局配置(global config)和應(yīng)用配置(application config)兩種類型的配置,并沒有設(shè)計(jì)”組配置“。全局配置是指某一環(huán)境下所有應(yīng)用都能生效的配置,但它的優(yōu)先及低于應(yīng)用配置,一個(gè)運(yùn)行環(huán)境下有且只有一個(gè)全局配置。如果應(yīng)用可執(zhí)行包已經(jīng)有相同的配置,那么會被配置中心的配置所覆蓋。
全局配置列表: 
應(yīng)用配置列表: 
3.1 自帶版本管理功能:自動生成版本號以及回退功能
配置內(nèi)容每修改一次,版本號會自動增加1,同時(shí)會將原來配置內(nèi)容備份到歷史表中,以便于查看變更記錄和回退。

點(diǎn)擊“對比”可以當(dāng)前版本與最新版本進(jìn)行比較,非常容易看出版本之間的差異部分,就好像使用git等版本管理工具一樣:

通過替換歷史版本功能,進(jìn)行回退。
3.2 使用Yml在線編輯器,能實(shí)時(shí)檢查配置格式是否正確;

為了更好管理配置內(nèi)容,我們使用YAML格式管理配置內(nèi)容。
使用Yml在線編輯器,可以非常方便編輯,比如:復(fù)制粘貼內(nèi)容,就像在修改配置文件一樣。當(dāng)用戶編輯內(nèi)容時(shí),會實(shí)時(shí)檢查格式是否符合yaml格式時(shí),如果格式是正確的,右則會正確顯示其對應(yīng)的json內(nèi)容,如果格式不正確則,右則會提示相應(yīng)的錯(cuò)誤信息,能及時(shí)發(fā)現(xiàn)錯(cuò)誤。
3.3 支持修改前后內(nèi)容對比功能,保證修改內(nèi)容的正確性

在保存修改內(nèi)容之前會彈出此對比界面,方便確認(rèn)核對此次變更的內(nèi)容是否正確,確認(rèn)無誤后再點(diǎn)擊“確定”按鈕保存。
4. 客戶端使用簡單并兼容Spring Boot和Spring Cloud應(yīng)用
配置中心提供http接口拉取配置,所以只要支持http協(xié)議的應(yīng)用都是可以使用的。我們已經(jīng)實(shí)現(xiàn)了Spring Boot和Spring Cloud應(yīng)用的客戶端,接下來說明其一些特性及使用方法。
4.1 無縫兼容Spring boot、Spring Cloud應(yīng)用
suixingpay-config-client 是基于spring-cloud開發(fā)的,所以使用方法與spring-cloud-config完全一樣。支持xml、Spring boot @Value、@ConfigurationProperties 注入配置,支持通過Environment獲取配置。支持 spring-cloud 的 @RefreshScope 注解刷新配置。
只需要在項(xiàng)目是加入suixingpay-config-client依賴,并在bootstrap.yml文件中增加如下配置:
spring:
application:
name: config-demo # 設(shè)置應(yīng)用名稱,這是必填項(xiàng)
profiles:
active: ${profile:dev}
#多環(huán)境區(qū)分配置
---
spring:
profiles: test
suixingpay:
config:
enabled: true # 是否啟用配置中心,默認(rèn)值為:true;為了方便開發(fā),建議開發(fā)環(huán)境設(shè)置為false
profile: test # 環(huán)境名稱,默認(rèn)值為spring.profiles.active的第1個(gè)值
uris:
- http://127.0.0.1:8080/ # 配置中心服務(wù)地址,必須配置
username: admin # 調(diào)用接口用戶名(非配置中心登錄的用戶名和密碼)
password: 123456 # 調(diào)用接口密碼
cachePath: ./config # 配置緩存路徑,默認(rèn)值為:./config
cacheTimeOut: 0 # 本地緩存過期時(shí)間(單位:秒),如果小于等于0時(shí),一直有效
failFast: false # 是否快速失敗,如果為true時(shí),當(dāng)訪問配置中心時(shí)立即拋異常;如果為false時(shí),會嘗試加載3次,并會嘗試獲取本地緩存,最終還沒有配置,才會拋異常。默認(rèn)值:false
下面舉個(gè)Spring xml文件中獲取讀取配置值的例子:
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<dubbo:application name="${spring.application.name}" />
<dubbo:registry protocol="${dubbo.registryProtocol}" address="${dubbo.zookeeperAddress}" />
<dubbo:protocol name="${dubbo.protocolName}" port="${dubbo.protocolPort}" />
... ...
</beans>
關(guān)于@Value、@ConfigurationProperties及@RefreshScope的使用就不再一一舉例子,更多內(nèi)容可以參考Spring 官方文檔。
4.3 支持灰度發(fā)布
為了支持灰度發(fā)布,suixingpay-config-client并實(shí)現(xiàn)沒有自動刷新配置的功能,而是通過使用Spring cloud提供的refresh endpoint進(jìn)行手動刷新,因?yàn)楫?dāng)配置變更后,沒有經(jīng)過驗(yàn)證就將最新配置推送給所有應(yīng)用,風(fēng)險(xiǎn)是非常之大的。正確的做法是,修改配置內(nèi)容后,先將最新配置內(nèi)容刷新到一個(gè)應(yīng)用實(shí)例進(jìn)行驗(yàn)證,驗(yàn)證無誤后,再刷新剩余的應(yīng)用。
現(xiàn)有版本還沒有方便刷新配置的相關(guān)工具,需要借助curl或postmain等工具來完成,我們正在開發(fā)相應(yīng)的功能來提升這塊的用戶體驗(yàn),大家可以關(guān)注github中的更新。
4.4 支持客戶端緩存,即使配置中心服務(wù)不可用,也不會影響應(yīng)用的啟動
客戶端從配置中心獲取最新配置后,會緩存到本地磁盤中,應(yīng)用啟動時(shí),先獲取本地緩存中的配置版本號,發(fā)送給配置中心,如果客戶端版本號與服務(wù)端的不一致時(shí),才會拉取最新配置,否則返回304狀態(tài),并使用本地緩存,通過這個(gè)機(jī)制可以節(jié)約網(wǎng)絡(luò)帶寬,從而也提升一點(diǎn)性能;同時(shí)我們還提供 configversion endpoint 用于查看當(dāng)前應(yīng)用配置的本地緩存版本信息,通過它也很容易檢查客戶端的配置的版本與服務(wù)端的版本是否一致,能方便發(fā)現(xiàn)配置是否更新成功。
我們還可以使用spring boot提供的env及configprops endpoint 查看配置內(nèi)容,檢查配置是否生效、是否正確。
Spring 生態(tài)功能非常豐富,為我們解決了非常多棘手問題,但很多東西要進(jìn)行本地化開發(fā)后才能更好的使用。此配置中心使用了不少開源技術(shù),給我們帶來了不少便利,希望通過此開源項(xiàng)目回饋社區(qū),為開源社區(qū)貢獻(xiàn)綿薄之力。希望了解隨行付更多開源項(xiàng)目請查看:
