本文轉(zhuǎn)載自 [Nacos 社區(qū) committer蜈亩,作者:風(fēng)卿]
為什么需要配置中心
配置實(shí)時生效:
傳統(tǒng)的靜態(tài)配置方式要想修改某個配置只能修改之后重新發(fā)布應(yīng)用逝她,要實(shí)現(xiàn)動態(tài)性,可以選擇使用數(shù)據(jù)庫,通過定時輪詢訪問數(shù)據(jù)庫來感知配置的變化仅偎。輪詢頻率低感知配置變化的延時就長跨蟹,輪詢頻率高,感知配置變化的延時就短橘沥,但比較損耗性能窗轩,需要在實(shí)時性和性能之間做折中。配置中心專門針對這個業(yè)務(wù)場景座咆,兼顧實(shí)時性和一致性來管理動態(tài)配置痢艺。
配置管理流程:
配置的權(quán)限管控、灰度發(fā)布介陶、版本管理堤舒、格式檢驗(yàn)和安全配置等一系列的配置管理相關(guān)的特性也是配置中心不可獲取的一部分。
開源配置中心基本介紹
目前市面上用的比較多的配置中心有:(按開源時間排序)
Disconf
2014年7月百度開源的配置管理中心哺呜,同樣具備配置的管理能力舌缤,不過目前已經(jīng)不維護(hù)了,最近的一次提交是兩年前了某残。
Spring Cloud Config
2014年9月開源国撵,Spring Cloud 生態(tài)組件,可以和Spring Cloud體系無縫整合玻墅。
Apollo
2016年5月介牙,攜程開源的配置管理中心,具備規(guī)范的權(quán)限澳厢、流程治理等特性环础。
Nacos
2018年6月,阿里開源的配置中心剩拢,也可以做DNS和RPC的服務(wù)發(fā)現(xiàn)线得。
配置中心核心概念的對比
由于Disconf不再維護(hù),下面對比一下Spring Cloud Config裸扶、Apollo和Nacos框都。Spring Cloud Config、Apollo和Nacos在配置管理領(lǐng)域的概念基本相同呵晨,但是也存在一些不同的點(diǎn)魏保,使用配置的過程中會涉及到一些比較重要的概念。
應(yīng)用
應(yīng)用是客戶端系統(tǒng)的基本單位摸屠,Spring Cloud Config 將應(yīng)用名稱和對應(yīng)Git中的文件名稱關(guān)聯(lián)起來了谓罗,這樣可以起到多個應(yīng)用配置相互隔離的作用。Apollo的配置都是在某個應(yīng)用下面的(除了公共配置)季二,也起到了多個應(yīng)用配置相互隔離的作用檩咱。Nacos的應(yīng)用概念比較弱揭措,只有一個用于區(qū)分配置的額外屬性,不過可以使用 Group 來做應(yīng)用字段刻蚯,可以起到隔離作用绊含。
集群
不同的環(huán)境可以搭建不同的集群,這樣可以起到物理隔離的作用炊汹,Spring Cloud Config躬充、Apollo、Nacos都支持多個集群讨便。
Label Profile & 環(huán)境 & 命名空間
Spring Cloud Config可以使用Label和Profile來做邏輯隔離充甚,Label指遠(yuǎn)程倉庫的分支,Profile類似Maven Profile可以區(qū)分環(huán)境霸褒,比如{application}-{profile}.properties伴找。
Nacos的命名空間和Apollo的環(huán)境一樣,是一個邏輯概念废菱,可以作為環(huán)境邏輯隔離技矮。Apollo中的命名空間指配置的名稱,具體的配置項(xiàng)指配置文件中的一個Property昙啄。
配置管理功能的對比
作為配置中心穆役,配置的整個管理流程應(yīng)該具備流程化能力。
灰度發(fā)布
配置的灰度發(fā)布是配置中心比較重要的功能梳凛,當(dāng)配置的變更影響比較大的時候,需要先在部分應(yīng)用實(shí)例中驗(yàn)證配置的變更是否符合預(yù)期梳杏,然后再推送到所有應(yīng)用實(shí)例韧拒。
Spring Cloud Config支持通過/bus/refresh端點(diǎn)的destination參數(shù)來指定要更新配置的機(jī)器,不過整個流程不夠自動化和體系化十性。
Apollo可以直接在控制臺上點(diǎn)灰度發(fā)布指定發(fā)布機(jī)器的IP叛溢,接著再全量發(fā)布,做得比較體系化劲适。
Nacos目前發(fā)布到0.9版本楷掉,還不支持灰度發(fā)布。
權(quán)限管理
配置的變更和代碼變更都是對應(yīng)用運(yùn)行邏輯的改變霞势,重要的配置變更常常會帶來核彈的效果烹植,對于配置變更的權(quán)限管控和審計(jì)能力同樣是配置中心重要的功能。
Spring Cloud Config依賴Git的權(quán)限管理能力愕贡,開源的GitHub權(quán)限控制可以分為Admin草雕、Write和Read權(quán)限,權(quán)限管理比較完善固以。
Apollo通過項(xiàng)目的維度來對配置進(jìn)行權(quán)限管理墩虹,一個項(xiàng)目的owner可以授權(quán)給其他用戶配置的修改發(fā)布權(quán)限嘱巾。
Nacos目前看還不具備權(quán)限管理能力。
版本管理&回滾
當(dāng)配置變更不符合預(yù)期的時候诫钓,需要根據(jù)配置的發(fā)布版本進(jìn)行回滾旬昭。Spring Cloud Config、Apollo和Nacos都具備配置的版本管理和回滾能力菌湃,可以在控制臺上查看配置的變更情況或進(jìn)行回滾操作稳懒。Spring Cloud Config通過Git來做版本管理,更方便些慢味。
配置格式校驗(yàn)
應(yīng)用的配置數(shù)據(jù)存儲在配置中心一般都會以一種配置格式存儲场梆,比如Properties、Json纯路、Yaml等或油,如果配置格式錯誤,會導(dǎo)致客戶端解析配置失敗引起生產(chǎn)故障驰唬,配置中心對配置的格式校驗(yàn)?zāi)軌蛴行Х乐谷藶殄e誤操作的發(fā)生顶岸,是配置中心核心功能中的剛需。
Spring Cloud Config使用Git叫编,目前還不支持格式檢驗(yàn)辖佣,格式的正確性依賴研發(fā)人員自己。
Apollo和Nacos都會對配置格式的正確性進(jìn)行檢驗(yàn)搓逾,可以有效防止人為錯誤卷谈。
監(jiān)聽查詢
當(dāng)排查問題或者進(jìn)行統(tǒng)計(jì)的時候,需要知道一個配置被哪些應(yīng)用實(shí)例使用到霞篡,以及一個實(shí)例使用到了哪些配置世蔗。
Spring Cloud Config使用Spring Cloud Bus推送配置變更,Spring Cloud Bus兼容 RabbitMQ朗兵、Kafka等污淋,支持查詢訂閱Topic和Consumer的訂閱關(guān)系。
Apollo可以通過灰度實(shí)例列表查看監(jiān)聽配置的實(shí)例列表余掖,但實(shí)例監(jiān)聽的配置(Apollo稱為命名空間)目前還沒有展示出來寸爆。
Nacos可以查看監(jiān)聽配置的實(shí)例,也可以查看實(shí)例監(jiān)聽的配置情況盐欺。
基本上赁豆,這三個產(chǎn)品都具備監(jiān)聽查詢能力,在我們自己的使用過程中找田,Nacos使用起來相對簡單歌憨,易用性相對更好些。
多環(huán)境
在實(shí)際生產(chǎn)中墩衙,配置中心常常需要涉及多環(huán)境或者多集群务嫡,業(yè)務(wù)在開發(fā)的時候可以將開發(fā)環(huán)境和生產(chǎn)環(huán)境分開甲抖,或者根據(jù)不同的業(yè)務(wù)線存在多個生產(chǎn)環(huán)境。如果各個環(huán)境之間的相互影響比較行牧濉(開發(fā)環(huán)境影響到生產(chǎn)環(huán)境穩(wěn)定性)准谚,配置中心可以通過邏輯隔離的方式支持多環(huán)境。
Spring Cloud Config支持Profile的方式隔離多個環(huán)境去扣,通過在Git上配置多個Profile的配置文件柱衔,客戶端啟動時指定Profile就可以訪問對應(yīng)的配置文件。
Apollo也支持多環(huán)境愉棱,在控制臺創(chuàng)建配置的時候就要指定配置所在的環(huán)境唆铐,客戶端在啟動的時候指定JVM參數(shù)ENV來訪問對應(yīng)環(huán)境的配置文件。
Nacos通過命名空間來支持多環(huán)境奔滑,每個命名空間的配置相互隔離艾岂,客戶端指定想要訪問的命名空間就可以達(dá)到邏輯隔離的作用。
多集群
當(dāng)對穩(wěn)定性要求比較高朋其,不允許各個環(huán)境相互影響的時候王浴,需要將多個環(huán)境通過多集群的方式進(jìn)行物理隔離。
Spring Cloud Config可以通過搭建多套Config Server梅猿,Git使用同一個Git的多個倉庫氓辣,來實(shí)現(xiàn)物理隔離。
Apollo可以搭建多套集群袱蚓,Apollo的控制臺和數(shù)據(jù)更新推送服務(wù)分開部署钞啸,控制臺部署一套就可以管控多個集群。
Nacos控制臺和后端配置服務(wù)是部署在一起的癞松,可以通過不同的域名切換來支持多集群爽撒。
配置實(shí)時推送對比
當(dāng)配置變更的時候,配置中心需要將配置實(shí)時推送到應(yīng)用客戶端响蓉。
Nacos和Apollo配置推送都是基于HTTP長輪詢,客戶端和配置中心建立HTTP長聯(lián)接哨毁,當(dāng)配置變更的的時候枫甲,配置中心把配置推送到客戶端。
Spring Cloud Config原生不支持配置的實(shí)時推送扼褪,需要依賴Git的WebHook想幻、Spring Cloud Bus和客戶端/bus/refresh端點(diǎn):
基于Git的WebHook,配置變更觸發(fā)server端refresh
Server端接收到請求并發(fā)送給Spring Cloud Bus
Spring Cloud Bus接到消息并通知給客戶端
客戶端接收到通知话浇,請求Server端獲取最新配置
整體比較下來脏毯,Nacos和Apollo在配置實(shí)時推送鏈路上是比較簡單高效的,Spring Cloud Config的配置推送引入Spring Cloud Bus幔崖,鏈路較長食店,比較復(fù)雜渣淤。
部署結(jié)構(gòu)&高可用對比
Spring Cloud Config
Spring Cloud Config包含config-server、Git和Spring Cloud Bus三大組件:
config-server提供給客戶端獲取配置;
Git用于存儲和修改配置;
Spring Cloud Bus通知客戶端配置變更;
本地測試模式下吉嫩,Spring Cloud Bus和config-server需要部署一個節(jié)點(diǎn)价认,Git使用GitHub就可以。在生產(chǎn)環(huán)境中自娩,Spring Cloud Config用踩,config-server需要部署至少兩個節(jié)點(diǎn)。Spring Cloud Bus如果使用RabbitMQ忙迁,普通集群模式至少需要兩個節(jié)點(diǎn)脐彩。
Git服務(wù)如果使用GitHub就不用考慮高可用問題,如果考慮到安全性要自建Git私有倉庫姊扔,整體的成本比較高惠奸。Web服務(wù)可以部署多節(jié)點(diǎn)支持高可用,由于Git有數(shù)據(jù)的一致性問題旱眯,可以通過以下的方式來支持高可用:
Git+Keepalived冷備模式晨川,當(dāng)主Git掛了可以馬上切到備Git;
Git多節(jié)點(diǎn)部署,存儲使用網(wǎng)絡(luò)文件系統(tǒng)或者通過DRBD實(shí)現(xiàn)多個Git節(jié)點(diǎn)的數(shù)據(jù)同步;
Apollo
Apollo分為MySQL删豺,Config Service共虑,Admin Service,Portal四個模塊:
MySQL存儲Apollo元數(shù)據(jù)和用戶配置數(shù)據(jù);
Config Service提供配置的讀取呀页、推送等功能妈拌,客戶端請求都是落到Config Service上;
Admin Service提供配置的修改、發(fā)布等功能蓬蝶,Portal操作的服務(wù)就是Admin Service;
Portal提供給用戶配置管理界面;
本地測試Config Service尘分,Admin Service,Portal三個模塊可以合并一起部署丸氛,MySQL單獨(dú)安裝并創(chuàng)建需要的表結(jié)構(gòu)培愁。在生產(chǎn)環(huán)境使用Apollo,Portal可以兩個節(jié)點(diǎn)單獨(dú)部署缓窜,穩(wěn)定性要求沒那么高的話定续,Config Service和Admin Service可以部署在一起,數(shù)據(jù)庫支持主備容災(zāi)禾锤。
Nacos
Nacos部署需要Nacos Service和MySQL:
Nacos對外提供服務(wù)私股,支持配置管理和服務(wù)發(fā)現(xiàn);
MySQL提供Nacos的數(shù)據(jù)持久化存儲;
單機(jī)模式下,Nacos可以使用嵌入式數(shù)據(jù)庫部署一個節(jié)點(diǎn)恩掷,就能啟動倡鲸。如果對MySQL比較熟悉,想要了解整體數(shù)據(jù)流向黄娘,可以安裝MySQL提供給Nacos數(shù)據(jù)持久化服務(wù)峭状。生產(chǎn)環(huán)境使用Nacos克滴,Nacos服務(wù)需要至少部署三個節(jié)點(diǎn),再加上MySQL主備宁炫。
整體來看
Nacos的部署結(jié)構(gòu)比較簡單偿曙,運(yùn)維成本較低。Apollo部署組件較多羔巢,運(yùn)維成本比Nacos高望忆。Spring Cloud Config生產(chǎn)高可用的成本最高。
多語言支持對比
一個公司的各個系統(tǒng)可能語言不盡相同竿秆,現(xiàn)在使用的比較多的比如C++启摄,Java,PHP幽钢,Python歉备,Nodejs,還有Go等匪燕。引入配置中心之后蕾羊,配置中心要想讓多語言的系統(tǒng)都能享受到動態(tài)配置的能力,需要支持多語言生態(tài)帽驯。
多語言支持
Spring Cloud服務(wù)于Java生態(tài)龟再,一開始只是針對Java微服務(wù)應(yīng)用,對于非Java應(yīng)用的微服務(wù)調(diào)用尼变,可以使用Sidecar提供了HTTP API利凑,但動態(tài)配置方面還不能很好的支持。
Apollo已經(jīng)支持了多種語言嫌术,并且提供了open API哀澈。其他不支持的語言,Apollo的接入成本相對較低度气。
Nacos支持主流的語言割按,例如Java、Go磷籍、Python哲虾、Nodejs、PHP等择示,也提供了open API。
遷移支持
國內(nèi)主流的互聯(lián)網(wǎng)公司仍是以Java為主晒旅,除了原生Java SDK栅盲,在對整個Java生態(tài),比如Spring Boot和Spring Cloud的支持上废恋,三個產(chǎn)品都是支持的谈秫。
Spring Cloud Config原生就支持Spring Boot和Spring Cloud扒寄,Nacos通過Spring Cloud for Alibaba支持Spring Boot和Spring Cloud生態(tài),符合Spring生態(tài)中的標(biāo)準(zhǔn)實(shí)現(xiàn)方式拟烫,可以無縫從Spring Cloud Conig遷移到Nacos该编。
Apollo支持Spring Boot和Spring Cloud項(xiàng)目,但是實(shí)現(xiàn)方式不同于標(biāo)準(zhǔn)硕淑,無法做無縫遷移课竣,從Spring Cloud遷移到Apollo,存在代碼改造和兼容性成本置媳。
性能對比
性能也是配置中心繞不過的一環(huán)于樟,在同樣的機(jī)器規(guī)格下,如果能支撐更大的業(yè)務(wù)量拇囊,勢必能替公司節(jié)省更多的資源成本迂曲,提高資源利用率。應(yīng)用客戶端對配置中心的接口操作有讀寥袭、寫和變更通知路捧,由于變更通知需要大量的客戶端實(shí)例,不好模擬測試場景传黄,下面僅對讀和寫操作做了測試杰扫。
硬件環(huán)境
Nacos和Apollo使用同樣的數(shù)據(jù)庫(32C128G),部署Server服務(wù)的機(jī)器使用的8C16G配置的容器尝江,磁盤是100G SSD涉波。
版本
Spring Cloud Config使用2.0.0.M9版本,Apollo使用1.2.0 release版本炭序,Nacos使用0.5版本啤覆。
單機(jī)讀場景
客戶端測試程序通過部署多臺機(jī)器,每臺機(jī)器開啟多個線程從配置中心讀取不同的配置(3000個)惭聂。Nacos QPS可以達(dá)到15000窗声,Apollo分為讀內(nèi)存緩存和從數(shù)據(jù)庫中讀兩種方式,從數(shù)據(jù)庫中讀能達(dá)到7500辜纲,從內(nèi)存讀緩存性能可以達(dá)到9000QPS笨觅。Spring Cloud Config使用jGit讀寫Git,由于有客戶端限制耕腾,單機(jī)讀能力被限制在7QPS见剩。
3節(jié)點(diǎn)讀場景
將配置中心的壓測節(jié)點(diǎn)數(shù)都部署成3個節(jié)點(diǎn)。Nacos QPS可以達(dá)到45000 QPS扫俺,Apollo讀內(nèi)存緩存可以達(dá)到27000 QPS苍苞。Nacos和Apollo由于讀場景各個節(jié)點(diǎn)是獨(dú)立的肩狂,基本就是單機(jī)讀場景的3倍關(guān)系座泳。Spring Cloud Config三個節(jié)點(diǎn)讀能力可以到達(dá)21QPS砸讳。
單機(jī)寫場景
同樣的方式瓷们,多臺機(jī)器同時在配置中心修改不同的配置。Nacos QPS可以達(dá)到1800冈欢,Apollo未使用默認(rèn)的數(shù)據(jù)庫連接池(10)QPS只能達(dá)到800 QPS(CPU未壓滿)歉铝,調(diào)整連接池至100可以達(dá)到1100 QPS(CPU壓滿)。Git在提交同一個項(xiàng)目的時候會加鎖凑耻,單機(jī)Git寫能在5QPS左右太示,Spring Cloud Config在使用的時候以一個項(xiàng)目作為數(shù)據(jù)源,寫能力受到Git限制拳话。
3節(jié)點(diǎn)寫場景
同樣的方式先匪,將配置中心的壓測節(jié)點(diǎn)數(shù)都部署成3個節(jié)點(diǎn)。Nacos QPS可以達(dá)到6000弃衍,Apollo可以達(dá)到3300 QPS(CPU壓滿)呀非,此時MySQL數(shù)據(jù)庫因?yàn)榕渲幂^高,未成為性能瓶頸镜盯。Spring Cloud Config三個節(jié)點(diǎn)時候岸裙,Git也是一個節(jié)點(diǎn),寫QPS為5速缆。
整體上來看降允,Nacos的讀寫性能最高,Apollo次之艺糜,Spring Cloud Config的依賴Git場景不適合開放的大規(guī)模自動化運(yùn)維API剧董。
功能特性對比總結(jié)
這里列一個表格總結(jié)一下三個產(chǎn)品的功能特點(diǎn)。
總的來說破停,Apollo和Nacos相對于Spring Cloud Config的生態(tài)支持更廣翅楼,在配置管理流程上做的更好。Apollo相對于Nacos在配置管理做的更加全面真慢,不過使用起來也要麻煩一些毅臊。Nacos使用起來相對比較簡潔,在對性能要求比較高的大規(guī)模場景更適合黑界。
此外管嬉,Nacos除了提供配置中心的功能,還提供了動態(tài)服務(wù)發(fā)現(xiàn)朗鸠、服務(wù)共享與管理的功能蚯撩,降低了服務(wù)化改造過程中的難度。
以上烛占,我們從產(chǎn)品功能求厕、使用體驗(yàn)、實(shí)施過程和性能 4 個緯度對Spring Cloud Config、Apollo和Nacos進(jìn)行對比呀癣。但對于一個開源項(xiàng)目的選型,除了以上這4個方面弦赖,項(xiàng)目上的人力投入(迭代進(jìn)度项栏、文檔的完整性)、社區(qū)的活躍度(issue的數(shù)量和解決速度蹬竖、Contributor數(shù)量沼沈、社群的交流頻次等)、社區(qū)的規(guī)范程度(免責(zé)說明币厕、安全性說明等)列另,這些可能才是用戶更關(guān)注的內(nèi)容。
寫在最后:
歡迎大家關(guān)注我的公眾號【風(fēng)平浪靜如碼】旦装,海量Java相關(guān)文章页衙,學(xué)習(xí)資料都會在里面更新,整理的資料也會放在里面阴绢。
覺得寫的還不錯的就點(diǎn)個贊店乐,加個關(guān)注唄!點(diǎn)關(guān)注呻袭,不迷路眨八,持續(xù)更新!W蟮纭廉侧!