目前公司內(nèi)部微服務(wù)架構(gòu)基礎(chǔ)設(shè)施建設(shè)中,技術(shù)選型以Spring Cloud技術(shù)為主,也被大家俗稱作“全家桶”哈扮。
因其具備微服務(wù)架構(gòu)體系中所需的各個(gè)服務(wù)組件纬纪,比如服務(wù)注冊(cè)發(fā)現(xiàn)(如Spring Cloud Eureka、Zookeeper滑肉、Consul)包各、API網(wǎng)關(guān)路由服務(wù)(Spring Cloud Zuul),客戶端負(fù)載均衡(Spring Cloud Ribbon靶庙,Zuul默認(rèn)集成了Ribbon)问畅、服務(wù)容錯(cuò)保護(hù)(Spring Cloud Hystrix),消息總線 (Spring Cloud Bus)六荒、分布式配置中心(Spring Cloud Config)护姆、消息驅(qū)動(dòng)的微服務(wù)(Spring Cloud Stream)、分布式鏈路跟蹤服務(wù)(Spring Cloud Sleuth)掏击。
本篇主要圍繞其中一個(gè)組件 分布式配置中心 展開(kāi)討論卵皂。
Spring Cloud Config配置中心介紹&架構(gòu)
在微服務(wù)架構(gòu)體系中配置中心是比較重要的組件之一,Spring Cloud官方自身提供了Spring Cloud Config分布式配置中心砚亭,由它來(lái)提供集中化的外部配置支持灯变,它分為客戶端和服務(wù)端兩個(gè)部分。其中服務(wù)端稱作配置中心捅膘,是一個(gè)獨(dú)立的微服務(wù)應(yīng)用添祸,用來(lái)連接倉(cāng)庫(kù)(如Git、Svn)并未客戶端提供獲取配置的接口寻仗;而客戶端是各微服務(wù)應(yīng)用刃泌,通過(guò)指定配置中心地址從遠(yuǎn)端獲取配置內(nèi)容,啟動(dòng)時(shí)加載配置信息到應(yīng)用上下文中署尤。因Spring Cloud Config實(shí)現(xiàn)的配置中心默認(rèn)采用了Git來(lái)存儲(chǔ)配置信息耙替,所以版本控制管理也是基于Git倉(cāng)庫(kù)本身的特性來(lái)支持的 。
對(duì)該組件調(diào)研后曹体,主要采用基于消息總線的架構(gòu)方式林艘,架構(gòu)圖如下所示:
基于消息總線的配置中心架構(gòu)中需要依賴外部的MQ組件,如Rabbit混坞、Kafka 實(shí)現(xiàn)遠(yuǎn)程環(huán)境事件變更通知,客戶端實(shí)時(shí)配置變更可以基于Git Hook功能實(shí)現(xiàn)钢坦。
同時(shí)架構(gòu)圖中看到最右側(cè)究孕,有一個(gè)Self scheduleing refresher 這個(gè)是我在實(shí)踐中自己新增的一個(gè)擴(kuò)展功能,目的是當(dāng)依賴的消息組件出現(xiàn)問(wèn)題時(shí)爹凹,此時(shí)如果Git倉(cāng)庫(kù)配置發(fā)生了變更厨诸,會(huì)導(dǎo)致部分或所有客戶端可能無(wú)法獲取到最新配置,這樣就造成了客戶端應(yīng)用配置數(shù)據(jù)無(wú)法達(dá)到最終一致性禾酱,進(jìn)而引起線上問(wèn)題微酬。
Self scheduleing refresher 是一個(gè)定時(shí)任務(wù)绘趋,默認(rèn)5分鐘執(zhí)行一次,執(zhí)行時(shí)會(huì)判斷本地的Git倉(cāng)庫(kù)版本與遠(yuǎn)程Git倉(cāng)庫(kù)版本如果不一致颗管,則會(huì)從配置中心獲取最新配置進(jìn)行加載陷遮,保障了配置最終一致性。
經(jīng)過(guò)實(shí)際使用你會(huì)發(fā)現(xiàn)Spring Cloud Config這個(gè)配置中心并不是非常好用垦江,如果是小規(guī)模的項(xiàng)目可以使用問(wèn)題不大帽馋,但它并不適用于中大型的企業(yè)級(jí)的配置管理。
因此比吭,我對(duì)業(yè)界開(kāi)源的配置中心做個(gè)對(duì)比后最終選擇了攜程開(kāi)源的Apollo配置中心解決了微服務(wù)架構(gòu)配置管理和其他項(xiàng)目中配置管理痛點(diǎn)绽族。
下面就針對(duì)Spring Cloud Config和Apollo配置中心做個(gè)更加直觀的比對(duì):
Apollo VS Spring Cloud Config
通過(guò)以上對(duì)比圖發(fā)現(xiàn)Spring Cloud Config缺陷還是挺大的,比如最后一條高可用衩藤,Apollo配置中心客戶端應(yīng)用加載配置后本地會(huì)生成緩存文件吧慢,即使配置中心所有的服務(wù)都掛掉,只是配置無(wú)法更新赏表,但是不影響你的服務(wù)啟動(dòng)检诗。而這Spring Cloud Config是無(wú)法做到的,有人會(huì)說(shuō)我們可以在應(yīng)用classpath下添加應(yīng)用配置文件作為「兜底使用」底哗,這樣做首先配置不會(huì)自動(dòng)同步岁诉,而且也不是Spring Cloud Config自身的功能。
另外還有一個(gè)原因是因?yàn)楝F(xiàn)階段項(xiàng)目中也使用了一些自研的配置中心跋选,但都差強(qiáng)人意涕癣,有的配置中心僅支持xml格式的,無(wú)法支持KV形式前标;還有的配置中心是基于JMX開(kāi)發(fā)的坠韩,但只支持屬性配置推送。所以經(jīng)過(guò)對(duì)Apollo配置中心的調(diào)研和使用發(fā)現(xiàn)這款產(chǎn)品不僅適用于微服務(wù)配置管理場(chǎng)景炼列,同時(shí)也支持多種配置格式只搁,如xml、json俭尖、yml氢惋,還支持多語(yǔ)言客戶端的接入,在配置服務(wù)治理方面也是很完善的稽犁,在攜程內(nèi)部已經(jīng)支撐10萬(wàn)+的實(shí)例運(yùn)行焰望,成熟又穩(wěn)定!
開(kāi)源配置中心對(duì)比
下面這個(gè)圖詳細(xì)的開(kāi)源配置中心對(duì)比圖:
在上述幾個(gè)開(kāi)源配置中心里已亥,Apollo社區(qū)是非承芾担活躍的,不斷更新迭代虑椎,github上的Star數(shù)量已達(dá)8K+震鹉,F(xiàn)ork數(shù)量已達(dá)2.8K+俱笛。
在Apollo出現(xiàn)之前百度開(kāi)源的disconf配置中心使用的更多些,disconf最新代碼更新時(shí)間還是2年前的传趾,且與Apollo的對(duì)比社區(qū)活躍度有所下降迎膜。
Apollo配置中心介紹&架構(gòu)
Apollo(阿波羅)是攜程框架部門研發(fā)的分布式配置中心,能夠集中化管理應(yīng)用不同環(huán)境墨缘、不同集群的配置星虹,
配置修改后能夠?qū)崟r(shí)推送到應(yīng)用端,并且具備規(guī)范的權(quán)限镊讼、流程治理等特性宽涌,適用于微服務(wù)配置管理場(chǎng)景。
服務(wù)端基于Spring Boot和Spring Cloud開(kāi)發(fā)蝶棋,不依賴外部容器卸亮,便于部署。
Java客戶端不依賴任何框架玩裙,能夠運(yùn)行于所有Java運(yùn)行時(shí)環(huán)境兼贸,同時(shí)對(duì)Spring/Spring Boot環(huán)境也有額外支持。
原生支持Java和.Net客戶端吃溅,同時(shí)也支持其他語(yǔ)言客戶端溶诞,目前已支持Go、PHP决侈、Python螺垢、NodeJS、C++赖歌。
主要功能特性:
統(tǒng)一管理不同環(huán)境枉圃、不同集群的配置
配置修改實(shí)時(shí)生效(熱發(fā)布)
版本發(fā)布管理
灰度發(fā)布
權(quán)限管理、發(fā)布審核庐冯、操作審計(jì)
客戶端配置信息監(jiān)控
提供Java和.Net原生客戶端
提供開(kāi)放平臺(tái)API
部署簡(jiǎn)單孽亲,依賴少
Apollo總體架構(gòu)設(shè)計(jì):
各組件作用說(shuō)明:
Apollo HA高可用設(shè)計(jì):
Apollo客戶端架構(gòu):
客戶端架構(gòu)原理:
- 推拉結(jié)合方式
客戶端與配置中心保持一個(gè)長(zhǎng)連接,配置實(shí)時(shí)推送
定時(shí)拉配置(默認(rèn)5分鐘) - 本地緩存
配置緩存在內(nèi)存
本地緩存一份配置文件 - 應(yīng)用程序
通過(guò)Apollo客戶端獲取最新配置
訂閱配置更新通知
Apollo核心概念:
application (應(yīng)用)
每個(gè)應(yīng)用都需要有唯一的身份標(biāo)識(shí) -- appId
environment (環(huán)境)
Apollo客戶端通過(guò)不同環(huán)境獲取對(duì)應(yīng)配置
cluster (集群)
一個(gè)應(yīng)用下不同實(shí)例的分組展父,不同的cluster返劲,可以有不同的配置。
比如北京機(jī)房和天津機(jī)房可以有不一樣的kafka或zk地址配置栖茉。
namespace (命名空間)
一個(gè)應(yīng)用下不同配置的分組篮绿,不同的namespace的類似于不同的文件。
如:數(shù)據(jù)庫(kù)配置衡载,RPC配置等。支持繼承公共組件的配置隙袁。
配置分類
私有類型(private):只能被所屬應(yīng)用獲取
公共類型(public):必須全局唯一痰娱。使用場(chǎng)景:部門/小組級(jí)別共享配置弃榨,中間件客戶端配置。
關(guān)聯(lián)類型(繼承類型):私有繼承公有配置并覆蓋梨睁;定制公共組件配置場(chǎng)景鲸睛。
配置項(xiàng)(Item)
默認(rèn)和公共配置使用properties格式;私有配置支持properties/json/xml/yaml/yml格式坡贺。
定位方式:app+cluster+namespace+item_key
權(quán)限管理
系統(tǒng)管理員擁有所有的權(quán)限
創(chuàng)建者可以代為創(chuàng)建項(xiàng)目官辈,責(zé)任人默認(rèn)是項(xiàng)目管理員,一般創(chuàng)建者=責(zé)任人
項(xiàng)目管理員可創(chuàng)建集群遍坟,Namespace拳亿,管理項(xiàng)目和Namespace權(quán)限
編輯權(quán)限只能編輯不能發(fā)布
發(fā)布權(quán)限只能發(fā)布不能編輯
普通用戶可以搜索查看所有項(xiàng)目配置,但沒(méi)有相關(guān)操作權(quán)限
Apollo配置中使用及擴(kuò)展
使用Apollo配置中心后愿伴,做了進(jìn)一步的功能開(kāi)發(fā)擴(kuò)展肺魁,接入公司的SSO和郵件通知接入。
基于Spring Cloud Config微服務(wù)架構(gòu)體系中隔节,如果之前使用了Spring Cloud Config配置中心鹅经,也可以通過(guò)下列方式平滑的遷移到Apollo配置中心。
Spring Cloud微服務(wù)項(xiàng)目在pom.xml中引入如下依賴:
<dependency>
<groupId>com.letv.micro.apollo</groupId>
<artifactId>micro-apollo-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
該源碼參考Github:https://github.com/david1228/micro-apollo-spring-boot-starter怎诫,需要自行編譯打成jar包使用瘾晃。
這個(gè)jar包對(duì)Spring Cloud配置刷新機(jī)制集成Apollo客戶端做了進(jìn)一步封裝,實(shí)現(xiàn)的主要功能如下:
1幻妓、在Apollo配置中心發(fā)布配置后蹦误,微服務(wù)應(yīng)用客戶端監(jiān)聽(tīng)配置變更,包括默認(rèn)的配置和公共的配置涌哲,通過(guò)ContextRefresher中的refresh()方法完成應(yīng)用環(huán)境上下文的配置刷新胖缤。
2、支持對(duì)日志級(jí)別和日志路徑文件的動(dòng)態(tài)配置變更阀圾。[Apollo Client無(wú)法很好的支持日志級(jí)別和日志路徑文件的變更哪廓,因日志的LoggingApplicationListener加載優(yōu)先級(jí)高,Apollo配置加載滯后初烘。
上述jar包已上傳公司的Maven私服涡真。具體配置使用示例可以參考「4.Apollo配置中心使用示例」
引入micro-apollo-spring-boot-starter之后,可以將spring-cloud-stater-config依賴從pom.xml中去掉了肾筐。
Apollo配置中心公共配置命名規(guī)范:
公共配置建議統(tǒng)一放到新創(chuàng)建的項(xiàng)目中哆料,該項(xiàng)目中存放Spring Cloud相關(guān)的公共組件的配置,比如Eureka吗铐、Zipkin东亦、Stream等配置,比如Eureka地址可能是多個(gè)微服務(wù)應(yīng)用共用的唬渗,便于在該項(xiàng)目中統(tǒng)一對(duì)配置進(jìn)行管理典阵。
創(chuàng)建項(xiàng)目時(shí)奋渔,選擇的部門如為「微服務(wù)公共平臺(tái)(dpms)」
各微服務(wù)應(yīng)用項(xiàng)目創(chuàng)建后可以添加Namespace,選擇關(guān)聯(lián)公共配置壮啊。
公共配置命名規(guī)則:{部門前綴}.application 或者 {部門前綴}.application-{具體的細(xì)分配置}
當(dāng)Apollo配置發(fā)布后嫉鲸,若需讓Spring Cloud配置實(shí)現(xiàn)動(dòng)態(tài)加載,公共配置命名必須以application關(guān)鍵字開(kāi)頭歹啼,在上述依賴的jar包中會(huì)對(duì)這類命名的Namespace做配置變更監(jiān)聽(tīng)玄渗。
例如:
dpms.application-eureka 存放eureka相關(guān)配置
或 dpms.application-zipkin 存放zipkin相關(guān)配置
或 dpms.application 存放Spring Cloud所有的公共相關(guān)配置
其他微服務(wù)應(yīng)用關(guān)聯(lián)公共配置后,默認(rèn)使用的公共配置項(xiàng)狸眼。
你也可以對(duì)公共配置所有參數(shù)做覆蓋藤树,覆蓋后優(yōu)先獲取本項(xiàng)目中的配置,這個(gè)特性在Apolo的公共配置界面能夠直觀的展示出來(lái)份企。
以上就是對(duì)為什么要選擇Apollo配置中心的一些介紹也榄,相信你的項(xiàng)目中可能也遇到了類似的配置管理問(wèn)題或痛點(diǎn),強(qiáng)烈建議使用Apollo配置中心作為你的配置管理基礎(chǔ)服務(wù)使用司志。
關(guān)于Apollo更詳盡的文檔請(qǐng)參考Github:https://github.com/ctripcorp/apollo