本文作者:風(fēng)卿,Nacos 社區(qū) committer. 在撰寫這篇技術(shù)選型的文章之前,是比較猶豫的。因?yàn)椋云渲幸粋€(gè)開源項(xiàng)目開發(fā)者的身份,去寫一篇三個(gè)開源項(xiàng)目的對比,即便很克制的去客觀的比較,也很難有信服力。這就像,既是參賽選手,又想做裁判,觀眾肯定是不買賬的。 但最后,仍然決定去寫一篇配置中心的技術(shù)選型參考文,是因?yàn)椋?/p>
如果您對微服務(wù)配置中心的功能不是很了解,可以看下以下的背景介紹,若比較熟悉可以直接跳過。 為什么需要配置中心配置實(shí)時(shí)生效:傳統(tǒng)的靜態(tài)配置方式要想修改某個(gè)配置只能修改之后重新發(fā)布應(yīng)用,要實(shí)現(xiàn)動態(tài)性,可以選擇使用數(shù)據(jù)庫,通過定時(shí)輪詢訪問數(shù)據(jù)庫來感知配置的變化。輪詢頻率低感知配置變化的延時(shí)就長,輪詢頻率高,感知配置變化的延時(shí)就短,但比較損耗性能,需要在實(shí)時(shí)性和性能之間做折中。配置中心專門針對這個(gè)業(yè)務(wù)場景,兼顧實(shí)時(shí)性和一致性來管理動態(tài)配置。 配置管理流程:配置的權(quán)限管控、灰度發(fā)布、版本管理、格式檢驗(yàn)和安全配置等一系列的配置管理相關(guān)的特性也是配置中心不可獲取的一部分。 開源配置中心基本介紹目前市面上用的比較多的配置中心有:(按開源時(shí)間排序) Disconf2014年7月百度開源的配置管理中心,同樣具備配置的管理能力,不過目前已經(jīng)不維護(hù)了,最近的一次提交是兩年前了。 Spring Cloud Config2014年9月開源,Spring Cloud 生態(tài)組件,可以和Spring Cloud體系無縫整合。 Apollo2016年5月,攜程開源的配置管理中心,具備規(guī)范的權(quán)限、流程治理等特性。 Nacos2018年6月,阿里開源的配置中心,也可以做DNS和RPC的服務(wù)發(fā)現(xiàn)。 配置中心核心概念的對比由于Disconf不再維護(hù),下面對比一下Spring Cloud Config、Apollo和Nacos。 應(yīng)用應(yīng)用是客戶端系統(tǒng)的基本單位,Spring Cloud Config 將應(yīng)用名稱和對應(yīng)Git中的文件名稱關(guān)聯(lián)起來了,這樣可以起到多個(gè)應(yīng)用配置相互隔離的作用。Apollo的配置都是在某個(gè)應(yīng)用下面的(除了公共配置),也起到了多個(gè)應(yīng)用配置相互隔離的作用。Nacos的應(yīng)用概念比較弱,只有一個(gè)用于區(qū)分配置的額外屬性,不過可以使用 Group 來做應(yīng)用字段,可以起到隔離作用。 集群不同的環(huán)境可以搭建不同的集群,這樣可以起到物理隔離的作用,Spring Cloud Config、Apollo、Nacos都支持多個(gè)集群。 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)境一樣,是一個(gè)邏輯概念,可以作為環(huán)境邏輯隔離。Apollo中的命名空間指配置的名稱,具體的配置項(xiàng)指配置文件中的一個(gè)Property。 配置管理功能的對比作為配置中心,配置的整個(gè)管理流程應(yīng)該具備流程化能力。 灰度發(fā)布配置的灰度發(fā)布是配置中心比較重要的功能,當(dāng)配置的變更影響比較大的時(shí)候,需要先在部分應(yīng)用實(shí)例中驗(yàn)證配置的變更是否符合預(yù)期,然后再推送到所有應(yīng)用實(shí)例。 Spring Cloud Config支持通過/bus/refresh端點(diǎn)的destination參數(shù)來指定要更新配置的機(jī)器,不過整個(gè)流程不夠自動化和體系化。 Apollo可以直接在控制臺上點(diǎn)灰度發(fā)布指定發(fā)布機(jī)器的IP,接著再全量發(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)限管理,一個(gè)項(xiàng)目的owner可以授權(quán)給其他用戶配置的修改發(fā)布權(quán)限。 Nacos目前看還不具備權(quán)限管理能力。 版本管理&回滾當(dāng)配置變更不符合預(yù)期的時(shí)候,需要根據(jù)配置的發(fā)布版本進(jìn)行回滾。Spring Cloud Config、Apollo和Nacos都具備配置的版本管理和回滾能力,可以在控制臺上查看配置的變更情況或進(jìn)行回滾操作。Spring Cloud Config通過Git來做版本管理,更方便些。 配置格式校驗(yàn)應(yīng)用的配置數(shù)據(jù)存儲在配置中心一般都會以一種配置格式存儲,比如Properties、Json、Yaml等,如果配置格式錯(cuò)誤,會導(dǎo)致客戶端解析配置失敗引起生產(chǎn)故障,配置中心對配置的格式校驗(yàn)?zāi)軌蛴行Х乐谷藶殄e(cuò)誤操作的發(fā)生,是配置中心核心功能中的剛需。 監(jiān)聽查詢當(dāng)排查問題或者進(jìn)行統(tǒng)計(jì)的時(shí)候,需要知道一個(gè)配置被哪些應(yīng)用實(shí)例使用到,以及一個(gè)實(shí)例使用到了哪些配置。 Nacos可以查看監(jiān)聽配置的實(shí)例,也可以查看實(shí)例監(jiān)聽的配置情況。 基本上,這三個(gè)產(chǎn)品都具備監(jiān)聽查詢能力,在我們自己的使用過程中,Nacos使用起來相對簡單,易用性相對更好些。 多環(huán)境在實(shí)際生產(chǎn)中,配置中心常常需要涉及多環(huán)境或者多集群,業(yè)務(wù)在開發(fā)的時(shí)候可以將開發(fā)環(huán)境和生產(chǎn)環(huán)境分開,或者根據(jù)不同的業(yè)務(wù)線存在多個(gè)生產(chǎn)環(huán)境。如果各個(gè)環(huán)境之間的相互影響比較小(開發(fā)環(huán)境影響到生產(chǎn)環(huán)境穩(wěn)定性),配置中心可以通過邏輯隔離的方式支持多環(huán)境。 Spring Cloud Config支持Profile的方式隔離多個(gè)環(huán)境,通過在Git上配置多個(gè)Profile的配置文件,客戶端啟動時(shí)指定Profile就可以訪問對應(yīng)的配置文件。 Apollo也支持多環(huán)境,在控制臺創(chuàng)建配置的時(shí)候就要指定配置所在的環(huán)境,客戶端在啟動的時(shí)候指定JVM參數(shù)ENV來訪問對應(yīng)環(huán)境的配置文件。 Nacos通過命名空間來支持多環(huán)境,每個(gè)命名空間的配置相互隔離,客戶端指定想要訪問的命名空間就可以達(dá)到邏輯隔離的作用。 多集群當(dāng)對穩(wěn)定性要求比較高,不允許各個(gè)環(huán)境相互影響的時(shí)候,需要將多個(gè)環(huán)境通過多集群的方式進(jìn)行物理隔離。 Spring Cloud Config可以通過搭建多套Config Server,Git使用同一個(gè)Git的多個(gè)倉庫,來實(shí)現(xiàn)物理隔離。 Apollo可以搭建多套集群,Apollo的控制臺和數(shù)據(jù)更新推送服務(wù)分開部署,控制臺部署一套就可以管控多個(gè)集群。 Nacos控制臺和后端配置服務(wù)是部署在一起的,可以通過不同的域名切換來支持多集群。 配置實(shí)時(shí)推送的對比當(dāng)配置變更的時(shí)候,配置中心需要將配置實(shí)時(shí)推送到應(yīng)用客戶端。 Nacos和Apollo配置推送都是基于HTTP長輪詢,客戶端和配置中心建立HTTP長聯(lián)接,當(dāng)配置變更的的時(shí)候,配置中心把配置推送到客戶端。 Spring Cloud Config原生不支持配置的實(shí)時(shí)推送,需要依賴Git的WebHook、Spring Cloud Bus和客戶端/bus/refresh端點(diǎn):
整體比較下來,Nacos和Apollo在配置實(shí)時(shí)推送鏈路上是比較簡單高效的,Spring Cloud Config的配置推送引入Spring Cloud Bus,鏈路較長,比較復(fù)雜。 部署結(jié)構(gòu) & 高可用的對比Spring Cloud ConfigSpring Cloud Config包含config-server、Git和Spring Cloud Bus三大組件:
本地測試模式下,Spring Cloud Bus和config-server需要部署一個(gè)節(jié)點(diǎn),Git使用GitHub就可以。在生產(chǎn)環(huán)境中,Spring Cloud Config,config-server需要部署至少兩個(gè)節(jié)點(diǎn)。Spring Cloud Bus如果使用RabbitMQ,普通集群模式至少需要兩個(gè)節(jié)點(diǎn)。 Git服務(wù)如果使用GitHub就不用考慮高可用問題,如果考慮到安全性要自建Git私有倉庫,整體的成本比較高。Web服務(wù)可以部署多節(jié)點(diǎn)支持高可用,由于Git有數(shù)據(jù)的一致性問題,可以通過以下的方式來支持高可用:
ApolloApollo分為MySQL,Config Service,Admin Service,Portal四個(gè)模塊:
本地測試Config Service,Admin Service,Portal三個(gè)模塊可以合并一起部署,MySQL單獨(dú)安裝并創(chuàng)建需要的表結(jié)構(gòu)。在生產(chǎn)環(huán)境使用Apollo,Portal可以兩個(gè)節(jié)點(diǎn)單獨(dú)部署,穩(wěn)定性要求沒那么高的話,Config Service和Admin Service可以部署在一起,數(shù)據(jù)庫支持主備容災(zāi)。 NacosNacos部署需要Nacos Service和MySQL:
單機(jī)模式下,Nacos可以使用嵌入式數(shù)據(jù)庫部署一個(gè)節(jié)點(diǎn),就能啟動。如果對MySQL比較熟悉,想要了解整體數(shù)據(jù)流向,可以安裝MySQL提供給Nacos數(shù)據(jù)持久化服務(wù)。生產(chǎn)環(huán)境使用Nacos,Nacos服務(wù)需要至少部署三個(gè)節(jié)點(diǎn),再加上MySQL主備。 整體來看Nacos的部署結(jié)構(gòu)比較簡單,運(yùn)維成本較低。Apollo部署組件較多,運(yùn)維成本比Nacos高。Spring Cloud Config生產(chǎn)高可用的成本最高。 多語言支持的對比一個(gè)公司的各個(gè)系統(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)配置方面還不能很好的支持。 Nacos支持主流的語言,例如Java、Go、Python、Nodejs、PHP等,也提供了open API。 遷移支持國內(nèi)主流的互聯(lián)網(wǎng)公司仍是以Java為主,除了原生Java SDK,在對整個(gè)Java生態(tài),比如Spring Boot和Spring Cloud的支持上,三個(gè)產(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ī)器開啟多個(gè)線程從配置中心讀取不同的配置(3000個(gè))。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個(gè)節(jié)點(diǎn)。Nacos QPS可以達(dá)到45000 QPS,Apollo讀內(nèi)存緩存可以達(dá)到27000 QPS。Nacos和Apollo由于讀場景各個(gè)節(jié)點(diǎn)是獨(dú)立的,基本就是單機(jī)讀場景的3倍關(guān)系。Spring Cloud Config三個(gè)節(jié)點(diǎn)讀能力可以到達(dá)21QPS。 單機(jī)寫場景同樣的方式,多臺機(jī)器同時(shí)在配置中心修改不同的配置。Nacos QPS可以達(dá)到1800,Apollo未使用默認(rèn)的數(shù)據(jù)庫連接池(10)QPS只能達(dá)到800 QPS(CPU未壓滿),調(diào)整連接池至100可以達(dá)到1100 QPS(CPU壓滿)。Git在提交同一個(gè)項(xiàng)目的時(shí)候會加鎖,單機(jī)Git寫能在5QPS左右,Spring Cloud Config在使用的時(shí)候以一個(gè)項(xiàng)目作為數(shù)據(jù)源,寫能力受到Git限制。 3節(jié)點(diǎn)寫場景同樣的方式,將配置中心的壓測節(jié)點(diǎn)數(shù)都部署成3個(gè)節(jié)點(diǎn)。Nacos QPS可以達(dá)到6000,Apollo可以達(dá)到3300 QPS(CPU壓滿),此時(shí)MySQL數(shù)據(jù)庫因?yàn)榕渲幂^高,未成為性能瓶頸。Spring Cloud Config三個(gè)節(jié)點(diǎn)時(shí)候,Git也是一個(gè)節(jié)點(diǎn),寫QPS為5。 整體上來看,Nacos的讀寫性能最高,Apollo次之,Spring Cloud Config的依賴Git場景不適合開放的大規(guī)模自動化運(yùn)維API。 功能特性對比總結(jié)這里列一個(gè)表格總結(jié)一下三個(gè)產(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 個(gè)緯度對Spring Cloud Config、Apollo和Nacos進(jìn)行對比。但對于一個(gè)開源項(xiàng)目的選型,除了以上這4個(gè)方面,項(xiàng)目上的人力投入(迭代進(jìn)度、文檔的完整性)、社區(qū)的活躍度(issue的數(shù)量和解決速度、Contributor數(shù)量、社群的交流頻次等)、社區(qū)的規(guī)范程度(免責(zé)說明、安全性說明等),這些可能才是用戶更關(guān)注的內(nèi)容。 |
|