分布式配置中心選型,為什么選擇Apollo?
Spring Boot 作為主流微服務框架,擁有成熟的社區(qū)生態(tài)。市場應用廣泛,為了方便大家,整理了一個基于spring boot的常用中間件快速集成入門系列手冊,涉及RPC、緩存、消息隊列、分庫分表、注冊中心、分布式配置等常用開源組件,大概有幾十篇文章,陸續(xù)會開放出來,感興趣同學請?zhí)崆瓣P注&收藏
關于配置的常規(guī)方案是將配置信息抽離寫入 xml、properties文件中,然后隨著應用一塊打包發(fā)布。如果有開發(fā)、測試、預發(fā)、生產(chǎn)等多套環(huán)境,則通過配置各自獨立的文件以區(qū)分不同的環(huán)境。具備一定的擴展性,但每次配置參數(shù)變更都要重新發(fā)布應用,靈活性較差。
例如:淘寶每年都要舉辦雙十一活動,帶來上千億的GMV,流量非常大。為了系統(tǒng)的穩(wěn)定性,通常會做各種演練演習、壓測,制定上千個降級預案。如果遇到突發(fā)情況,要打開哪個開關,啟動對應的緊急處理措施。如果按上面的玩法,每次都要走一次發(fā)布流程,一個集群上千臺服務器,發(fā)布完了,半個小時也沒了,這的損失多少錢。

資損先不算了,但是你的年度考核 3.25 肯定是沒得跑,年終獎泡湯,贏取白富美,走上人生巔峰。。。。兄弟醒醒。。。

學學人家德芙,能不能搞個絲滑般的Features,不用走發(fā)布流程,也能動態(tài)感知配置變更。
此時我們需要一個中間件框架,分布式配置中心。
工作這么多年,大大小小,各種開源的分布式配置框架有下面幾個:
1、Apollo
2016年5月,攜程開源的配置管理中心,具備規(guī)范的權限、流程治理等特性。
2、spring cloud config
2014年9月開源,Spring Cloud 生態(tài)組件,可以和Spring Cloud體系無縫整合。
3、disconf
2014年7月百度開源的配置管理中心,同樣具備配置的管理能力,不過目前已經(jīng)不維護了,最近的一次提交是兩年前了。
4、Nacos
2018年6月,阿里開源的配置中心,也可以做DNS和RPC的服務發(fā)現(xiàn)。
5、Diamond
Diamond 出自淘寶,開源地址 【https://github.com/takeseem/diamond】 目前已經(jīng)維護了,這里就不展開了。
| 功能特性 | 重要性 | spring-cloud-config | Apollo | disconf | Nacos |
|---|---|---|---|---|---|
| 靜態(tài)配置管理 | 高 | 基于file | 支持 | 支持 | 支持 |
| 動態(tài)配置管理 | 高 | 支持 | 支持 | 支持 | 支持 |
| 統(tǒng)一管理 | 高 | 無,需要github | 支持 | 支持 | 支持 |
| 多環(huán)境 | 中 | 無,需要github | 支持 | 支持 | 支持 |
| 本地配置緩存 | 高 | 無 | 支持 | 支持 | 支持 |
| 配置鎖 | 中 | 支持 | 不支持 | 不支持 | 不支持 |
| 配置校驗 | 中 | 無 | 無 | 無 | 無 |
| 配置生效時間 | 高 | 重啟生效,或手動refresh生效 | 實時 | 實時 | 實時 |
| 配置更新推送 | 高 | 需要手工觸發(fā) | 支持 | 支持 | 支持 |
| 配置定時拉取 | 高 | 無 | 支持 | 配置更新目前依賴事件驅(qū)動, client重啟或者server端推送操 | 支持 |
| 用戶權限管理 | 中 | 無,需要github | 支持 | 支持 | 支持 |
| 授權、審核、審計 | 中 | 無,需要github | 支持 | 無 | 支持 |
| 配置版本管理 | 高 | Git做版本管理 | 界面上直接提供發(fā)布歷史和回滾按鈕 | 操作記錄有落數(shù)據(jù)庫,但無查詢接口 | 界面操作,支持回滾 |
| 配置合規(guī)檢測 | 高 | 不支持 | 支持(但還需完善) | 支持 | |
| 實例配置監(jiān)控 | 高 | 需要結(jié)合spring admin | 支持 | 支持,可以查看每個配置在哪些機器上加載 | 支持 |
| 灰度發(fā)布 | 中 | 不支持 | 支持 | 不支持部分更新 | 支持 |
| 告警通知 | 中 | 不支持 | 支持,郵件方式告警 | 支持,郵件方式告警 | 支持 |
Nacos配置文件支持比較多的格式,支持yaml、text、json、xml、html、Properties,apollo只支持xml、text、Properties的格式,沒有兼容spring boot中比較通用的yaml配置。雖然 Nacos支持多格式的配置文件,但是解析上沒有Apollo做的好,Apollo雖然支持的配置格式較少,不過會進行解析,使每個配置看起來比較直觀,修改的時候比較直觀,可以對單個進行修改。
Apollo用戶管理以及權限管理做的比較好和全面,適合做部門或者公司級的配置中心。Nacos比較簡潔,權限這塊偏弱。Apollo 的社區(qū)生態(tài)活躍,github最近一次提交是在2021年4月11日,另外使用的公司特別多,常見的坑基本都被踩完了。

