Nacos、Apollo、Spring Cloud Config微服務配置中心對比

來源:Nacos 社區

爲什麼需要配置中心

配置實時生效:

傳統的靜態配置方式要想修改某個配置只能修改之後重新發布應用,要實現動態性,可以選擇使用數據庫,通過定時輪詢訪問數據庫來感知配置的變化。輪詢頻率低感知配置變化的延時就長,輪詢頻率高,感知配置變化的延時就短,但比較損耗性能,需要在實時性和性能之間做折中。配置中心專門針對這個業務場景,兼顧實時性和一致性來管理動態配置。

配置管理流程:

配置的權限管控、灰度發佈、版本管理、格式檢驗和安全配置等一系列的配置管理相關的特性也是配置中心不可獲取的一部分。

開源配置中心基本介紹

目前市面上用的比較多的配置中心有:(按開源時間排序)

Disconf

2014年7月百度開源的配置管理中心,同樣具備配置的管理能力,不過目前已經不維護了,最近的一次提交是兩年前了。

Spring Cloud Config

2014年9月開源,Spring Cloud 生態組件,可以和Spring Cloud體系無縫整合。

Apollo

2016年5月,攜程開源的配置管理中心,具備規範的權限、流程治理等特性。

Nacos

2018年6月,阿里開源的配置中心,也可以做DNS和RPC的服務發現。

配置中心核心概念的對比

由於Disconf不再維護,下面對比一下Spring Cloud Config、Apollo和Nacos。

Spring Cloud Config、Apollo和Nacos在配置管理領域的概念基本相同,但是也存在一些不同的點,使用配置的過程中會涉及到一些比較重要的概念。

應用

應用是客戶端系統的基本單位,Spring Cloud Config 將應用名稱和對應Git中的文件名稱關聯起來了,這樣可以起到多個應用配置相互隔離的作用。Apollo的配置都是在某個應用下面的(除了公共配置),也起到了多個應用配置相互隔離的作用。Nacos的應用概念比較弱,只有一個用於區分配置的額外屬性,不過可以使用 Group 來做應用字段,可以起到隔離作用。

集羣

不同的環境可以搭建不同的集羣,這樣可以起到物理隔離的作用,Spring Cloud Config、Apollo、Nacos都支持多個集羣。

Label Profile & 環境 & 命名空間

Spring Cloud Config可以使用Label和Profile來做邏輯隔離,Label指遠程倉庫的分支,Profile類似Maven Profile可以區分環境,比如{application}-{profile}.properties。

Nacos的命名空間和Apollo的環境一樣,是一個邏輯概念,可以作爲環境邏輯隔離。Apollo中的命名空間指配置的名稱,具體的配置項指配置文件中的一個Property。

配置管理功能的對比

作爲配置中心,配置的整個管理流程應該具備流程化能力。

灰度發佈

配置的灰度發佈是配置中心比較重要的功能,當配置的變更影響比較大的時候,需要先在部分應用實例中驗證配置的變更是否符合預期,然後再推送到所有應用實例。

Spring Cloud Config支持通過/bus/refresh端點的destination參數來指定要更新配置的機器,不過整個流程不夠自動化和體系化。

Apollo可以直接在控制檯上點灰度發佈指定發佈機器的IP,接着再全量發佈,做得比較體系化。
Nacos目前發佈到0.9版本,還不支持灰度發佈。

權限管理

配置的變更和代碼變更都是對應用運行邏輯的改變,重要的配置變更常常會帶來核彈的效果,對於配置變更的權限管控和審計能力同樣是配置中心重要的功能。

Spring Cloud Config依賴Git的權限管理能力,開源的GitHub權限控制可以分爲Admin、Write和Read權限,權限管理比較完善。

Apollo通過項目的維度來對配置進行權限管理,一個項目的owner可以授權給其他用戶配置的修改發佈權限。

Nacos目前看還不具備權限管理能力。

版本管理&回滾

當配置變更不符合預期的時候,需要根據配置的發佈版本進行回滾。Spring Cloud Config、Apollo和Nacos都具備配置的版本管理和回滾能力,可以在控制檯上查看配置的變更情況或進行回滾操作。Spring Cloud Config通過Git來做版本管理,更方便些。

