隨着業務的發展、微服務架構的升級,服務的數量、程序的配置日益增多(各類微服務、各類服務器地址、各類參數),傳統的配置文件方式和數據庫的方式已沒法知足開發人員對配置管理的要求:java
所以,分佈式配置中心應運而生!git
關於分佈式配置中心,網上已經有不少開源的解決方案,例如:github
Apollo(阿波羅)是攜程框架部門研發的分佈式配置中心,可以集中化管理應用不一樣環境、不一樣集羣的配置,配置修改後可以實時推送到應用端,而且具有規範的權限、流程治理等特性,適用於微服務配置管理場景。
項目地址:https://github.com/ctripcorp/apollospring
Diamond是淘寶研發的分佈式配置管理系統。使用Diamond可讓集羣中的服務進程動態感知數據的變化,無需重啓服務就能夠實現配置數據的更新。shell
項目地址:https://github.com/gzllol/diamond數據庫
專一於各類「分佈式系統配置管理」的「通用組件」和「通用平臺」, 提供統一的「配置管理服務」
api
項目地址:https://github.com/knightliao/disconf安全
綜合對比,以爲攜程的Apollo 功能強大完善,github上開源社區比較活躍,代碼一直在維護,並且文檔寫得清楚,故最終選擇Apollo 做爲咱們的分佈式配置中心。下面簡要介紹下Apollo項目。服務器
Apollo(阿波羅)是攜程框架部門研發的分佈式配置中心,可以集中化管理應用不一樣環境、不一樣集羣的配置,配置修改後可以實時推送到應用端,而且具有規範的權限、流程治理等特性,適用於微服務配置管理場景。
服務端基於Spring Boot和Spring Cloud開發,打包後能夠直接運行,不須要額外安裝Tomcat等應用容器。
Java客戶端不依賴任何框架,可以運行於全部Java運行時環境,同時對Spring/Spring Boot環境也有較好的支持。
.Net客戶端不依賴任何框架,可以運行於全部.Net運行時環境。架構
經過配置中心發佈配置:
填寫發佈信息:
配置發佈後,就能在客戶端獲取到了,以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())); } } });
Apollo和Spring也能夠很方便地集成,只須要標註@EnableApolloConfig後就能夠經過@Value獲取配置信息:
@Configuration @EnableApolloConfig public class AppConfig {} @Component public class SomeBean { //timeout的值會自動更新 @Value("${request.timeout:200}") private int timeout; }
本文主要介紹和對比了幾種開源分佈式配置中心的選型,並重點介紹了下咱們最終選擇的攜程Apollo(阿波羅)分佈式配置中心的特性和簡單使用,有興趣的讀者能夠到具體項目的官網進行詳細研究。