談?wù)勑畔⒐炯夹g(shù)架構(gòu)演變中的必由之路-配置中心

配置中心:將依賴于服務(wù)器環(huán)境的變量進行統(tǒng)一的管理乡数,如:FTP賬號密碼辆布、三方云服務(wù)的服務(wù)地址及相應(yīng)的授權(quán)信息丘侠,以及部分公司內(nèi)部平臺的基本配置危彩。

配置中心解決什么痛點:

1攒磨、將系統(tǒng)的基本配置與應(yīng)用代碼隔離,在一定程度上提高系統(tǒng)安全性汤徽、杜絕基礎(chǔ)配置被誤改的情況娩缰。

2、基礎(chǔ)配置統(tǒng)一管理谒府,便于維護拼坎,需要修改某一配置時不需要登錄到應(yīng)用集群中的每一臺服務(wù)器上進行修改,只需要在配置中心的統(tǒng)一管理平臺進行修改然后作推送操作(這需要看配置中心具體的實現(xiàn))完疫。

3泰鸡、配置中心從某種角度上可以監(jiān)控應(yīng)用的運行狀態(tài)(通過client端和server端的鏈接),雖然沒有提供專業(yè)的監(jiān)控服務(wù)壳鹤。

配置中心的實現(xiàn):

1盛龄、開源實現(xiàn):github上有很多開源的配置中心的實現(xiàn),阿里早期開源的diamond、以及很多興趣愛好者自研的配置中心余舶,下面我給出一個由java實現(xiàn)的也是github上熱度比較高的配置中心:https://github.com/melin/super-diamond啊鸭,之前我們公司內(nèi)部就是用它進行對配置的統(tǒng)一管理。當然github上還有很多其他比較實用熱度也很高的配置中心解決方案匿值、其中也有用python實現(xiàn)的赠制。

下面就我們在使用super-diamond過程中遇到的一些問題進行梳理(抽出相對共性具有代表性的問題),以及我們是如何針對這些問題怎樣對其進行改造挟憔、在改造過程中遇到的問題及應(yīng)對之策钟些,最后介紹我們當前架構(gòu)設(shè)計存在的不足及下一步架構(gòu)發(fā)展的方向。

存在問題:

(1)服務(wù)端的單點問題绊谭,高可用性不強政恍。

(2)前端功能、界面不友好龙誊,對某一工程模塊下某個key配置困難抚垃。

(3)自身協(xié)議喷楣,client與server之間需要雙向通信(client可以pull趟大,server可以push)等。

(4)服務(wù)端的數(shù)據(jù)安全問題铣焊,對client端進行白名單或者簽名驗證逊朽,保證工程配置不被外部環(huán)境竊取。

(5)在統(tǒng)一配置管理界面曲伊,對某一工程配置修改后叽讳,工程需要重啟才能拉取新配置。

2坟募、改造實現(xiàn):

2.1? 對于前端功能界面不友好的問題岛蚤,改造時新添加了針對工程、模塊懈糯、配置項的基本搜索涤妒,以及對配置的批量修改功能、服務(wù)端配置推送功能(同步推送赚哗、異步補償)她紫、單server客戶端實時監(jiān)控等。下面給出兩張樣例圖:

圖1 配置界面


圖2 client端監(jiān)控界面


在圖1界面中對各工程的配置進行統(tǒng)一的管理屿储、配置贿讹,支持批量配置及按module的維護進行推送任務(wù)的創(chuàng)建、消費够掠。圖2中顯示了某一臺server對外client端連接的基本情況民褂,同時也在第一列顯示了推送任務(wù)的消費狀態(tài),便于觀察任務(wù)消費情況。

2.2? 針對服務(wù)端的單點問題助赞,在架構(gòu)設(shè)計上新添加了zk集群买羞、HA來做前端的負載均衡工程、nginx代理雹食。下面來看一張當前的系統(tǒng)架構(gòu)圖:


圖3? 架構(gòu)圖

從上圖中可以看出畜普,server端和client端采用netty進行通信,netty是一個十分優(yōu)秀的異步事件驅(qū)動的網(wǎng)絡(luò)通信框架(Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients.)群叶,目前很多rpc的框架都采用它來通信吃挑,比如:hadoop rpc的avro,如果讀者對netty沒有接觸過或者不是很熟悉的話街立,建議參看官網(wǎng)netty.io或http://blog.csdn.net/zxhoo/article/details/17264263上的系列文章舶衬。客戶端可以主動從server端拉取自己的工程配置(大部分的配置中心的設(shè)計為在應(yīng)用啟動時拉取赎离,如果拉取不到或者client選擇不覆蓋則加載client端本地的配置文件)逛犹,服務(wù)端也可以主動向與此連接的客戶端推送配置(客戶端也可自由選擇是否接受服務(wù)端推送過來的配置)。client在連接一個server時梁剔,通過域名(不是ip)來連接虽画,可以通過nginx來做一定的負載及容災(zāi)(當然也可以通過服務(wù)端的服務(wù)心跳檢測來做)。client與server連接上后荣病,client端會對這個channel進行心跳檢測码撰,當channel失效時,會重新與server端建立連接个盆。

zk在當前架構(gòu)中需要擔任的角色是客戶端連接信息的存儲和推送任務(wù)的存儲脖岛,當客戶端連接上某一臺server時,會通過server向client進行注冊颊亮,其目的也是為了推送任務(wù)的創(chuàng)建柴梆;當用戶在配置管理界面對配置修改后绍在,通過創(chuàng)建對工程模塊下的配置推送任務(wù)件舵,及任務(wù)的成功消費來實現(xiàn)將修改后的配置推送至client合武。zk的客戶端選用的是curator,curator應(yīng)該是目前最好的zk的客戶端汤善,與zkClient比優(yōu)勢很多,它里面提供了對zk節(jié)點(也可包括子節(jié)點)結(jié)構(gòu)、信息變化的事件監(jiān)聽,事件的類型有創(chuàng)建、更新芯咧、刪除等。當推送任務(wù)被創(chuàng)建時會獲取到一條更新事件,然后根據(jù)該事件內(nèi)容已經(jīng)具體處理。

