為什麼需要分散式配置中心?
一、前言
對於配置檔案,我們並不陌生,它提供我們可以動態修改程式執行能力。引用別人的一句話就是:
系統執行時(runtime)飛行姿態的動態調整!
我可以把我們的工作稱之為在快速飛行的飛機上修理零件。我們人類總是無法掌控和預知一切。對於我們系統來說,我們總是需要預留一些控制線條,以便在我們需要的時候做出調整,控制系統方向(如灰度控制、限流調整),這對於擁抱變化的網際網路行業尤為重要。
對於單機版,我們稱之為配置(檔案);對於分散式集群系統,我們稱之為配置中心(系統);
二、為什麼要有分散式配置中心
1、專案背景
我們現在有一個專案,使用SSM進行開發的,配置檔案的話我們知道是一個叫做application.properties的檔案。

我們也知道這個配置檔案會在專案啟動的時候被載入到記憶體中進行使用的。
2、需求一
由於業務的變動,使用者在以前進行註冊的時候預設的使用者名稱是“小強”,但是新的領導來了,需要把這個改成“小明”。因為,業務的流量還是比較大的,所以,沒有辦法在白天流量高峰期修改配置檔案,進行重啟!
此時,就辛苦開發的小哥了,他們需要等到半夜裡凌晨三四點的時候,沒有流量的時候,小心翼翼的去修改application.properties配置檔案,必將系統進行重啟。
另外,公司採用的是叢集,進行了負載均衡,系統部署在了多臺伺服器上,那麼開發小哥需要一臺臺的進行修改,小心翼翼的進行修改,生怕出了一點意外!
開發小哥是在忍受不了這種變更了,修改一個配置就需要如此周折的去完成這件事情!忍無可忍,於是像交流群裡的一位大神請教,大神指點讓他去搜索一下“分散式配置中心”。
3、需求二
我們在進行業務開發的時候,一般會有多個環境,至少應該有三個:開發、測試、線上。那這三個環境之間的配置檔案肯定是有不同的,比如說他們之間的資料庫是肯定不同的!application.properties例如:

那我們如何使不同環境之間進行隔離哪?答案很簡單,不就是指定三個不同的檔案,然後在專案啟動的時候指定不同的環境不就行了嗎?於是開發小哥就動起來了,修改如下:

修改之後,運維的小哥不願意了!因為,一開始沒有進行環境隔離的時候,只有一個環境(開發完成之後,直接修改配置檔案,合併到主幹,線上釋出),運維小哥在使用Jenkins+Git+Maven進行自動化整合的時候,只需要配置一下就行了!在Jenkins啟動的指令碼命令是:java -jar ssm.jar 就可以搞定了,經開發小哥這樣一搞,修改啟動的命令不說,新增了環境,還要為他們建立不同環境的自動化整合。
分別需要設定的命令如下:

運維小哥的工作量直接翻了一倍多,想想還有十幾個專案需要這樣進行修改,運維小哥悄悄的拿起了抽屜裡準備了很久的xxx走向了開發小哥。
4、到底什麼是分散式配置中心
從上邊的兩個小需求,我們已經可以看出來,傳統配置的方式已經暴露出了很多問題,其他的諸如:歷史版本管理,許可權控制,安全性等等問題,是傳統的配置檔案無法解決的!
隨著業務的發展、微服務架構的升級,服務的數量、程式的配置日益增多(各種微服務、各種伺服器地址、各種引數),傳統的配置檔案方式和資料庫的方式已無法滿足開發人員對配置管理的要求:
安全性:配置跟隨原始碼儲存在程式碼庫中,容易造成配置洩漏;
時效性:修改配置,需要重啟服務才能生效;
侷限性:無法支援動態調整:例如日誌開關、功能開關;
因此,我們需要配置中心來統一管理配置!把業務開發者從複雜以及繁瑣的配置中解脫出來,只需專注於業務程式碼本身,從而能夠顯著提升開發以及運維效率。同時將配置和釋出包解藕也進一步提升釋出的成功率,併為運維的細力度管控、應急處理等提供強有力的支援。
三、配置的一步步演進
當我們是一個單機服務的是,我們的配置通常寫在一個檔案中的,程式碼釋出的時候,把配置檔案和程式推送到機器上去。
1、單機配置檔案

當隨著業務的使用者量增加,通常我們會把我們的服務進行多機器(叢集)部署。這時候,配置的釋出就變成了如下:
2、多機器配置

