云原生架構(gòu)下的持續(xù)交付實踐
點擊上方“服務(wù)端思維”,選擇“設(shè)為星標(biāo)”
回復(fù)”669“獲取獨家整理的精選資料集
回復(fù)”加群“加入全國服務(wù)端高端社群「后端圈」
全文約6100字,預(yù)計閱讀時間15分鐘
導(dǎo)讀
1. 微服務(wù)架構(gòu)下效能體系面臨的挑戰(zhàn)
愛番番是典型的 toB 型業(yè)務(wù),具有以下特點:
從產(chǎn)品形態(tài)上,產(chǎn)品戰(zhàn)線長,涵蓋 ( 拓、聊、追、洞察 ) 等核心產(chǎn)品能力。 從市場環(huán)境上,市場環(huán)境環(huán)境競爭異常激烈,對產(chǎn)研的效率與質(zhì)量提出更高的要求。 從研發(fā)模式上,產(chǎn)品與研發(fā)采用敏捷思維研發(fā),需要不斷的創(chuàng)新與試錯,快速完成 PoC及 MVP 產(chǎn)品的研發(fā)上線。 從部署形態(tài)上,除了提供 SaaS 服務(wù)外,同時具有多樣化售賣的訴求。
團隊以業(yè)務(wù)領(lǐng)域劃分的多個?scrumTeam,如下圖:


團隊持續(xù)交付面臨的挑戰(zhàn):
服務(wù)爆炸導(dǎo)致的基礎(chǔ)設(shè)施成本劇增。活躍模塊數(shù) 200+,月均新增模塊 8個,每個模塊需要接入的基礎(chǔ)設(shè)施如下圖,導(dǎo)致需要大量人力進行流水線、監(jiān)控等基礎(chǔ)設(shè)施接入管理維護。
復(fù)雜拓?fù)鋵?dǎo)致的問題定位困難和回歸范圍難以評估。服務(wù)間拓?fù)鋸?fù)雜,導(dǎo)致升級影響難評估、回歸漏測多、線上問題定位困難、環(huán)境規(guī)模龐大,聯(lián)調(diào)測試成本高等問題。
越來越高頻的發(fā)布需求和隨拓?fù)鋸?fù)雜度提升的發(fā)布成本的矛盾。模塊眾多且復(fù)雜拓?fù)洌夷K間上線有依賴關(guān)系,每次上線 100+ 模塊,人工控制流程,風(fēng)險高而且效率越發(fā)低下,但業(yè)務(wù)上發(fā)布的需求愈發(fā)頻繁,在高頻次的發(fā)布下,如何保障發(fā)布過程的高效、安全也是一項極大的挑戰(zhàn)。
2. 云原生架構(gòu)下的持續(xù)交付實踐
為實現(xiàn)團隊高效的價值交付,我們從敏捷機制改進和全流程持續(xù)交付能力提升兩方面開展了建設(shè):
流程機制層面:?用戶價值,流動效率提升為核心的敏捷體系建設(shè),包含以下幾個方面:
敏捷迭代機制:以用戶價值流動效率為核心理念,保障團隊目標(biāo)一致,信息透明。 需求拆分管理:標(biāo)準(zhǔn)化、可視化、自動化的管理機制,在成本可控的前提下達(dá)成小批量需求加速流動,快速驗證價值。 分支模式和環(huán)境管理:基于云原生強大的流量管控能力,實現(xiàn)基于 istio 的全鏈路灰度環(huán)境能力,實現(xiàn)簡潔、靈活、低風(fēng)險的分支模式。 全流程的數(shù)據(jù)度量體系:通過目標(biāo)指標(biāo)度量了解現(xiàn)狀,過程指標(biāo)度量挖掘問題,問題自動創(chuàng)建任務(wù),協(xié)同 peer 推動問題閉環(huán)。
技術(shù)層面:全流程環(huán)節(jié)自動化智能化提升,包含以下幾個方面:
基礎(chǔ)設(shè)施:建設(shè)與業(yè)務(wù)解耦的基礎(chǔ)設(shè)施服務(wù),解決服務(wù)爆炸帶來的成本問題。
自動化:微服務(wù)下合理分層自動化體系,可控投入下保障有效質(zhì)量召回,解決復(fù)雜拓?fù)鋷淼幕貧w漏測問題。
發(fā)布能力:一鍵操作高效執(zhí)行、過程可視、可感知、可控的極致發(fā)布體驗,解決高頻發(fā)布需求下的發(fā)布成本問題。
工具賦能:豐富的工具能力賦能研發(fā)測試各效能痛點環(huán)節(jié),為人員賦能(建設(shè)中,本文暫不詳細(xì)介紹)。

