【JAVA】全鏈路灰度發(fā)布的實(shí)踐分享

本文作者:曹磊,碧桂園服務(wù)技術(shù)經(jīng)理荞雏,一個喜歡研究新技術(shù)方向的代碼玩家

引言

在日常發(fā)布中轴合,如何保證系統(tǒng)的高可用及穩(wěn)定性创坞,是我們始終以來的重要任務(wù)。我們深知一個可靠受葛、高效的系統(tǒng)對用戶體驗(yàn)和業(yè)務(wù)運(yùn)行的關(guān)鍵性作用题涨。

在軟件發(fā)布與功能驗(yàn)證的環(huán)節(jié),我們?nèi)匀粫媾R許許多多的挑戰(zhàn)奔坟,全鏈路灰度發(fā)布方案專為微服務(wù)架構(gòu)設(shè)計携栋,旨在應(yīng)對微服務(wù)架構(gòu)下的灰度發(fā)布挑戰(zhàn)。

1?前版本發(fā)布策略的現(xiàn)狀及存在的問題

目前咳秉,大部分系統(tǒng)都是應(yīng)用了基于k8s容器的滾動發(fā)布方案婉支,或者在滾動發(fā)布的邏輯上,實(shí)現(xiàn)了優(yōu)雅停機(jī)的邏輯澜建。

1.1 現(xiàn)狀

優(yōu)雅停服1個節(jié)點(diǎn)向挖,保留其他節(jié)點(diǎn)依然提供生產(chǎn)服務(wù);

通過日志炕舵,觀察一段時間何之,看新的節(jié)點(diǎn)是否運(yùn)行正常。如果不正常咽筋,就回滾版本溶推;

如果運(yùn)行正常,繼續(xù)1奸攻、2的步驟蒜危,一直到所有節(jié)點(diǎn)部署完成;

測試人員上生產(chǎn)做基本驗(yàn)證睹耐。

1.2 存在問題

不能有效的控制灰度流量辐赞,導(dǎo)致測試人員要全部節(jié)點(diǎn)部署完,才可以做生產(chǎn)驗(yàn)證硝训;

目前的滾動發(fā)布邏輯响委,無法做到增量更新,一旦新版本出了問題窖梁,肯定會影響到生產(chǎn)的運(yùn)行赘风;

難以實(shí)現(xiàn)全天候平滑穩(wěn)定的發(fā)版;

如果版本發(fā)布涉及不同服務(wù)之間的依賴關(guān)系窄绒,或者前后端都需要調(diào)整贝次,當(dāng)前策略無法一步到位滿足全鏈路灰度測試場景。

2?業(yè)界常用的軟件發(fā)布策略對比

3 什么是灰度發(fā)布彰导?為什么需要采用灰度發(fā)布蛔翅?

3.1 什么是灰度發(fā)布?

灰度發(fā)布位谋,簡單來說就是先小范圍進(jìn)行版本發(fā)布山析,充分驗(yàn)證功能符合預(yù)期后,再逐步擴(kuò)大發(fā)布范圍掏父。如果出現(xiàn)負(fù)面反饋或功能異常時笋轨,則需要停止放量,回滾到原先的穩(wěn)定版本赊淑。

從技術(shù)上來說爵政,灰度發(fā)布是一種流量控制方案,對服務(wù)的請求流量按用戶或者其它特性打標(biāo)簽陶缺,保證特定標(biāo)簽的流量只經(jīng)過特定標(biāo)簽的服務(wù)路徑钾挟。

3.2 為什么采用灰度發(fā)布?

1饱岸、降低發(fā)布風(fēng)險

在新版本發(fā)布之前掺出,通過灰度發(fā)布把新版本先部署到一小部分用戶,以便能更快地發(fā)現(xiàn)并解決潛在的問題苫费。

2汤锨、提高發(fā)布質(zhì)量

因?yàn)樵诨叶劝l(fā)布期間可以及時發(fā)現(xiàn)和解決問題,所以能夠在全量發(fā)布之前不斷完善代碼質(zhì)量百框,提高系統(tǒng)穩(wěn)定性和可靠性闲礼。

3、優(yōu)化用戶體驗(yàn)

在灰度發(fā)布期間铐维,我們可以根據(jù)用戶反饋來針對性地優(yōu)化產(chǎn)品功能和界面柬泽,確保用戶使用的體驗(yàn)最佳。