配置格式校驗

應用的配置數據存儲在配置中心一般都會以一種配置格式存儲,比如Properties、Json、Yaml等,如果配置格式錯誤,會導致客戶端解析配置失敗引起生產故障,配置中心對配置的格式校驗能夠有效防止人爲錯誤操作的發生,是配置中心核心功能中的剛需。
Spring Cloud Config使用Git,目前還不支持格式檢驗,格式的正確性依賴研發人員自己。
Apollo和Nacos都會對配置格式的正確性進行檢驗,可以有效防止人爲錯誤。

監聽查詢

當排查問題或者進行統計的時候,需要知道一個配置被哪些應用實例使用到,以及一個實例使用到了哪些配置。
Spring Cloud Config使用Spring Cloud Bus推送配置變更,Spring Cloud Bus兼容 RabbitMQ、Kafka等,支持查詢訂閱Topic和Consumer的訂閱關係。
Apollo可以通過灰度實例列表查看監聽配置的實例列表,但實例監聽的配置(Apollo稱爲命名空間)目前還沒有展示出來。

Nacos可以查看監聽配置的實例,也可以查看實例監聽的配置情況。

基本上,這三個產品都具備監聽查詢能力,在我們自己的使用過程中,Nacos使用起來相對簡單,易用性相對更好些。

多環境

在實際生產中,配置中心常常需要涉及多環境或者多集羣,業務在開發的時候可以將開發環境和生產環境分開,或者根據不同的業務線存在多個生產環境。如果各個環境之間的相互影響比較小(開發環境影響到生產環境穩定性),配置中心可以通過邏輯隔離的方式支持多環境。

Spring Cloud Config支持Profile的方式隔離多個環境,通過在Git上配置多個Profile的配置文件,客戶端啓動時指定Profile就可以訪問對應的配置文件。

Apollo也支持多環境,在控制檯創建配置的時候就要指定配置所在的環境,客戶端在啓動的時候指定JVM參數ENV來訪問對應環境的配置文件。

Nacos通過命名空間來支持多環境,每個命名空間的配置相互隔離,客戶端指定想要訪問的命名空間就可以達到邏輯隔離的作用。

多集羣

當對穩定性要求比較高,不允許各個環境相互影響的時候,需要將多個環境通過多集羣的方式進行物理隔離。

Spring Cloud Config可以通過搭建多套Config Server,Git使用同一個Git的多個倉庫,來實現物理隔離。

Apollo可以搭建多套集羣,Apollo的控制檯和數據更新推送服務分開部署,控制檯部署一套就可以管控多個集羣。

Nacos控制檯和後端配置服務是部署在一起的,可以通過不同的域名切換來支持多集羣。

配置實時推送的對比

當配置變更的時候,配置中心需要將配置實時推送到應用客戶端。

Nacos和Apollo配置推送都是基於HTTP長輪詢,客戶端和配置中心建立HTTP長聯接,當配置變更的的時候,配置中心把配置推送到客戶端。

image.png

Spring Cloud Config原生不支持配置的實時推送,需要依賴Git的WebHook、Spring Cloud Bus和客戶端/bus/refresh端點:

1、基於Git的WebHook,配置變更觸發server端refresh

2、Server端接收到請求併發送給Spring Cloud Bus

3、Spring Cloud Bus接到消息並通知給客戶端

4、客戶端接收到通知,請求Server端獲取最新配置

image.png

整體比較下來,Nacos和Apollo在配置實時推送鏈路上是比較簡單高效的,Spring Cloud Config的配置推送引入Spring Cloud Bus,鏈路較長,比較複雜。

部署結構 & 高可用的對比

Spring Cloud Config

Spring Cloud Config包含config-server、Git和Spring Cloud Bus三大組件:

1、config-server提供給客戶端獲取配置;

2、Git用於存儲和修改配置;

3、Spring Cloud Bus通知客戶端配置變更;

本地測試模式下,Spring Cloud Bus和config-server需要部署一個節點,Git使用GitHub就可以。在生產環境中,Spring Cloud Config,config-server需要部署至少兩個節點。Spring Cloud Bus如果使用RabbitMQ,普通集羣模式至少需要兩個節點。

