1、為什么需要配置中心
配置實時生效:
傳統的靜態配置方式要想修改某個配置只能修改之后重新發布應用,要實現動態性,可以選擇使用數據庫,通過定時輪詢訪問數據庫來感知配置的變化。輪詢頻率低感知配置變化的延時就長,輪詢頻率高,感知配置變化的延時就短,但比較損耗性能,需要在實時性和性能之間做折中。配置中心專門針對這個業務場景,兼顧實時性和一致性來管理動態配置。
2、配置管理流程:
配置的權限管控、灰度發布、版本管理、格式檢驗和安全配置等一系列的配置管理相關的特性也是配置中心不可獲取的一部分。
3、開源配置中心基本介紹
目前市面上用的比較多的配置中心有:(按開源時間排序)
(1) Spring Cloud Config, 2014年9月開源,Spring Cloud 生態組件,可以和Spring Cloud體系無縫整合。
(2) Apollo 2016年5月, 攜程開源的配置管理中心,具備規范的權限、流程治理等特性。
(3) Nacos, 2018年6月,阿里開源的配置中心,也可以做DNS和RPC的服務發現。
4、配置中心核心概念的對比
下面對比一下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。
5、配置管理功能的對比
作為配置中心,配置的整個管理流程應該具備流程化能力。
灰度發布
配置的灰度發布是配置中心比較重要的功能,當配置的變更影響比較大的時候,需要先在部分應用實例中驗證配置的變更是否符合預期,然后再推送到所有應用實例。
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控制台和后端配置服務是部署在一起的,可以通過不同的域名切換來支持多集群。
6、配置實時推送的對比
當配置變更的時候,配置中心需要將配置實時推送到應用客戶端。
Nacos和Apollo配置推送都是基於HTTP長輪詢,客戶端和配置中心建立HTTP長聯接,當配置變更的的時候,配置中心把配置推送到客戶端。
Spring Cloud Config原生不支持配置的實時推送,需要依賴Git的WebHook、Spring Cloud Bus和客戶端/bus/refresh端點:
-
-
基於Git的WebHook,配置變更觸發server端refresh
-
Server端接收到請求並發送給Spring Cloud Bus
-
Spring Cloud Bus接到消息並通知給客戶端
-
客戶端接收到通知,請求Server端獲取最新配置
-
整體比較下來,Nacos和Apollo在配置實時推送鏈路上是比較簡單高效的,Spring Cloud Config的配置推送引入Spring Cloud Bus,鏈路較長,比較復雜。
7、部署結構 & 高可用的對比
Spring Cloud Config
Spring Cloud Config包含config-server、Git和Spring Cloud Bus三大組件:
-
-
config-server提供給客戶端獲取配置;
-
Git用於存儲和修改配置;
-
Spring Cloud Bus通知客戶端配置變更;
-
本地測試模式下,Spring Cloud Bus和config-server需要部署一個節點,Git使用GitHub就可以。在生產環境中,Spring Cloud Config,config-server需要部署至少兩個節點。Spring Cloud Bus如果使用RabbitMQ,普通集群模式至少需要兩個節點。
Git服務如果使用GitHub就不用考慮高可用問題,如果考慮到安全性要自建Git私有倉庫,整體的成本比較高。Web服務可以部署多節點支持高可用,由於Git有數據的一致性問題,可以通過以下的方式來支持高可用:
-
-
Git+Keepalived冷備模式,當主Git掛了可以馬上切到備Git;
-
Git多節點部署,存儲使用網絡文件系統或者通過DRBD實現多個Git節點的數據同步;
-
Apollo
Apollo分為MySQL,Config Service,Admin Service,Portal四個模塊:
-
-
MySQL存儲Apollo元數據和用戶配置數據;
-
Config Service提供配置的讀取、推送等功能,客戶端請求都是落到Config Service上;
-
Admin Service提供配置的修改、發布等功能,Portal操作的服務就是Admin Service;
-
Portal提供給用戶配置管理界面;
-
本地測試Config Service,Admin Service,Portal三個模塊可以合並一起部署,MySQL單獨安裝並創建需要的表結構。在生產環境使用Apollo,Portal可以兩個節點單獨部署,穩定性要求沒那么高的話,Config Service和Admin Service可以部署在一起,數據庫支持主備容災。
Nacos
Nacos部署需要Nacos Service和MySQL:
-
-
Nacos對外提供服務,支持配置管理和服務發現;
-
MySQL提供Nacos的數據持久化存儲;
-
單機模式下,Nacos可以使用嵌入式數據庫部署一個節點,就能啟動。如果對MySQL比較熟悉,想要了解整體數據流向,可以安裝MySQL提供給Nacos數據持久化服務。生產環境使用Nacos,Nacos服務需要至少部署三個節點,再加上MySQL主備。
整體來看
Nacos的部署結構比較簡單,運維成本較低。Apollo部署組件較多,運維成本比Nacos高。Spring Cloud Config生產高可用的成本最高。
8、多語言支持的對比
一個公司的各個系統可能語言不盡相同,現在使用的比較多的比如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。
9、功能特性對比總結
1. apollo,用戶管理以及權限管理做的比較好和全面,適合做部門或者公司級的配置中心。
nacos,比較簡潔明了(也可以說沒有做權限這一塊的開發),適合做小組內,或者小型java團體使用。
2. apollo區分多環境是直接通過環境指定,可以直接對比和切換,而nacos是通過命名空間進行區分的,個人感覺比較不夠直觀。
3. nacos是支持多格式的配置文件,但是解析上沒有apollo做的好,apollo雖然支持的配置格式較少,不過會進行解析,使每個配置看起來比較直觀,修改的時候比較直觀,可以對單個進行修改。
4. apollo配置支持繼承模式,可以有一個公共的配置,然后再新建不同的項目,可以一起集成這個公共的配置,個人感覺更加適目前項目微服務的形式
(nacos找了一下沒有看到這個功能,不過個人感覺配置中心沒有這個功能非常不合理,可能是我沒有扎到,如果有歡迎指正錯誤)
5. 配置對比上:nacos和apollo都有對比功能,不過nacos比較粗糙一些,只能再發布的時候與上一個版本進行對比,apollo支持不同環境 不同版本上的對比。
6. apollo自帶支持開放平台的接口以及能力,可以分享對接配置。
總結:
通過對2者的對比,
apollo也許經過的迭代更久,功能上比nacos更加完善,權限管理做的全面,配置上可能會做的更細節一些,不過操作比較繁瑣,比較 適合多業務、多團隊的業務場景。
nacos做的比較簡潔直觀,一目了然,操作簡單些, 適合做小組內,或者小型java團體使用。
參考文獻:
https://www.cnblogs.com/xiaoqi/p/configserver-compair.html
https://blog.csdn.net/kwame211/article/details/104371263