4方椎、降低對系統(tǒng)性能的影響

由于灰度發(fā)布只向部分用戶發(fā)布新版本聂抢,所以能夠限制新版本對整個系統(tǒng)的影響。

4?全鏈路灰度發(fā)布的實(shí)現(xiàn)思路

全鏈路流量路由目前有兩種主流實(shí)現(xiàn):

1棠众、基于 Istio

采用 Istio 這個開源 Service Mesh 組件琳疏,通過在每個服務(wù)的容器中部署 Envoy 透明代理,攔截服務(wù)之間的網(wǎng)絡(luò)通信并按指定規(guī)則轉(zhuǎn)發(fā)闸拿,從而實(shí)現(xiàn)了全鏈路流量路由空盼,無需對現(xiàn)有代碼進(jìn)行修改。

2新荤、基于服務(wù)發(fā)現(xiàn)組件

通過支持為服務(wù)設(shè)置元數(shù)據(jù)的服務(wù)注冊中心揽趾,如 Nacos,可以標(biāo)記服務(wù)實(shí)例的特征苛骨,例如灰度版本篱瞎。每個服務(wù)可以通過注冊中心獲取其他服務(wù)實(shí)例的版本信息苟呐,并通過修改代碼邏輯或 Java Agent 實(shí)現(xiàn)流量路由

接下來,我們詳細(xì)來講基于服務(wù)發(fā)現(xiàn)組件來實(shí)現(xiàn)灰度發(fā)布邏輯的方案俐筋。

5?灰度發(fā)布邏輯工程實(shí)踐

5.1 灰度鏈路流程圖

5.2?后端代碼改造

代碼改造原理是通過Spring Cloud的默認(rèn)負(fù)載均衡器LoadBalancer牵素,結(jié)合nacos提供的注冊中心和配置中心,實(shí)現(xiàn)基于微服務(wù)網(wǎng)關(guān)調(diào)用和服務(wù)間OpenFeign調(diào)用的生產(chǎn)和灰度隔離澄者。

以下代碼是以Loadbalancer為例笆呆,擴(kuò)展的灰度邏輯,如果目前系統(tǒng)基于Ribbon,可以考慮使用Loadbalancer替換掉Ribbon,也可以直接基于Ribbon定義自己的灰度負(fù)載均衡邏輯粱挡,實(shí)現(xiàn)方法在本文中不做詳細(xì)描述赠幕。

步驟1:指定灰度啟動節(jié)點(diǎn)

指定灰度節(jié)點(diǎn)與生產(chǎn)節(jié)點(diǎn),用于負(fù)載均衡器按規(guī)則選擇不同的鏈路询筏,用于區(qū)別流量榕堰,建設(shè)jenkins部署腳本時,設(shè)置在啟動項(xiàng)里面屈留。

步驟2:灰度負(fù)載均衡邏輯的實(shí)現(xiàn)

Spring Cloud的負(fù)載均衡邏輯局冰,無論負(fù)載均衡器是LoadBalancer或者是Ribbon,默認(rèn)邏輯都是輪循邏輯灌危,可以保證每一個上線節(jié)點(diǎn)瀏量的平均分配康二,但是無法保證灰度策略的實(shí)現(xiàn),因此勇蝙,必須得重新定義新的負(fù)載均衡邏輯沫勿。?

步驟3:開啟灰度負(fù)載均衡策略

步驟4:Feign服務(wù)調(diào)用

注意,feign調(diào)用需要定義一個默認(rèn)攔截器味混,將請求中的灰度標(biāo)識繼續(xù)往下傳产雹,另外,除此之外翁锡,調(diào)用的服務(wù)模塊啟動的時候蔓挖,仍然需要在啟動項(xiàng)上,添加開啟灰度負(fù)載均衡代碼馆衔,如上圖瘟判。

5.3?前臺灰度發(fā)布邏輯改造

前臺灰度發(fā)布無需涉及到前臺代碼的改造,基于ingress/nginx角溃,通過對于Cookies的指定參數(shù)進(jìn)行判斷拷获,判斷是否訪問灰度節(jié)點(diǎn)或者生產(chǎn)節(jié)點(diǎn),所以减细,仍然只需要在登錄的時候匆瓜,判斷一下當(dāng)前登錄用戶的穩(wěn)定標(biāo)識,進(jìn)行是否需要進(jìn)行灰度驗(yàn)證。

