服務(wù)治理之標簽路由(轉(zhuǎn))

本文轉(zhuǎn)載自公眾號三維家技術(shù)實踐服務(wù)治理系列文章

1 背景

目前瑞凑,微服務(wù)架構(gòu)是互聯(lián)網(wǎng)企業(yè)的標配,從單體架構(gòu)到微服務(wù)架構(gòu)秩铆,服務(wù)的數(shù)量急劇膨脹,且相互之間依賴錯綜復(fù)雜祟滴。服務(wù)治理唁盏,對開發(fā)、運維都是一個嚴峻的考驗灿里。

例如,在開發(fā)過程中程腹,為了趕進度匣吊,一個服務(wù)往往有多個Feature版本在并行開發(fā)。那么寸潦,同一個服務(wù)的多個版本如何在開發(fā)聯(lián)調(diào)色鸳、測試中做到互不影響呢?

最簡單粗暴的一種方案是建設(shè)多套開發(fā)见转、測試環(huán)境命雀,各環(huán)境有獨立的注冊中心、配置中心斩箫、服務(wù)集群以及相關(guān)中間件吏砂。顯然撵儿,這種等同物理隔離的方式,硬件成本高赊抖,維護成本大统倒,而且需要建設(shè)多少套才夠用? 恐怕沒有確定的答案氛雪。

所以,如何通過一種輕量的模式耸成,既可以滿足我們多版本并行開發(fā)和測試的需要报亩,又可以兼顧低成本和易維護呢?

抽象引申一下井氢,就是我們需要有一套低成本的弦追、滿足多版本服務(wù)并行在同一個服務(wù)集群的機制,該機制除了滿足開發(fā)花竞、測試的需要外劲件, 還能在生產(chǎn)環(huán)境中實現(xiàn)新老版本并行,也就是灰度發(fā)布的需求约急。

2 需求

讓我們再來理一下需求:

  • 在開發(fā)階段零远,需要保證多版本并行開發(fā)和聯(lián)調(diào)。
  • 在測試階段厌蔽,需要保證多版本并行測試牵辣。
  • 在發(fā)布階段,需要灰度發(fā)布機制奴饮,保證產(chǎn)品平滑過渡纬向。

基于上述的背景和需求,我們嘗試通過標簽路由來解決這個問題戴卜。

3 設(shè)計思路

我們從服務(wù)路由標簽的定義逾条、原理以及常見路由規(guī)則設(shè)置這三方面進行闡述。

3.1 服務(wù)路由標簽的定義

image

每個服務(wù)在啟動時投剥,都會被賦予一個用于識別其版本的標簽, 我們稱之為服務(wù)路由標簽, 一般采用迭代版本號作為標簽, 例如feature-V0506师脂。 如果沒有賦予,則默認為default薇缅。該標簽會作為服務(wù)的一個元數(shù)據(jù)危彩,隨著服務(wù)節(jié)點信息注冊到注冊中心上。

例如上圖泳桦,我們的開發(fā)環(huán)境dev汤徽, 包括一個注冊中心,以及一套穩(wěn)定的服務(wù)集群(其路由標簽均為default)灸撰,包括building谒府、usercenter拼坎、material等服務(wù)。

然后程序猿A在本地開發(fā)building服務(wù)的名為F_1的特性分支完疫, 其對應(yīng)的路由標簽也為F_1泰鸡,且已經(jīng)注冊到注冊中心了;程序猿B在本地開發(fā)building服務(wù)的F_2特性分支壳鹤, 其對應(yīng)的路由標簽也為F_2盛龄。

這時候我們看到, 該服務(wù)在注冊中心中有3個版本芳誓,分別為穩(wěn)定的默認版本default余舶,F_1以及F_2

服務(wù)的路由標簽R-Label锹淌,可在服務(wù)的啟動參數(shù)或者環(huán)境變量中設(shè)置匿值。

穩(wěn)定版本,一般為生產(chǎn)上的版本(對應(yīng)master分支)

3.2 服務(wù)路由標簽的原理

上一節(jié)我們已經(jīng)講述了路由標簽作為元數(shù)據(jù)赂摆,會隨服務(wù)信息注冊到注冊中心上挟憔,那么它有什么用呢?

我們在調(diào)用鏈的頭部(一般為網(wǎng)關(guān)烟号,或者在非生產(chǎn)環(huán)境下為postMan绊谭、swagger文檔站點甚至curl等),根據(jù)一定規(guī)則把路由標簽設(shè)置到請求頭中 (請求頭key為R-Label褥符,一個請求最多帶一個標簽龙誊,沒有則默認為default),這個請求頭將會作為一個染色字段在整個調(diào)用鏈路中透傳喷楣。

那么在服務(wù)的路由選擇邏輯中趟大,我們會優(yōu)先選擇版本跟請求的標簽值相同的節(jié)點。如果找不到相同標簽的節(jié)點铣焊,就選擇default的服務(wù)節(jié)點逊朽。

例如上述程序猿A,其本地building服務(wù)版本為F_1曲伊,該服務(wù)的接口A依賴usercenter以及material兩個服務(wù)叽讳。那么在自測的時候,其調(diào)用鏈路是

前端(postMan/swagger等)->apiGateway->building->usercenter->material

這時坟募,程序猿A在前端(手動)或者apiGateway(通過染色規(guī)則)中加上染色字段R-Label:F_1岛蚤,那么apiGateway在選擇building節(jié)點的時候,選擇了路由標簽為F_1的節(jié)點(也就是程序猿A的本地節(jié)點)懈糯,其最終調(diào)用路徑為:

前端(postMan/swagger等)->apiGateway->building.F_1->usercenter.default->material.default