Git服務如果使用GitHub就不用考慮高可用問題,如果考慮到安全性要自建Git私有倉庫,整體的成本比較高。Web服務可以部署多節點支持高可用,由於Git有數據的一致性問題,可以通過以下的方式來支持高可用:

1、Git+Keepalived冷備模式,當主Git掛了可以馬上切到備Git;

2、Git多節點部署,存儲使用網絡文件系統或者通過DRBD實現多個Git節點的數據同步;

Apollo

Apollo分爲MySQL,Config Service,Admin Service,Portal四個模塊:

1、MySQL存儲Apollo元數據和用戶配置數據;

2、Config Service提供配置的讀取、推送等功能,客戶端請求都是落到Config Service上;

3、Admin Service提供配置的修改、發佈等功能,Portal操作的服務就是Admin Service;

4、Portal提供給用戶配置管理界面;

本地測試Config Service,Admin Service,Portal三個模塊可以合併一起部署,MySQL單獨安裝並創建需要的表結構。在生產環境使用Apollo,Portal可以兩個節點單獨部署,穩定性要求沒那麼高的話,Config Service和Admin Service可以部署在一起,數據庫支持主備容災。

Nacos

Nacos部署需要Nacos Service和MySQL:

1、Nacos對外提供服務,支持配置管理和服務發現;

2、MySQL提供Nacos的數據持久化存儲;

單機模式下,Nacos可以使用嵌入式數據庫部署一個節點,就能啓動。如果對MySQL比較熟悉,想要了解整體數據流向,可以安裝MySQL提供給Nacos數據持久化服務。生產環境使用Nacos,Nacos服務需要至少部署三個節點,再加上MySQL主備。

整體來看

Nacos的部署結構比較簡單,運維成本較低。Apollo部署組件較多,運維成本比Nacos高。Spring Cloud Config生產高可用的成本最高。

多語言支持的對比

一個公司的各個系統可能語言不盡相同,現在使用的比較多的比如C++,Java,PHP,Python,Nodejs,還有Go等。引入配置中心之後,配置中心要想讓多語言的系統都能享受到動態配置的能力,需要支持多語言生態。

多語言支持

Spring Cloud服務於Java生態,一開始只是針對Java微服務應用,對於非Java應用的微服務調用,可以使用Sidecar提供了HTTP API,但動態配置方面還不能很好的支持。
Apollo已經支持了多種語言,並且提供了open API。其他不支持的語言,Apollo的接入成本相對較低。

Nacos支持主流的語言,例如Java、Go、Python、Nodejs、PHP等,也提供了open API。

遷移支持

國內主流的互聯網公司仍是以Java爲主,除了原生Java SDK,在對整個Java生態,比如Spring Boot和Spring Cloud的支持上,三個產品都是支持的。

Spring Cloud Config原生就支持Spring Boot和Spring Cloud,Nacos通過Spring Cloud for Alibaba支持Spring Boot和Spring Cloud生態,符合Spring生態中的標準實現方式,可以無縫從Spring Cloud Conig遷移到Nacos。

Apollo支持Spring Boot和Spring Cloud項目,但是實現方式不同於標準,無法做無縫遷移,從Spring Cloud遷移到Apollo,存在代碼改造和兼容性成本。

性能對比

性能也是配置中心繞不過的一環,在同樣的機器規格下,如果能支撐更大的業務量,勢必能替公司節省更多的資源成本,提高資源利用率。應用客戶端對配置中心的接口操作有讀、寫和變更通知,由於變更通知需要大量的客戶端實例,不好模擬測試場景,下面僅對讀和寫操作做了測試。

硬件環境

Nacos和Apollo使用同樣的數據庫(32C128G),部署Server服務的機器使用的8C16G配置的容器,磁盤是100G SSD。

版本

Spring Cloud Config使用2.0.0.M9版本,Apollo使用1.2.0 release版本,Nacos使用0.5版本。

單機讀場景

