微服務(wù)架構(gòu)中配置中心的選擇

目前公司內(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)圖如下所示:

image.png

基于消息總線的配置中心架構(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

image.png

通過(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ì)比圖:


image.png

在上述幾個(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ì):
image.png

各組件作用說(shuō)明:


image.png
Apollo HA高可用設(shè)計(jì):
image.png
Apollo客戶端架構(gòu):
image.png

客戶端架構(gòu)原理:

  1. 推拉結(jié)合方式
    客戶端與配置中心保持一個(gè)長(zhǎng)連接,配置實(shí)時(shí)推送
    定時(shí)拉配置(默認(rèn)5分鐘)
  2. 本地緩存
    配置緩存在內(nèi)存
    本地緩存一份配置文件
  3. 應(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末甜紫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子骂远,更是在濱河造成了極大的恐慌囚霸,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件激才,死亡現(xiàn)場(chǎng)離奇詭異拓型,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)瘸恼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門劣挫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人东帅,你說(shuō)我怎么就攤上這事压固。” “怎么了靠闭?”我有些...
    開(kāi)封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵帐我,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我愧膀,道長(zhǎng)拦键,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任檩淋,我火速辦了婚禮芬为,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己媚朦,他們只是感情好捡絮,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著莲镣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涎拉。 梳的紋絲不亂的頭發(fā)上瑞侮,一...
    開(kāi)封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音鼓拧,去河邊找鬼半火。 笑死,一個(gè)胖子當(dāng)著我的面吹牛季俩,可吹牛的內(nèi)容都是我干的钮糖。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼酌住,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼店归!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起酪我,我...
    開(kāi)封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤消痛,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后都哭,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體秩伞,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年欺矫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纱新。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡穆趴,死狀恐怖脸爱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情毡代,我是刑警寧澤阅羹,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站教寂,受9級(jí)特大地震影響捏鱼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜酪耕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一导梆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦看尼、人聲如沸递鹉。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)躏结。三九已至,卻和暖如春狰域,著一層夾襖步出監(jiān)牢的瞬間媳拴,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工兆览, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留屈溉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓抬探,卻偏偏與公主長(zhǎng)得像子巾,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子小压,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容