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

目前公司內(nèi)部微服務(wù)架構(gòu)基礎(chǔ)設(shè)施建設(shè)中,技術(shù)選型以Spring Cloud技術(shù)為主,也被大家俗稱作“全家桶”。

因其具備微服務(wù)架構(gòu)體系中所需的各個(gè)服務(wù)組件,比如服務(wù)注冊發(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è)組件 分布式配置中心 展開討論。

Spring Cloud Config配置中心介紹&架構(gòu)

在微服務(wù)架構(gòu)體系中配置中心是比較重要的組件之一,Spring Cloud官方自身提供了Spring Cloud Config分布式配置中心,由它來提供集中化的外部配置支持,它分為客戶端和服務(wù)端兩個(gè)部分。其中服務(wù)端稱作配置中心,是一個(gè)獨(dú)立的微服務(wù)應(yīng)用,用來連接倉庫(如Git、Svn)并未客戶端提供獲取配置的接口;而客戶端是各微服務(wù)應(yīng)用,通過指定配置中心地址從遠(yuǎn)端獲取配置內(nèi)容,啟動(dòng)時(shí)加載配置信息到應(yīng)用上下文中。因Spring Cloud Config實(shí)現(xiàn)的配置中心默認(rèn)采用了Git來存儲配置信息,所以版本控制管理也是基于Git倉庫本身的特性來支持的 。
對該組件調(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)問題時(shí),此時(shí)如果Git倉庫配置發(fā)生了變更,會(huì)導(dǎo)致部分或所有客戶端可能無法獲取到最新配置,這樣就造成了客戶端應(yīng)用配置數(shù)據(jù)無法達(dá)到最終一致性,進(jìn)而引起線上問題。

Self scheduleing refresher 是一個(gè)定時(shí)任務(wù),默認(rèn)5分鐘執(zhí)行一次,執(zhí)行時(shí)會(huì)判斷本地的Git倉庫版本與遠(yuǎn)程Git倉庫版本如果不一致,則會(huì)從配置中心獲取最新配置進(jìn)行加載,保障了配置最終一致性。

經(jīng)過實(shí)際使用你會(huì)發(fā)現(xiàn)Spring Cloud Config這個(gè)配置中心并不是非常好用,如果是小規(guī)模的項(xiàng)目可以使用問題不大,但它并不適用于中大型的企業(yè)級的配置管理。
因此,我對業(yè)界開源的配置中心做個(gè)對比后最終選擇了攜程開源的Apollo配置中心解決了微服務(wù)架構(gòu)配置管理和其他項(xiàng)目中配置管理痛點(diǎn)。

下面就針對Spring Cloud Config和Apollo配置中心做個(gè)更加直觀的比對:
Apollo VS Spring Cloud Config

image.png

通過以上對比圖發(fā)現(xiàn)Spring Cloud Config缺陷還是挺大的,比如最后一條高可用,Apollo配置中心客戶端應(yīng)用加載配置后本地會(huì)生成緩存文件,即使配置中心所有的服務(wù)都掛掉,只是配置無法更新,但是不影響你的服務(wù)啟動(dòng)。而這Spring Cloud Config是無法做到的,有人會(huì)說我們可以在應(yīng)用classpath下添加應(yīng)用配置文件作為「兜底使用」,這樣做首先配置不會(huì)自動(dòng)同步,而且也不是Spring Cloud Config自身的功能。

另外還有一個(gè)原因是因?yàn)楝F(xiàn)階段項(xiàng)目中也使用了一些自研的配置中心,但都差強(qiáng)人意,有的配置中心僅支持xml格式的,無法支持KV形式;還有的配置中心是基于JMX開發(fā)的,但只支持屬性配置推送。所以經(jīng)過對Apollo配置中心的調(diào)研和使用發(fā)現(xiàn)這款產(chǎn)品不僅適用于微服務(wù)配置管理場景,同時(shí)也支持多種配置格式,如xml、json、yml,還支持多語言客戶端的接入,在配置服務(wù)治理方面也是很完善的,在攜程內(nèi)部已經(jīng)支撐10萬+的實(shí)例運(yùn)行,成熟又穩(wěn)定!

開源配置中心對比

下面這個(gè)圖詳細(xì)的開源配置中心對比圖:


image.png

在上述幾個(gè)開源配置中心里,Apollo社區(qū)是非?;钴S的,不斷更新迭代,github上的Star數(shù)量已達(dá)8K+,F(xiàn)ork數(shù)量已達(dá)2.8K+。
在Apollo出現(xiàn)之前百度開源的disconf配置中心使用的更多些,disconf最新代碼更新時(shí)間還是2年前的,且與Apollo的對比社區(qū)活躍度有所下降。

Apollo配置中心介紹&架構(gòu)

