2020 從一開始 進(jìn)行配置中心選型
背景
現(xiàn)在是 2019 2020年,距離農(nóng)歷過年還有四天吧,小伙伴們都已經(jīng)請假回老家了,只剩我一個開發(fā)和另外一個運維孤獨守著辦公室,閑來無事 整理了今年后端服務(wù)(邊緣開發(fā)維護的邊緣系統(tǒng))的變更內(nèi)容,升級郵件一看,大抵上分為3類
- 修改應(yīng)用配置 (30%)
- 添加白名單/黑名單 進(jìn)行流量控制 (5%)
- 業(yè)務(wù)開發(fā) (65%)
除去日常業(yè)務(wù)開發(fā)不談,前兩項可以通過 將配置的動態(tài)化進(jìn)行處理。因此,將 “配置中心” 做為一項明年完成的內(nèi)容列到我的 TODO LIST 中。
為此,先進(jìn)行配置中心的選型,以開展年后的進(jìn)一步任務(wù)。
另外,如果你有遇到以下情況,也可以看看本篇文章看看,哪個配置中心更適合你。
隨著業(yè)務(wù)的發(fā)展、微服務(wù)架構(gòu)的升級,服務(wù)的數(shù)量、程序的配置日益增多(各種微服務(wù)、各種服務(wù)器地址、各種參數(shù)),傳統(tǒng)的配置文件方式和數(shù)據(jù)庫的方式已無法滿足開發(fā)人員對配置管理的要求:
- 安全性:配置跟隨源代碼保存在代碼庫中,容易造成配置泄漏;
- 時效性:修改配置,需要重啟服務(wù)才能生效;
- 局限性:無法支持動態(tài)調(diào)整:例如日志開關(guān)、功能開關(guān);
入圍選手
Diamond 資料太少,僅列出,不針對評測
適用時間
文章時間:2020年 1 月 20 日
正式開始之前多這一節(jié)的原因是因為目前所有技術(shù)發(fā)展的實在是太快了,常常選型文章是跟不上對應(yīng)技術(shù)發(fā)布的速度,以此想告訴閱讀本文章的讀者咱們文章的一個適用范圍。
優(yōu)劣
分別從功能、性能、UI、侵入性 四個維度進(jìn)行評估。沒有最好,只有最適合。
功能
功能我們首先從 “配置中心”的定義出發(fā),先定義好基礎(chǔ)功能,滿分 10 分
- 實時生效
- 版本管理
- 環(huán)境管理
- 獨立應(yīng)用
- 配置快照
然后再根據(jù)我們的目標(biāo),想定一些特定功能,滿分 5 分
- 灰度發(fā)布
- 權(quán)限管理、發(fā)布審核、操作審計
- 部署簡單
- 客戶端配置信息監(jiān)控
另外,針對開源應(yīng)用,還需要幾個要求。
- 社區(qū)活躍度
- 代碼更新活躍度
就是在這里把Diamond給斃了,截止文章評測時(2020-01-20)GitHub 代碼維護庫最后一個更新為 6 年前。
以上功能點我們做一個表格進(jìn)行評測
| 功能點\平臺 | Nacos | Disconf | SpringCloud Config | Apollo |
|---|---|---|---|---|
| 實時生效 | ? | ? | × | ? |
| 版本管理 | ? | × | ? | ? |
| 環(huán)境管理 | ? | ? | ? | ? |
| 獨立應(yīng)用 | ? | ? | ? | ? |
| 配置快照 | ? | ? | × | ? |
| 灰度發(fā)布 | ? | ? | × | ? |
| 權(quán)限管理 | × | × | × | ? |
| 部署簡單 | ? | ? | ? | × |
| 信息監(jiān)控 | × | ? | × | ? |
| 社區(qū)活躍度 | ? | × | ? | ? |
| 代碼更新活躍度 | ? | × | ? | ? |
性能
// todo
UI
鄙人還是有點怪癖,WebUI 極其糾結(jié),一言蔽之。我喜歡好看的!
- Nacos 比較時尚,提供API進(jìn)行自定義
- Disconf、Apollo 均是 bootstrap 風(fēng)格
- SpringCloud Config 沒有 WebUI,另外有三方做了,可以參考 spring-cloud-config-admin還是比較時尚的,就是要折騰
侵入性
先擺出來集成方式,再說結(jié)論,僅針對我的切入點 Springboot 進(jìn)行集成,不盡詳細(xì),敬請見諒。
Nacos
https://nacos.io/zh-cn/docs/quick-start-spring-boot.html
@Controller
@RequestMapping("config")
public class ConfigController {
@NacosValue(value = "${useLocalCache:false}", autoRefreshed = true)
private boolean useLocalCache;
@RequestMapping(value = "/get", method = GET)
@ResponseBody
public boolean get() {
return useLocalCache;
}
}
Disconf
https://disconf.readthedocs.io/zh_CN/latest/tutorial-client/src/Tutorial3.html#id1
/**
* 金融系數(shù)文件
*
**/
@Service
@DisconfFile(filename = "coefficients.properties")
public class Coefficients {
public static final String key = "discountRate";
@Value(value = "2.0d")
private Double discount;
/**
* 折扣率,分布式配置
*
* @return
*/
@DisconfItem(key = key)
public Double getDiscount() {
return discount;
}
public void setDiscount(Double discount) {
this.discount = discount;
}
}
SpringClound Config
@EnableEurekaClient
@EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
Apollo
文檔比較齊全不做描述
https://github.com/ctripcorp/apollo-use-cases
對于這 4 個平臺,侵入性基本上都很低,如果硬要排個序,也真的只是個人排序,沒有參考價值。
總結(jié)
對于以上內(nèi)容,首先基礎(chǔ)功能,選擇都滿足者,Nacos、Disconf都在我們的考慮范圍。然后基于社區(qū)的活躍度選擇 Nacos。
其實對于大型項目 Apollo 是個好的選擇,但是我們是一個邊緣項目,Apollo 部署難度更大一些所以這次選擇并沒有選擇。本文只是閑暇作成,不甚嚴(yán)謹(jǐn),下一步進(jìn)行試探 四個配置中心,進(jìn)行實際應(yīng)用。
幾時,再進(jìn)行更新。
參考
架構(gòu)設(shè)計之微服務(wù)配置中心選型 (作者:風(fēng)卿,Nacos 社區(qū))
分布式配置中心選型(作者:大數(shù)據(jù)技術(shù)進(jìn)階)