2.1 基礎(chǔ)設(shè)施:與業(yè)務(wù)解耦的 Devops 基礎(chǔ)設(shè)施服務(wù)
什么是與業(yè)務(wù)解耦的基礎(chǔ)設(shè)施?

2.1.1 基礎(chǔ)設(shè)施標(biāo)準(zhǔn)化

2.1.2 聲明式基礎(chǔ)設(shè)施
與業(yè)務(wù)解耦的第二步,是基于標(biāo)準(zhǔn)化的基礎(chǔ)上,建立聲明式的基礎(chǔ)設(shè)施能力。這里的聲明式是指給業(yè)務(wù)團隊聲明式的基礎(chǔ)設(shè)施體驗。業(yè)務(wù)團隊只需要在標(biāo)準(zhǔn)配置中聲明一些基礎(chǔ)屬性,即可自動完成所有基礎(chǔ)設(shè)施的接入,且后續(xù)維護上業(yè)務(wù) 0 成本。主要分為兩個環(huán)節(jié)的建設(shè):
接入時:分鐘級的一鍵接入
我們的做法是通過腳手架為抓手來構(gòu)建基礎(chǔ)設(shè)施的一鍵接入能力。如下圖所示:

腳手架:自動生成框架代碼,包含基礎(chǔ) apm 組件、api 管理平臺等的接入。
configMap:自動生成應(yīng)用標(biāo)準(zhǔn)配置并基于配置新增/變更主動觸發(fā)接入服務(wù)。
接入服務(wù):拉取 configMap 配置并解析,根據(jù)配置內(nèi)容調(diào)度不同的基礎(chǔ)設(shè)施服務(wù)完成接入初始化。
腳手架是我們這邊新模塊創(chuàng)建的入口。所有新代碼庫都是通過腳手架創(chuàng)建,他會幫助開發(fā)自動生成一整套集成了標(biāo)準(zhǔn)組件的代碼框架。
在腳手架創(chuàng)建新模塊的時候,根據(jù)業(yè)務(wù)聲明的模塊屬性,如是否接入 apm、模塊代碼類型、模塊服務(wù)類型等等自動完流水線創(chuàng)建、基礎(chǔ)組件接入、集群環(huán)境申請、配置文件生成等操作。一個新的服務(wù),從創(chuàng)建代碼庫到服務(wù)全套基礎(chǔ)設(shè)施接入完成,服務(wù)可直接部署到測試集群的時間< 10 分鐘。
運行時:根據(jù)服務(wù)聲明內(nèi)容動態(tài)運行,實現(xiàn)業(yè)務(wù)升級維護0成本

2.1.3?智能化基礎(chǔ)設(shè)施
與業(yè)務(wù)解耦的第三步,通過智能化的策略能力,實現(xiàn)高穩(wěn)定的基礎(chǔ)設(shè)施服務(wù)。
服務(wù)化之后,基礎(chǔ)設(shè)施作為獨立運維的服務(wù),所有的問題都需要設(shè)施團隊獨立維護排查,所以與業(yè)務(wù)解耦的第三步就是建立高穩(wěn)定高效低運維成本的基礎(chǔ)設(shè)施能力。我們的思路是通過智能化的策略,來保障高效和穩(wěn)定。在流水線運行的前中后通過策略給流水線增加一個”監(jiān)工”,模擬人工判斷任務(wù)是否應(yīng)該執(zhí)行,模擬人工分析跟進、修復(fù)問題等。