5.4?網(wǎng)關(guān)節(jié)點(diǎn)如何灰度發(fā)布驮吱?

以上后端服務(wù)各個節(jié)點(diǎn)的灰度方案茧妒,基本上都是基于負(fù)載均衡規(guī)則改寫得以實(shí)現(xiàn),對于網(wǎng)關(guān)節(jié)點(diǎn)的負(fù)載改造糠馆,其實(shí)也是類似于前臺灰度發(fā)布邏輯嘶伟,通過ingress/nginx得以實(shí)現(xiàn)怎憋,我們只需要在請求頭中帶上灰度節(jié)點(diǎn)標(biāo)識又碌,就可以請求到灰度網(wǎng)關(guān)節(jié)點(diǎn),完成功能性驗(yàn)證绊袋。

6 成果展示

全鏈路灰度發(fā)布方案自創(chuàng)新部門應(yīng)用并實(shí)施以來毕匀,首批試點(diǎn)項(xiàng)目(API能力共享平臺,數(shù)據(jù)交換總線)已經(jīng)完成改造癌别,對業(yè)務(wù)產(chǎn)生了積極的促進(jìn)作用皂岔,為A/B測試打下堅實(shí)的技術(shù)底座:

①可全天候?qū)崿F(xiàn)系統(tǒng)用戶零感知平滑升級。

②可以實(shí)現(xiàn)前后端一起發(fā)布驗(yàn)證展姐,可以動態(tài)擴(kuò)大灰度范圍躁垛。

③可以極大的減少線上事故率,保證系統(tǒng)的穩(wěn)定性與高可用圾笨,提升用戶體驗(yàn)教馆。

7 總結(jié)

灰度發(fā)布是一種有效的軟件發(fā)布策略,能夠在保證系統(tǒng)穩(wěn)定性的同時擂达,提高軟件的質(zhì)量和可靠性土铺。通過逐步擴(kuò)大新版本服務(wù)的流量實(shí)現(xiàn)滑升級和容錯處理板鬓,微服務(wù)灰度發(fā)布設(shè)計為現(xiàn)代軟件開發(fā)帶來了諸多優(yōu)勢悲敷。然而,也需要注意其可能帶來的性能下降俭令、復(fù)雜性和開發(fā)成本增加等挑戰(zhàn)后德。

在進(jìn)行微服務(wù)灰度發(fā)布設(shè)計時,需要充分考慮實(shí)際業(yè)務(wù)需求和應(yīng)用場景抄腔,制定合適的發(fā)布策略瓢湃,并對潛在的風(fēng)險進(jìn)行有效控制

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妓柜,一起剝皮案震驚了整個濱河市箱季,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌棍掐,老刑警劉巖藏雏,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡掘殴,警方通過查閱死者的電腦和手機(jī)赚瘦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奏寨,“玉大人起意,你說我怎么就攤上這事〔⊥” “怎么了揽咕?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長套菜。 經(jīng)常有香客問我亲善,道長,這世上最難降的妖魔是什么逗柴? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任蛹头,我火速辦了婚禮,結(jié)果婚禮上戏溺,老公的妹妹穿的比我還像新娘渣蜗。我一直安慰自己,他們只是感情好旷祸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布耕拷。 她就那樣靜靜地躺著,像睡著了一般肋僧。 火紅的嫁衣襯著肌膚如雪斑胜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天嫌吠,我揣著相機(jī)與錄音止潘,去河邊找鬼。 笑死辫诅,一個胖子當(dāng)著我的面吹牛凭戴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播炕矮,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼么夫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了肤视?” 一聲冷哼從身側(cè)響起档痪,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎邢滑,沒想到半個月后腐螟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年乐纸,在試婚紗的時候發(fā)現(xiàn)自己被綠了衬廷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡汽绢,死狀恐怖吗跋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宁昭,我是刑警寧澤跌宛,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站久窟,受9級特大地震影響秩冈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜斥扛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望丹锹。 院中可真熱鬧,春花似錦、人聲如沸巍虫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽租漂。三九已至阶女,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間哩治,已是汗流浹背秃踩。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留业筏,地道東北人憔杨。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像蒜胖,于是被迫代替她去往敵國和親消别。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355

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