下面我們考慮一種情況闪金,當某臺server端由于發(fā)版或者其他原因囱嫩,突然重啟或宕機時恃疯,原先與之連接的client channel將全部失效,雖然通過client端的心跳檢測可以連接到另外的server上墨闲,但對于原先已經(jīng)創(chuàng)建好但沒有成功消費的推送任務(wù)怎么處理今妄?我們的處理方式是建立了一個job對這些任務(wù)進行異步推送補償。

該架構(gòu)上還有一個重點的點在圖中的map上鸳碧,map主要用來緩存應(yīng)用內(nèi)部與該server相連接的client信息蛙奖,用于推送任務(wù)的消費,客戶端的monitor是其次杆兵。

該架構(gòu)存在的不足或者不完善的地方有很多雁仲,就拿服務(wù)組的高可用而言就不是業(yè)界rpc調(diào)用的首選解決方案,另外也存在單點琐脏、單數(shù)據(jù)節(jié)點的問題攒砖、對與某一server group所有建立連接的client信息的統(tǒng)一監(jiān)控維護。下面對該架構(gòu)進行改進設(shè)想日裙,同時也將是下一步發(fā)展的方向吹艇。


圖4 改進架構(gòu)

新的架構(gòu)中改進的地方有:

(1)server的可用性通過向zk注冊來實現(xiàn)(臨時節(jié)點),client端在連接server或者當監(jiān)聽到server的節(jié)點失效時來再次維護本地server group緩存昂拂,實際連接時受神,直接從server group緩存中根據(jù)均衡算法獲取一條server ip即可。

(2)利用redis來進行server group全局的client信息的緩存格侯,便于對client的全局監(jiān)控及server group全局任務(wù)推送狀態(tài)的監(jiān)控維護鼻听。

(3)數(shù)據(jù)庫分庫分表(可按照project的屬性作為分庫的key,這一點可能并不是所有公司都需要联四,只是一個架構(gòu)設(shè)想撑碴,因為配置的數(shù)據(jù)與業(yè)務(wù)系統(tǒng)的數(shù)據(jù)比起來量少的太多),同時需要備庫來對主庫進行備份朝墩,提高可用性醉拓。

2.3? 對與上述協(xié)議的問題,需要根據(jù)各公司或者團隊的實際需求來調(diào)整收苏,并沒有一個統(tǒng)一的標準方案亿卤。

2.4? server group的配置數(shù)據(jù)安全問題也與2.3相似,實現(xiàn)方式還是需要根據(jù)各公司內(nèi)部的習(xí)慣來做鹿霸,可以通過白名單的方式排吴、也可通過認證簽名的方式、也可生產(chǎn)白名單其它環(huán)境認證簽名杜跷,如果是確定完全走內(nèi)網(wǎng)通信的話傍念,非生產(chǎn)環(huán)境也可不做安全限制矫夷。

2.5? 配置中心的配置修改后,client端需不需要重啟應(yīng)用來拉取新的配置完全依賴于client server的自身實現(xiàn)憋槐,可以不用重啟双藕,也可通過設(shè)置client端的配置來決定是否選擇覆蓋本地工程配置。

最后提醒一點:client端盡量不要對應(yīng)用配置做緩存阳仔,不然就配置中心就失去了意義忧陪,當然這里可以通過監(jiān)聽配置中心推送過來的配置變化來刷新緩存,不過個人認為完全沒有這樣的必要近范。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嘶摊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子评矩,更是在濱河造成了極大的恐慌叶堆,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斥杜,死亡現(xiàn)場離奇詭異虱颗,居然都是意外死亡,警方通過查閱死者的電腦和手機蔗喂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門忘渔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人缰儿,你說我怎么就攤上這事畦粮。” “怎么了乖阵?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵宣赔,是天一觀的道長。 經(jīng)常有香客問我义起,道長拉背,這世上最難降的妖魔是什么师崎? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任默终,我火速辦了婚禮,結(jié)果婚禮上犁罩,老公的妹妹穿的比我還像新娘齐蔽。我一直安慰自己,他們只是感情好床估,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布含滴。 她就那樣靜靜地躺著,像睡著了一般丐巫。 火紅的嫁衣襯著肌膚如雪谈况。 梳的紋絲不亂的頭發(fā)上勺美,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機與錄音碑韵,去河邊找鬼赡茸。 笑死,一個胖子當著我的面吹牛祝闻,可吹牛的內(nèi)容都是我干的占卧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼联喘,長吁一口氣:“原來是場噩夢啊……” “哼华蜒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起豁遭,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤叭喜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蓖谢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體域滥,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年蜈抓,在試婚紗的時候發(fā)現(xiàn)自己被綠了启绰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡沟使,死狀恐怖委可,靈堂內(nèi)的尸體忽然破棺而出卒落,到底是詐尸還是另有隱情险领,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布劲绪,位于F島的核電站燕少,受9級特大地震影響卡者,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜客们,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一崇决、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧底挫,春花似錦恒傻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至官边,卻和暖如春沸手,著一層夾襖步出監(jiān)牢的瞬間外遇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工契吉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留臀规,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓栅隐,卻偏偏與公主長得像塔嬉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子租悄,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容