典型場景:

排隊策略:在自動化等任務(wù)執(zhí)行之前,自動檢測依賴環(huán)境是否正常,從而降低運行失敗導(dǎo)致的紅燈。

2.1.4?與業(yè)務(wù)解耦的基礎(chǔ)設(shè)施帶來的收益
成本:模版創(chuàng)建&維護流水線 1000+,降低創(chuàng)建和維護成本 90%。
穩(wěn)定:流水線整體穩(wěn)定性從 85% 提升到 95%, 工具鏈穩(wěn)定性從 95% 提升到 99%。
效率:代碼提交到部署完成 80 分位時間從 30+ 分鐘降低到 10 分鐘。
2.2 自動化:分層自動化體系
解決了服務(wù)暴增的問題,下面我們來看復(fù)雜拓?fù)湎碌幕貧w漏測問題。通常情況下解決回歸的質(zhì)量和效率問題,都會想到自動化測試。但是云原生微服務(wù)架構(gòu)下,什么樣的分層自動化體系,可以既保障召回,又不引入過多的自動化建設(shè)和維護成本呢?和傳統(tǒng) 3 層金字塔自動化不一樣,云原生架構(gòu)下的自動化,由于服務(wù)內(nèi)部相對簡單,而服務(wù)拓?fù)鋸?fù)雜,所以測試的重點是在系統(tǒng)端到端測試,實際的分層測試的比重更像一個倒過來的金字塔。


2.2.1?基于全鏈路灰度環(huán)境的接口DIFF自動化
2.2.1.1?全鏈路灰度方案
我們接口的 DIFF 測試是基于強大的全鏈路灰度環(huán)境能力來建設(shè)的,這是云原生架構(gòu)給我們帶來的紅利。先介紹下我們的全鏈路灰度方案。

2.2.1.2?測試環(huán)境多路復(fù)用
測試環(huán)境多路復(fù)用是指,使用有限的資源,在一套基礎(chǔ)環(huán)境上邏輯隔離出多套環(huán)境,支持并行開發(fā)、聯(lián)調(diào)的需求。
如下圖所示,不同的分支對應(yīng)著不同的 feature,通過流量染色 + 流量規(guī)則路由的方式,使得不同分支擁有邏輯上隔離的環(huán)境,支持并行開發(fā)。在前端給流量打上橘色標(biāo)記之后,全鏈路的請求會走橘色的鏈路進行訪問。

2.2.1.3?基于多路復(fù)用的 DIFF 測試

基于流量回放的接口 diff,最大限度的覆蓋線上用戶真實場景。
全流程自動化,無人工參與。
配置化的流量篩選策略和 diff 策略接入,便于擴展優(yōu)化。
分布式任務(wù)運行,支持大批量并發(fā)。
2.2.2?保障召回服務(wù)間調(diào)用問題的契約測試
2.2.2.1?什么是契約測試
微服務(wù)的架構(gòu),服務(wù)之間依賴復(fù)雜,而且通常每個服務(wù)都是獨立的團隊維護,服務(wù)和服務(wù)之間,前后端之間大多通過 API 調(diào)用。那么這種情況下可能就會出現(xiàn)如下場景:A 團隊開發(fā)的 API 同時服務(wù)于 B\C 團隊。最開始測試的時候都是通過的。但是后續(xù)迭代中,B 團隊對字段 A 有一些調(diào)整的需求,A 團隊根據(jù)需求改了,也測試通過了,但是上線后發(fā)現(xiàn) C 團隊功能異常了。
以上問題的本質(zhì)原因為:
服務(wù)提供方服務(wù)的消費者越來越多的情況下,服務(wù)的變更影響難以評估,服務(wù)的變更也不能及時同步到所有消費者,所以往往是消費方發(fā)現(xiàn)問題了反饋,導(dǎo)致?lián)p失。為了避免上述問題,我們引入了契約測試。
契約測試的核心思路是通過消費者驅(qū)動的方式,建立服務(wù)端和各個消費端之前的契約,在服務(wù)端有修改之后,通過測試和所有消費方之前的契約是否被毀壞來保障服務(wù)升級的安全性。同時,契約也可以作為雙方測試解耦的手段。通過契約測試,團隊能以一種離線的方式 ( 不需要消費者、提供者同時在線 ),通過契約作為中間的標(biāo)準(zhǔn),驗證提供者提供的內(nèi)容是否滿足消費者的期望。
2.2.2.2?常見的契約測試方案
常見的契約測試方案有真正實踐消費者驅(qū)動的如 pact,契約由消費端生成并維護,提供方代碼更新之后,拉取所有消費方契約進行測試,即解決了集成測試解耦問題,又保障了服務(wù)方能滿足所有消費方需求。( 下左圖 )

