天天看點

基于 Spring Cloud 的分布式配置中心

ConfigKeeper 是由随行付架構部基于Spring Cloud研發的分布式配置中心。

在微服務架構中,配置中心是個必不可少的基礎服務。應用部署到生産環境後,由于各種原因,需要調整一些配置。如果每次修改配置都需要經過修改代碼、重新打包、重新部署等過程,為了避免重新部署造成請求錯誤,還需要将應用從負載均衡中下線,部署成功後再重新上線,當部署的執行個體比較多的情況下,那就會嚴重影響投産效率,如果是為了解決生産上的問題而調整配置,那麼這個過程耗時越多,帶來的風險也就越大。是以我們需要在不停機、不重新打包、不重新部署的情況下,可以動态修改配置(比如:功能開關、性能參數等)。為了友善動态更新應用配置,需要把配置放到應用執行包之外的配置中心。配置檔案不需要打進應用執行包中後,可以帶來以下幾個好處:一個可執行包就可以在不同的環境下運作,可以降低包的版本管理成本,也可以降低docker鏡像的版本管理成本。

Spring cloud 雖然已經為我們提供了基于git或mongodb等實作的配置中心,但是這些方案實作都過于簡單,沒有達到實際可用的标準,比如:沒有提供統一的管理頁面,不便于操作和使用;沒有權限管理功能;沒有資料驗證功能等等。但Spring cloud config的核心技術還是可以為我們所有,沒有必要重新造輪子。

ConfigKeeper 是由随行付架構部基于Spring Cloud研發的分布式配置中心。基于Spring Cloud開發。與Spring Boot、Spring Cloud應用無縫相容。下面我們将詳細介紹ConfigKeeper配置中心(有圖有真像):

1. 支援權限管理,保證資料的安全

下圖為使用者管理及權限設定界面的截圖:

基于 Spring Cloud 的分布式配置中心

角色設計比較簡單,隻有管理者和普通使用者兩種,管理者擁有最高權限,而普通使用者隻能檢視和操作為其配置設定的配置,以保證資料的安全。

2. 支援多環境部署,也支援多環境配置集中管理

基于 Spring Cloud 的分布式配置中心

企業可以根據自身的情況設定不同的環境,比如:測試、rc以及生産環境。可以多環境共用一個配置中心,也可以每個環境單獨使用一個配置中心,根據企業需求靈活部署。

3. 配置管理簡單實用

為了避免配置内容耦合問題,我們隻設計了全局配置(global config)和應用配置(application config)兩種類型的配置,并沒有設計”組配置“。全局配置是指某一環境下所有應用都能生效的配置,但它的優先及低于應用配置,一個運作環境下有且隻有一個全局配置。如果應用可執行包已經有相同的配置,那麼會被配置中心的配置所覆寫。

全局配置清單: 

基于 Spring Cloud 的分布式配置中心

應用配置清單: 

基于 Spring Cloud 的分布式配置中心

3.1 自帶版本管理功能:自動生成版本号以及回退功能

配置内容每修改一次,版本号會自動增加1,同時會将原來配置内容備份到曆史表中,以便于檢視變更記錄和回退。

基于 Spring Cloud 的分布式配置中心

點選“對比”可以目前版本與最新版本進行比較,非常容易看出版本之間的差異部分,就好像使用git等版本管理工具一樣:

基于 Spring Cloud 的分布式配置中心

通過替換曆史版本功能,進行回退。

3.2 使用Yml線上編輯器,能實時檢查配置格式是否正确;

基于 Spring Cloud 的分布式配置中心

為了更好管理配置内容,我們使用YAML格式管理配置内容。

使用Yml線上編輯器,可以非常友善編輯,比如:複制粘貼内容,就像在修改配置檔案一樣。當使用者編輯内容時,會實時檢查格式是否符合yaml格式時,如果格式是正确的,右則會正确顯示其對應的json内容,如果格式不正确則,右則會提示相應的錯誤資訊,能及時發現錯誤。

3.3 支援修改前後内容對比功能,保證修改内容的正确性