同理涤妒, 程序猿B在自測的時候,其最終調(diào)用路徑為:

前端(postMan/swagger等)->apiGateway->building.F_2->usercenter.default->material.default

還記得我們上一篇關(guān)于鏈路染色的服務(wù)治理文章嗎赚哗?本篇也是其落地場景之一

3.3 路由規(guī)則

路由規(guī)則設(shè)置在配置中心她紫,并實時推送至網(wǎng)關(guān)硅堆,它是網(wǎng)關(guān)對請求做整形的依據(jù)之一。
在網(wǎng)關(guān)中贿讹,我們根據(jù)路由規(guī)則渐逃, 給特定的請求打上特定的路由標簽,并作為染色字段透傳到整個服務(wù)集群民褂。

路由規(guī)則暫時支持如下幾種:

3.3.1 組Id路由

gId match 'G0168' => L'feature-V0506'
gId match 'G0235' => L'feature-V0506'

表示根據(jù)gId進行打標茄菊,當請求的gId請求頭等于G0168或者G0235時,給請求加上請求頭(染色字段): R-Label:feature-V0506

3.3.2 用戶uId路由

uId match 1024 => L'feature-V0506'

表示根據(jù)uId進行灰度赊堪,當請求的uId1024時买羞,給請求加上請求頭(染色字段): R-Label:feature-V0506

uId match %'10n+1' => L'feature-V0506'

表示uId與10取模結(jié)果為1時,執(zhí)行請求整形雹食,相當于1/10的用戶訪問指定版本的服務(wù)

uId match %'10n+3..5' => L'feature-V0506'

表示uId與10取模結(jié)果為3到5的用戶,執(zhí)行請求整形期丰,相當于3/10的用戶訪問指定版本的服務(wù)

路由規(guī)則暫只支持基于特定請求頭的規(guī)則

請求整形群叶,是指在請求處理前,改變請求的內(nèi)容(通常是增加請求頭字段)

4 應(yīng)用場景

4.1 多版本開發(fā)聯(lián)調(diào)

image
  • 開發(fā)環(huán)境部署相對穩(wěn)定的版本(一般為master分支)
  • 本地和開發(fā)環(huán)境共用注冊中心

程序猿B和程序猿C進行本地聯(lián)調(diào)的時候钝荡,給各自服務(wù)加上R-Label:F_2(通過環(huán)境變量或啟動參數(shù)的方式)街立,那么服務(wù)在請求的路由選址的時候,會優(yōu)先選擇選擇B跟C的本地服務(wù)埠通。如果找不到相同標簽赎离,就選擇默認default的服務(wù)節(jié)點。

4.2 多版本測試

image
  • 測試環(huán)境中部署相對穩(wěn)定的版本(一般為master分支)
  • 不同迭代版本采用不同的路由標簽

甚至端辱,我們可以把開發(fā)環(huán)境跟測試環(huán)境合并為一個梁剔,保持環(huán)境的獨立性的同時,進一步節(jié)約了成本舞蔽。

4.2 線上灰度

image
  • 灰度版本部署荣病,添加灰度版本的路由標簽(例如R-Label:F_B
  • 線上灰度,支持不同維度(如gId渗柿、uId)動態(tài)配置路由規(guī)則个盆。
    如上圖,當請求Req1通過網(wǎng)關(guān)gateway朵栖,網(wǎng)關(guān)會檢查路由規(guī)則颊亮,如果匹配上某個路由規(guī)則,就會往該請求添加請求頭R-Label:F_B陨溅。
  • 網(wǎng)關(guān)gateway選擇服務(wù)轉(zhuǎn)發(fā)節(jié)點的時候终惑,優(yōu)先選擇路由標簽R-Label相同的服務(wù)節(jié)點,如果找不到声登,兜底操作選擇default的默認服務(wù)節(jié)點狠鸳。

5 總結(jié)

本文介紹了標簽路由在三維家的實踐揣苏,從設(shè)計思路和場景進行了闡述。標簽路由解決了多版本開發(fā)聯(lián)調(diào)件舵、多版本迭代測試和線上灰度問題卸察,減少部署環(huán)境,節(jié)約人力成本和硬件成本铅祸。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末坑质,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子临梗,更是在濱河造成了極大的恐慌涡扼,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盟庞,死亡現(xiàn)場離奇詭異吃沪,居然都是意外死亡,警方通過查閱死者的電腦和手機什猖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門票彪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人不狮,你說我怎么就攤上這事降铸。” “怎么了摇零?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵推掸,是天一觀的道長。 經(jīng)常有香客問我驻仅,道長谅畅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任雾家,我火速辦了婚禮铃彰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘芯咧。我一直安慰自己牙捉,他們只是感情好,可當我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布敬飒。 她就那樣靜靜地躺著邪铲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪无拗。 梳的紋絲不亂的頭發(fā)上带到,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天,我揣著相機與錄音英染,去河邊找鬼揽惹。 笑死被饿,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的搪搏。 我是一名探鬼主播狭握,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼疯溺!你這毒婦竟也來了论颅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤囱嫩,失蹤者是張志新(化名)和其女友劉穎恃疯,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體墨闲,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡今妄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鸳碧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛙奖。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖杆兵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情仔夺,我是刑警寧澤琐脏,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站缸兔,受9級特大地震影響日裙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜惰蜜,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一昂拂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧抛猖,春花似錦格侯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至撑教,卻和暖如春朝墩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伟姐。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工收苏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留亿卤,地道東北人。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓鹿霸,卻偏偏與公主長得像排吴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子杜跷,可洞房花燭夜當晚...
    茶點故事閱讀 45,781評論 2 361

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