行,這樣發配置也能接受,業務的急劇擴張,導致單機服務無法滿業務需求。這時候需要對單體大服務進行切開,服務走向SOA(微服務化)。
3、分散式叢集部署配置檔案

這樣去部署配置簡直是一場噩夢,而且無法做到快速的動態的調整。失去了配置主要意義之一。這時候就需要今天說的統一配置中心。
三、一個簡版的配置中心是什麼樣的
1、配置中心的特點
配置的增刪改查;
不同環境配置隔離(開發、測試、預釋出、灰度/線上);
高效能、高可用性;
請求量多、高併發;
讀多寫少;
2、簡版配置系統
我們可以設計出如下的簡版配置中心:

設計說明點:
通過OA系統對每一條配置(每一個配置有唯一的配置ID)進行增刪改查;
區分不同環境的配置,每個環境同一配置ID對應不同資料庫記錄;
配置最終以json格式(便於編輯和理解)儲存在mysql資料庫中;
引入redis叢集,做配置的快取(比如可以設定配置修改後1分鐘後生效);
配置對外服務,多機器部署,滿足效能需要;
如果有必要,可以引入配置歷史修改記錄;
很多時候,這樣可以基本上滿足我們對配置系統的基本需求,對配置的增刪改查,能容忍一段時間的資料不一致性。
這種設計,由於所有的配置都存放在集中式快取中,這樣集中式的快取也會有他的效能瓶頸。而且,每次配置的訪問都需要發起rpc請求(網路請求),因此考慮在客戶端引入本地快取(localCache,例如Ehcache)。
四、簡版基礎上的一些改進
1、配置中心之效能可用性改進
考慮到,減少網路請求的因素,在客戶端引入localcache,來解決系統的高可用,高效能、可伸縮性。本地快取配置中心如下:

相對於第一版的改進點是,在客戶端引入localcache。開啟執行緒非同步呼叫配置服務,更新本地配置。
這樣可以減少rpc呼叫。
基於資料的CAP原理,該方式只做到了AP,這裡會存在資料的一段時間的不一致性,但最終會保證是配置的最終一致性。如何解決這個資料不一致性問題?
2、配置中心之資料一致性改進
還好,配置通常都只會有一個入口修改,因此可以考慮在配置修改後,通知應用服務清理本地快取和分散式快取。這裡可以引入mq或ZooKeeper。

最後通過,推拉相結合的方式,完成資料的一致性。
六、開源專案
關於分散式配置中心,網上已經有很多開源的解決方案,例如:
1、Apollo
Apollo(阿波羅)是攜程框架部門研發的分散式配置中心,能夠集中化管理應用不同環境、不同叢集的配置,配置修改後能夠實時推送到應用端,並且具備規範的許可權、流程治理等特性,適用於微服務配置管理場景。

專案地址:https://github.com/ctripcorp/apollo
2、XDiamond
全域性配置中心,儲存應用的配置項,解決配置混亂分散的問題。名字來源於淘寶的開源專案Diamond,前面加上一個字母X以示區別。

專案地址:https://github.com/hengyunabc/xdiamond
3、Qconf
QConf 是一個分散式配置管理工具。 用來替代傳統的配置檔案,使得配置資訊和程式程式碼分離,同時配置變化能夠實時同步到客戶端,而且保證使用者高效讀取配置,這使的工程師從瑣碎的配置修改、程式碼提交、配置上線流程中解放出來,極大地簡化了配置管理工作。
專案地址:https://github.com/Qihoo360/QConf
4、Disconf
專注於各種「分散式系統配置管理」的「通用元件」和「通用平臺」, 提供統一的「配置管理服務」包括 百度、滴滴出行、銀聯、網易、拉勾網、蘇寧易購、順豐科技 等知名網際網路公司正在使用!「disconf」在「2015 年度新增開源軟體排名 TOP 100(OSC開源中國提供)」中排名第16強。Disconf的功能特點描述圖:

專案地址:https://github.com/knightliao/disconf
5、Spring Cloud Config
Spring Cloud Config為分散式系統中的外部配置提供伺服器和客戶端支援。

專案地址:https://github.com/spring-cloud/spring-cloud-config
6、主要區別

歡迎工作一到五年的Java工程師朋友們加入Java架構開發:744677563
群內提供免費的Java架構學習資料(裡面有高可用、高併發、高效能及分散式、Jvm效能調優、Spring原始碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!