基于 Spring Cloud 的分布式配置中心

在儲存修改内容之前會彈出此對比界面,友善确認核對此次變更的内容是否正确,确認無誤後再點選“确定”按鈕儲存。

4. 用戶端使用簡單并相容Spring Boot和Spring Cloud應用

配置中心提供http接口拉取配置,是以隻要支援http協定的應用都是可以使用的。我們已經實作了Spring Boot和Spring Cloud應用的用戶端,接下來說明其一些特性及使用方法。

4.1 無縫相容Spring boot、Spring Cloud應用

suixingpay-config-client 是基于spring-cloud開發的,是以使用方法與spring-cloud-config完全一樣。支援xml、Spring boot @Value、@ConfigurationProperties 注入配置,支援通過Environment擷取配置。支援 spring-cloud 的 @RefreshScope 注解重新整理配置。

隻需要在項目是加入suixingpay-config-client依賴,并在bootstrap.yml檔案中增加如下配置:

spring:
  application:
    name: config-demo # 設定應用名稱,這是必填項

  profiles:
    active: ${profile:dev}

#多環境區配置設定置
---
spring:
   profiles: test
suixingpay:
  config:
    enabled: true                  # 是否啟用配置中心,預設值為:true;為了友善開發,建議開發環境設定為false
    profile: test                  # 環境名稱,預設值為spring.profiles.active的第1個值
    uris:
    - http://127.0.0.1:8080/       # 配置中心服務位址,必須配置
    username: admin                # 調用接口使用者名(非配置中心登入的使用者名和密碼)
    password: 123456               # 調用接口密碼
    cachePath: ./config            # 配置緩存路徑,預設值為:./config
    cacheTimeOut: 0                # 本地緩存過期時間(機關:秒),如果小于等于0時,一直有效
    failFast: false                # 是否快速失敗,如果為true時,當通路配置中心時立即抛異常;如果為false時,會嘗試加載3次,并會嘗試擷取本地緩存,最終還沒有配置,才會抛異常。預設值:false           

下面舉個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>           

關于@Value、@ConfigurationProperties及@RefreshScope的使用就不再一一舉例子,更多内容可以參考Spring 官方文檔。

4.3 支援灰階釋出

為了支援灰階釋出,suixingpay-config-client并實作沒有自動重新整理配置的功能,而是通過使用Spring cloud提供的refresh endpoint進行手動重新整理,因為當配置變更後,沒有經過驗證就将最新配置推送給所有應用,風險是非常之大的。正确的做法是,修改配置内容後,先将最新配置内容重新整理到一個應用執行個體進行驗證,驗證無誤後,再重新整理剩餘的應用。

現有版本還沒有友善重新整理配置的相關工具,需要借助curl或postmain等工具來完成,我們正在開發相應的功能來提升這塊的使用者體驗,大家可以關注github中的更新。

4.4 支援用戶端緩存,即使配置中心服務不可用,也不會影響應用的啟動

用戶端從配置中心擷取最新配置後,會緩存到本地磁盤中,應用啟動時,先擷取本地緩存中的配置版本号,發送給配置中心,如果用戶端版本号與服務端的不一緻時,才會拉取最新配置,否則傳回304狀态,并使用本地緩存,通過這個機制可以節約網絡帶寬,進而也提升一點性能;同時我們還提供 configversion endpoint 用于檢視目前應用配置的本地緩存版本資訊,通過它也很容易檢查用戶端的配置的版本與服務端的版本是否一緻,能友善發現配置是否更新成功。

我們還可以使用spring boot提供的env及configprops endpoint 檢視配置内容,檢查配置是否生效、是否正确。

Spring 生态功能非常豐富,為我們解決了非常多棘手問題,但很多東西要進行本地化開發後才能更好的使用。此配置中心使用了不少開源技術,給我們帶來了不少便利,希望通過此開源項目回饋社群,為開源社群貢獻綿薄之力。希望了解随行付更多開源項目請檢視:

本文來自雲栖社群合作夥伴“開源中國”

本文作者:王練

原文連結