微服務架構學習與思考(13):分散式設定中心

2023-05-29 06:01:05

一、設定中心的誕生

用程式語言編寫應用專案時,一般都會有專案的組態檔。比如用 java 編寫專案,有一個 properties 的組態檔,會把一些設定資訊寫入到該文字檔案中,例如資料庫相關的設定資訊。

這也體現了軟體設計的一個原則:關注點分離。把程式碼和設定資訊相分離。

​ (單體應用專案組態檔)

在單體應用專案中,這個組態檔一般都是靜態的文字檔案。專案比較小時,設定資訊不是很多、變動也少,這時使用靜態組態檔足矣。修改了設定後,重啟一下應用就可以了。

隨著專案的發展壯大,業務增多,使用者增多,功能增多,原來的大單體應用專案會慢慢的拆分為多個獨立的應用專案,然後向著微服務架構發展演變。

​ (大單體應用拆為為各個獨立應用)

這樣,隨著大單體專案拆分為一個一個獨立應用專案時,組態檔也會跟著專案遷移,每個專案都有自己的組態檔,組態檔變得分散。

假如業務要增加一個功能,而實現這個功能需要協調多個專案開發,並修改各自設定時,就需要到一個一個專案上去修改設定,然後重啟應用以使設定生效。

這樣做是可行的,但是有沒有可以改進的地方?讓設定修改更加高效,而不需要一個檔案一個檔案去修改,這樣太低效了。

如何從系統架構角度出發,構建靈活、易擴充套件的系統,快速應對設定需求的變化。

能不能獨立出一個儲存設定的系統?能不能把這些設定資訊集中儲存在一個地方,修改時只需在一個地方修改,然後動態分發給相應的應用專案?當然可以,這就是設定中心

隨著多個專案向著微服務架構的進化,應用專案分拆為更多的小服務,由各種服務來給應用專案提供功能,服務越多,設定資訊也越多,設定中心也需要更多功能才能滿足需求,設定中心也會向著分散式設定管理中心進化。

二、靜態組態檔的問題

在業務量比較小的單體應用中,靜態文字組態檔使用是沒有大的問題。但是隨著業務逐漸發展壯大,對大單體拆分為多個應用,就會產生一些問題:

  • 組態檔分散,修改起來比較麻煩
  • 設定生效不及時,修改後需要重啟應用以使設定生效
  • 多環境設定,無法區分多個設定環境,比如開發的環境,測試的環境,預釋出的環境,生產的環境
  • 各種設定資訊多,難以管理,比如分散式限流的設定資訊,各種監控的設定資訊等等設定
  • 設定資訊無法回滾,沒有類似版本控制功能的話,就無法進行回滾

等等各種問題。

三、設定中心功能

上面是靜態組態檔最初出現的問題,後面隨著應用的拆分、隨著業務功能越來越多,對設定的功能要求也逐漸變多:

  • 版本管理功能,設定的釋出有版本功能可支援回滾,也進行資訊回溯
  • 設定資訊回滾
  • 灰度釋出功能,支援功能灰度釋出
  • 集中統一管理,對多環境設定資訊管理,比如開發、測試、生產等各種環境的設定資訊
  • 實時生效,修改完後及時下發給對應的應用,應用可以進行熱更新設定,不用重啟應用
  • 叢集功能,有叢集功能,能擴容,能容災,高可用
  • UI介面管理

等等功能。

設定中心的這些功能,解決了靜態組態檔出現的問題,而且還新增了很多額外的功能。

四、開源設定中心

有很多開源的軟體可以作為設定中心使用,比如下面這些:

當然還有很多其他的,比如 Spring Cloud Config,Disconf,Zookeeper 等。

下面介紹下 Apollo 分散式設定中心。

五、Apollo分散式設定中心

Apollo(阿波羅)介紹

​ (來源:https://github.com/apolloconfig/apollo/ apollo github)

Apollo(阿波羅)是一款可靠的分散式設定管理中心,誕生於攜程框架研發部,能夠集中化管理應用不同環境、不同叢集的設定,設定修改後能夠實時推播到應用端,並且具備規範的許可權、流程治理等特性,適用於微服務設定管理場景。

伺服器端基於Spring Boot和Spring Cloud開發,打包後可以直接執行,不需要額外安裝Tomcat等應用容器。

背景:

隨著程式功能的日益複雜,程式的設定日益增多:各種功能的開關、引數的設定、伺服器的地址……

對程式設定的期望值也越來越高:設定修改後實時生效,灰度釋出,分環境、分叢集管理設定,完善的許可權、稽核機制……

在這樣的大環境下,傳統的通過組態檔、資料庫等方式已經越來越無法滿足開發人員對設定管理的需求。Apollo設定中心應運而生!

--- 來自 Apollo 官網

Apollo 功能特性

  • 統一管理不同環境、不同叢集的設定
  • 設定修改實時生效(熱釋出)
  • 版本釋出管理
  • 灰度釋出
  • 許可權管理、釋出稽核、操作審計
  • 使用者端設定資訊監控
  • 多種使用者端,並提供Java和.Net原生使用者端
  • 提供開放平臺API
  • UI 介面管理

更多資訊請檢視檔案:https://www.apolloconfig.com/

架構設計

Apollo基礎模型

  1. 使用者在設定中心對設定進行修改並行布
  2. 設定中心通知Apollo使用者端有設定更新
  3. Apollo使用者端從設定中心拉取最新的設定、更新本地設定並通知到應用

架構模組

五個主要核心模組:

  • Config Service

    • 提供設定的讀取、推播等功能
    • 服務物件是Apollo使用者端
  • Admin Service

    • 提供設定的修改、釋出等功能
    • 服務物件是Apollo Portal(管理介面)
  • Meta Server

    • Meta Server用於封裝Eureka的服務發現介面
  • Client

    • 實時獲取設定資訊
    • 通過存取 Meta Server 獲取 Config Service 服務列表
    • 在Client側會做load balance、錯誤重試
  • Portal

    • 設定管理介面 UI
    • 通過 Meta Server 獲取 Admin Service 服務列表
    • 在 Portal側會做 load balance、錯誤重試

以上資訊和圖片來源:https://www.apolloconfig.com/

Apollo部署

這部分請檢視部署檔案:https://www.apolloconfig.com/

Apollo檔案

開源地址和檔案:

六、參考