客戶端測試程序通過部署多臺機器,每臺機器開啓多個線程從配置中心讀取不同的配置(3000個)。Nacos QPS可以達到15000,Apollo分爲讀內存緩存和從數據庫中讀兩種方式,從數據庫中讀能達到7500,從內存讀緩存性能可以達到9000QPS。Spring Cloud Config使用jGit讀寫Git,由於有客戶端限制,單機讀能力被限制在7QPS。

3節點讀場景

將配置中心的壓測節點數都部署成3個節點。Nacos QPS可以達到45000 QPS,Apollo讀內存緩存可以達到27000 QPS。Nacos和Apollo由於讀場景各個節點是獨立的,基本就是單機讀場景的3倍關係。Spring Cloud Config三個節點讀能力可以到達21QPS。

單機寫場景

同樣的方式,多臺機器同時在配置中心修改不同的配置。Nacos QPS可以達到1800,Apollo未使用默認的數據庫連接池(10)QPS只能達到800 QPS(CPU未壓滿),調整連接池至100可以達到1100 QPS(CPU壓滿)。Git在提交同一個項目的時候會加鎖,單機Git寫能在5QPS左右,Spring Cloud Config在使用的時候以一個項目作爲數據源,寫能力受到Git限制。

3節點寫場景

同樣的方式,將配置中心的壓測節點數都部署成3個節點。Nacos QPS可以達到6000,Apollo可以達到3300 QPS(CPU壓滿),此時MySQL數據庫因爲配置較高,未成爲性能瓶頸。Spring Cloud Config三個節點時候,Git也是一個節點,寫QPS爲5。

整體上來看,Nacos的讀寫性能最高,Apollo次之,Spring Cloud Config的依賴Git場景不適合開放的大規模自動化運維API。

功能特性對比總結

這裏列一個表格總結一下三個產品的功能特點。

對比項目/配置中心 spring cloud config apollo nacos
開源時間 2014.9 2016.5 2018.6
配置實時推送 支持(Spring Cloud Bus) 支持(HTTP長輪詢1s內) 支持(HTTP長輪詢1s內)
版本管理 支持(Git) 自動管理 自動管理
配置回滾 支持(Git) 支持 支持
灰度發佈 支持 支持 待支持
權限管理 支持 支持 待支持
多集羣多環境 支持 支持 支持
監聽查詢 支持 支持 支持
多語言 只支持Java Go,C++,Python,Java,.net,OpenAPI Python,Java,Nodejs,OpenAPI
分佈式高可用最小集羣數量 Config-Server2+Git+MQ Config2+Admin3+Portal*2+Mysql=8 Nacos*3+MySql=4
配置格式校驗 不支持 支持 支持
通信協議 HTTP和AMQP HTTP HTTP
數據一致性 Git保證數據一致性,Config-Server從Git讀取數據 數據庫模擬消息隊列,Apollo定時讀消息 HTTP異步通知
單機讀(tps) 7(限流所制) 9000 15000
單機寫(tps) 5(限流所制) 1100 1800
3節點讀 21(限流所制) 27000 45000
3節點寫 5(限流所制) 3300 5600

總的來說
1、Apollo和Nacos相對於Spring Cloud Config的生態支持更廣,在配置管理流程上做的更好。
2、Apollo相對於Nacos在配置管理做的更加全面,不過使用起來也要麻煩一些。
3、apollo容器化較困難,Nacos有官網的鏡像可以直接部署,總體來說,Nacos比apollo更符合KISS原則。
4、Nacos部署和使用起來相對比較簡潔,在對性能要求比較高的大規模場景更適合。

此外,Nacos除了提供配置中心的功能,還提供了動態服務發現、服務共享與管理的功能,降低了服務化改造過程中的難度。

以上,我們從產品功能、使用體驗、實施過程和性能 4 個緯度對Spring Cloud Config、Apollo和Nacos進行對比。但對於一個開源項目的選型,除了以上這4個方面,項目上的人力投入(迭代進度、文檔的完整性)、社區的活躍度(issue的數量和解決速度、Contributor數量、社羣的交流頻次等)、社區的規範程度(免責說明、安全性說明等),這些可能纔是用戶更關注的內容。

參考文檔

https://springcloud.cc/spring-cloud-config.html
https://github.com/ctripcorp/apollo
https://nacos.io/


原文  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章