Apollo(阿波羅)是攜程框架部門研發(fā)的分布式配置中心,能夠集中化管理應(yīng)用不同環(huán)境、不同集群的配置,
配置修改后能夠?qū)崟r(shí)推送到應(yīng)用端,并且具備規(guī)范的權(quán)限、流程治理等特性,適用于微服務(wù)配置管理場景。
服務(wù)端基于Spring Boot和Spring Cloud開發(fā),不依賴外部容器,便于部署。
Java客戶端不依賴任何框架,能夠運(yùn)行于所有Java運(yùn)行時(shí)環(huán)境,同時(shí)對Spring/Spring Boot環(huán)境也有額外支持。
原生支持Java和.Net客戶端,同時(shí)也支持其他語言客戶端,目前已支持Go、PHP、Python、NodeJS、C++。

主要功能特性:

統(tǒng)一管理不同環(huán)境、不同集群的配置
配置修改實(shí)時(shí)生效(熱發(fā)布)
版本發(fā)布管理
灰度發(fā)布
權(quán)限管理、發(fā)布審核、操作審計(jì)
客戶端配置信息監(jiān)控
提供Java和.Net原生客戶端
提供開放平臺API
部署簡單,依賴少

Apollo總體架構(gòu)設(shè)計(jì):
image.png

各組件作用說明:


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

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

  1. 推拉結(jié)合方式
    客戶端與配置中心保持一個(gè)長連接,配置實(shí)時(shí)推送
    定時(shí)拉配置(默認(rèn)5分鐘)
  2. 本地緩存
    配置緩存在內(nèi)存
    本地緩存一份配置文件
  3. 應(yīng)用程序
    通過Apollo客戶端獲取最新配置
    訂閱配置更新通知
Apollo核心概念:

application (應(yīng)用)

每個(gè)應(yīng)用都需要有唯一的身份標(biāo)識 -- appId

environment (環(huán)境)

Apollo客戶端通過不同環(huán)境獲取對應(yīng)配置

cluster (集群)

一個(gè)應(yīng)用下不同實(shí)例的分組,不同的cluster,可以有不同的配置。
比如北京機(jī)房和天津機(jī)房可以有不一樣的kafka或zk地址配置。

namespace (命名空間)

一個(gè)應(yīng)用下不同配置的分組,不同的namespace的類似于不同的文件。
如:數(shù)據(jù)庫配置,RPC配置等。支持繼承公共組件的配置。
配置分類
私有類型(private):只能被所屬應(yīng)用獲取
公共類型(public):必須全局唯一。使用場景:部門/小組級別共享配置,中間件客戶端配置。
關(guān)聯(lián)類型(繼承類型):私有繼承公有配置并覆蓋;定制公共組件配置場景。
配置項(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)目配置,但沒有相關(guān)操作權(quán)限

Apollo配置中使用及擴(kuò)展

使用Apollo配置中心后,做了進(jìn)一步的功能開發(fā)擴(kuò)展,接入公司的SSO和郵件通知接入。
基于Spring Cloud Config微服務(wù)架構(gòu)體系中,如果之前使用了Spring Cloud Config配置中心,也可以通過下列方式平滑的遷移到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包對Spring Cloud配置刷新機(jī)制集成Apollo客戶端做了進(jìn)一步封裝,實(shí)現(xiàn)的主要功能如下:

1、在Apollo配置中心發(fā)布配置后,微服務(wù)應(yīng)用客戶端監(jiān)聽配置變更,包括默認(rèn)的配置和公共的配置,通過ContextRefresher中的refresh()方法完成應(yīng)用環(huán)境上下文的配置刷新。
2、支持對日志級別和日志路徑文件的動(dòng)態(tài)配置變更。[Apollo Client無法很好的支持日志級別和日志路徑文件的變更,因日志的LoggingApplicationListener加載優(yōu)先級高,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)一對配置進(jìn)行管理。
創(chuàng)建項(xiàng)目時(shí),選擇的部門如為「微服務(wù)公共平臺(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)鍵字開頭,在上述依賴的jar包中會(huì)對這類命名的Namespace做配置變更監(jiān)聽。
例如:

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)。
你也可以對公共配置所有參數(shù)做覆蓋,覆蓋后優(yōu)先獲取本項(xiàng)目中的配置,這個(gè)特性在Apolo的公共配置界面能夠直觀的展示出來。

以上就是對為什么要選擇Apollo配置中心的一些介紹,相信你的項(xiàng)目中可能也遇到了類似的配置管理問題或痛點(diǎn),強(qiáng)烈建議使用Apollo配置中心作為你的配置管理基礎(chǔ)服務(wù)使用。

關(guān)于Apollo更詳盡的文檔請參考Github:https://github.com/ctripcorp/apollo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容