當然Nacos作為后起之秀,又有阿里做背書,目前市場活躍度也非常高,大家可以結(jié)合自家情況選擇,如果穩(wěn)妥可以選擇Apollo
Apollo 介紹
Apollo(阿波羅)是攜程框架部門研發(fā)的分布式配置中心,能夠集中化管理應用不同環(huán)境、不同集群的配置,配置修改后能夠?qū)崟r推送到應用端,并且具備規(guī)范的權限、流程治理等特性,適用于微服務配置管理場景。
Apollo包括服務端和客戶端兩部分:
服務端基于Spring Boot和Spring Cloud開發(fā),打包后可以直接運行,不需要額外安裝Tomcat等應用容器。
Java客戶端不依賴任何框架,能夠運行于所有Java運行時環(huán)境,同時對Spring、Spring Boot環(huán)境也有較好的支持。
開源地址:https://github.com/ctripcorp/apollo
特性
基于配置的特殊性,Apollo在設計之初就立志于成為一個有治理能力的配置發(fā)布平臺,目前提供了以下的特性:
統(tǒng)一管理不同環(huán)境、不同集群的配置 配置修改實時生效(熱發(fā)布) 版本發(fā)布管理 灰度發(fā)布 權限管理、發(fā)布審核、操作審計 客戶端配置信息監(jiān)控 提供Java和.Net原生客戶端 提供開放平臺API 部署簡單
Show me the code
外部依賴:
在 pom.xml 文件中添加 Apollo 依賴:
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.4.0</version>
</dependency>
配置文件:
在配置文件 application.yaml 中配置 Pulsar 的相關參數(shù),具體內(nèi)容如下:
apollo:
meta: http://127.0.0.1:8080
bootstrap:
enabled: true
app:
id: spring-boot-bulking-apollo
實時動態(tài)感知配置變更:
@Component
public class ApolloConfig {
private static final String USER_TIMEOUT = "user.timeout";
@PostConstruct
public void init() {
Config config = ConfigService.getAppConfig();
config.addChangeListener(changeEvent -> {
ConfigChange configChange = changeEvent.getChange(USER_TIMEOUT);
PropertyChangeType changeType = configChange.getChangeType();
if (PropertyChangeType.ADDED.equals(changeType) || PropertyChangeType.MODIFIED
.equals(changeType)) {
System.out.println(String.format("動態(tài)刷新的新值。key:%s , 值:%s", USER_TIMEOUT, configChange.getNewValue()));
}
}, Sets.newHashSet(USER_TIMEOUT));
String userTimeoutValue = config.getProperty(USER_TIMEOUT, null);
System.out.println(String.format("首次拉取。key:%s , 值:%s", USER_TIMEOUT, userTimeoutValue));
}
}
管理后臺
控制臺地址:
http://localhost:8070/config.html?#/appid=spring-boot-bulking-apollo

控制臺多次修改user.timeout的值,客戶端系統(tǒng)能實時接收到配置變更。
首次拉取。key:user.timeout , 值:1000
動態(tài)刷新的新值。key:user.timeout , 值:500
動態(tài)刷新的新值。key:user.timeout , 值:1000
動態(tài)刷新的新值。key:user.timeout , 值:500
動態(tài)刷新的新值。key:user.timeout , 值:1000
演示代碼地址
https://github.com/aalansehaiyang/spring-boot-bulking
模塊:spring-boot-bulking-apollo
歡迎關注微信公眾號:互聯(lián)網(wǎng)全棧架構,收取更多有價值的信息。
