分散式配置中心選型
隨著業務的發展、微服務架構的升級,服務的數量、程式的配置日益增多(各種微服務、各種伺服器地址、各種引數),傳統的配置檔案方式和資料庫的方式已無法滿足開發人員對配置管理的要求:
- 安全性:配置跟隨原始碼儲存在程式碼庫中,容易造成配置洩漏。
- 時效性:修改配置,需要重啟服務才能生效。
- 侷限性:無法支援動態調整:例如日誌開關、功能開關。
因此,分散式配置中心應運而生!
開源專案
關於分散式配置中心,網上已經有很多開源的解決方案,例如:
Apollo
Apollo(阿波羅)是攜程框架部門研發的分散式配置中心,能夠集中化管理應用不同環境、不同叢集的配置,配置修改後能夠實時推送到應用端,並且具備規範的許可權、流程治理等特性,適用於微服務配置管理場景。
專案地址:https://github.com/ctripcorp/apollo
Diamond
Diamond是淘寶研發的分散式配置管理系統。使用Diamond可以讓叢集中的服務程序動態感知資料的變化,無需重啟服務就可以實現配置資料的更新。
專案地址:https://github.com/gzllol/diamond
Disconf
專注於各種「分散式系統配置管理」的「通用元件」和「通用平臺」, 提供統一的「配置管理服務」
專案地址:https://github.com/knightliao/disconf
專案對比
綜合對比,覺得攜程的Apollo 功能強大完善,github上開源社群比較活躍,程式碼一直在維護,而且文件寫得清楚,故最終選擇Apollo 作為我們的分散式配置中心。下面簡要介紹下Apollo專案。
Apollo簡介
Apollo(阿波羅)是攜程框架部門研發的分散式配置中心,能夠集中化管理應用不同環境、不同叢集的配置,配置修改後能夠實時推送到應用端,並且具備規範的許可權、流程治理等特性,適用於微服務配置管理場景。
服務端基於Spring Boot和Spring Cloud開發,打包後可以直接執行,不需要額外安裝Tomcat等應用容器。
Java客戶端不依賴任何框架,能夠運行於所有Java執行時環境,同時對Spring/Spring Boot環境也有較好的支援。
.Net客戶端不依賴任何框架,能夠運行於所有.Net執行時環境。
特性
- 統一管理不同環境、不同叢集的配置
- Apollo提供了一個統一介面集中式管理不同環境(environment)、不同叢集(cluster)、不同名稱空間(namespace)的配置。
- 同一份程式碼部署在不同的叢集,可以有不同的配置,比如zookeeper的地址等
- 通過名稱空間(namespace)可以很方便地支援多個不同應用共享同一份配置,同時還允許應用對共享的配置進行覆蓋
- 配置修改實時生效(熱釋出)
- 使用者在Apollo修改完配置併發布後,客戶端能實時(1秒)接收到最新的配置,並通知到應用程式
- 版本釋出管理
- 所有的配置釋出都有版本概念,從而可以方便地支援配置的回滾
- 灰度釋出
- 支援配置的灰度釋出,比如點了釋出後,只對部分應用例項生效,等觀察一段時間沒問題後再推給所有應用例項
- 許可權管理、釋出稽核、操作審計
- 應用和配置的管理都有完善的許可權管理機制,對配置的管理還分為了編輯和釋出兩個環節,從而減少人為的錯誤。
- 所有的操作都有審計日誌,可以方便地追蹤問題
- 客戶端配置資訊監控
- 可以在介面上方便地看到配置在被哪些例項使用
- 提供Java和.Net原生客戶端
- 提供了Java和.Net的原生客戶端,方便應用整合
- 支援Spring Placeholder, Annotation和Spring Boot的ConfigurationProperties,方便應用使用(需要Spring 3.1.1+)
- 同時提供了Http介面,非Java和.Net應用也可以方便地使用
- 提供開放平臺API
- Apollo自身提供了比較完善的統一配置管理介面,支援多環境、多資料中心配置管理、許可權、流程治理等特性。不過Apollo出於通用性考慮,不會對配置的修改做過多限制,只要符合基本的格式就能儲存,不會針對不同的配置值進行鍼對性的校驗,如資料庫使用者名稱、密碼,Redis服務地址等
- 對於這類應用配置,Apollo支援應用方通過開放平臺API在Apollo進行配置的修改和釋出,並且具備完善的授權和許可權控制
- 部署簡單
- 配置中心作為基礎服務,可用性要求非常高,這就要求Apollo對外部依賴儘可能地少
- 目前唯一的外部依賴是MySQL,所以部署非常簡單,只要安裝好Java和MySQL就可以讓Apollo跑起來
- Apollo還提供了打包指令碼,一鍵就可以生成所有需要的安裝包,並且支援自定義執行時引數
釋出配置
通過配置中心釋出配置:
填寫釋出資訊:
客戶端獲取配置(Java API樣例)
配置釋出後,就能在客戶端獲取到了,以Java為例,獲取配置的示例程式碼如下。Apollo客戶端還支援和Spring整合,更多客戶端使用說明請參見Java客戶端使用指南和.Net客戶端使用指南。
Config config = ConfigService.getAppConfig();
Integer defaultRequestTimeout = 200;
Integer requestTimeout = config.getIntProperty("requestTimeout", defaultRequestTimeout);
客戶端監聽配置變化
通過上述獲取配置程式碼,應用就能實時獲取到最新的配置了。
不過在某些場景下,應用還需要在配置變化時獲得通知,比如資料庫連線的切換等,所以Apollo還提供了監聽配置變化的功能,Java示例如下:
Config config = ConfigService.getAppConfig();
config.addChangeListener(new ConfigChangeListener() {
@Override
public void onChange(ConfigChangeEvent changeEvent) {
for (String key : changeEvent.changedKeys()) {
ConfigChange change = changeEvent.getChange(key);
System.out.println(String.format(
"Found change - key: %s, oldValue: %s, newValue: %s, changeType: %s",
change.getPropertyName(), change.getOldValue(),
change.getNewValue(), change.getChangeType()));
}
}
});
Spring整合樣例
Apollo和Spring也可以很方便地整合,只需要標註@EnableApolloConfig後就可以通過@Value獲取配置資訊:
@Configuration
@EnableApolloConfig
public class AppConfig {}
@Component
public class SomeBean {
//timeout的值會自動更新
@Value("${request.timeout:200}")
private int timeout;
}
總結
本文主要介紹和對比了幾種開源分散式配置中心的選型,並重點介紹了下我們最終選擇的攜程Apollo(阿波羅)分散式配置中心的特性和簡單使用,有興趣的讀者可以到具體專案的官網進行詳細研究