2.2.2.3?愛番番的契約測試方案
愛番番的方案則是取了折中。一方面由于團隊習(xí)慣,契約一直是服務(wù)提供方給出,另一方面又希望保留消費者驅(qū)動特性,從而保障服務(wù)方能滿足所有消費方需求。我們選擇了在提供方生成契約,但是通過線上日志和調(diào)用鏈解析的方式來補充模擬消費端契約case。且整個過程全自動化。

2.2.3?問題智能定位降低自動化維護成本

比如,環(huán)境問題會自動重試,批量未知會發(fā)送到自動化小組進行排查,元素找不到會發(fā)送到業(yè)務(wù) QA 排查。

2.3 發(fā)布能力:高效安全的持續(xù)發(fā)布
2.3.1?發(fā)布困境
不同類型模塊對接了不同的發(fā)布平臺和流程,統(tǒng)一發(fā)布困難,底層發(fā)布方式的變更需要各模塊升級,遷移成本高。
由于模塊眾多且復(fù)雜拓?fù)洌夷K間上線有依賴關(guān)系,每次上線 100+ 模塊,人工控制流程,風(fēng)險高而且效率低。上線過程的的記錄和分析人耗也很高。
整體上線過程不可見,風(fēng)險感知滯后。
如何解決以上問題?
2.3.2?多平臺部署引擎

2.3.3?發(fā)布劇本設(shè)計
有了統(tǒng)一的發(fā)布平臺之后,為了解決上線過程復(fù)雜低效的問題,我們希望實現(xiàn)完全自動化的發(fā)布過程。

2.3.4?過程可視、可感知、可控的一鍵發(fā)布
有了自動化分發(fā)布過程之后,為了能夠及時感知發(fā)布過程中的問題,降低發(fā)布風(fēng)險,進行了發(fā)布過程可視化建設(shè),并與 APM、金絲雀發(fā)布等策略結(jié)合,保障發(fā)布的安全。

金絲雀發(fā)布策略:發(fā)布無損、風(fēng)險及時感知并召回。

3. 整體收益

迭代 story 量增長 85.8%,發(fā)布周期穩(wěn)定,研發(fā)測試周期下降 30%,千行?bug 率從 1.5 降低到 0.5。
4. 未來展望
Local 工具箱賦能開發(fā)效能,通過 IDE 本地插件工具,賦能開發(fā)編碼測試過程,提升研發(fā)環(huán)節(jié)效能。
智能風(fēng)險識別,通過白盒能力,構(gòu)建質(zhì)量風(fēng)險識別體系,應(yīng)用于準(zhǔn)入、準(zhǔn)出、灰度等場景。
5.?作者介紹
烏拉,在百度愛番番主要負(fù)責(zé)團隊持續(xù)交付建設(shè)。
— 本文結(jié)束 —

●?漫談設(shè)計模式在 Spring 框架中的良好實踐
關(guān)注我,回復(fù) 「加群」 加入各種主題討論群。
對「服務(wù)端思維」有期待,請在文末點個在看
喜歡這篇文章,歡迎轉(zhuǎn)發(fā)、分享朋友圈


