前端系統(tǒng)服務(wù)遷移方案
背景
由于公司內(nèi)部架構(gòu)調(diào)整,原來負(fù)責(zé)的業(yè)務(wù)由橫向支撐昧捷,閉環(huán)到了業(yè)務(wù)部門罐寨。人員也跟著到了業(yè)務(wù)部門下鸯绿,所以需要對(duì)原項(xiàng)目進(jìn)行跨部門遷移。
主要從以下幾點(diǎn)考量遷移的必要性:(涉及到具體業(yè)務(wù)用A幔烛、B指代饿悬,A業(yè)務(wù)代表我負(fù)責(zé)的業(yè)務(wù)狡恬,B業(yè)務(wù)為其他業(yè)務(wù))
-
影響范圍&穩(wěn)定性:項(xiàng)目原架構(gòu)為monorepo,其他包的改動(dòng)會(huì)影響到我們業(yè)務(wù)子包的部署上線祷安,可能會(huì)帶來潛在的第三方線上問題汇鞭。且B業(yè)務(wù)回滾可能會(huì)影響到A業(yè)務(wù)庸追。
- 其他業(yè)務(wù)耦合:B業(yè)務(wù)代碼和我們業(yè)務(wù)代碼走同一條流水線打包部署淡溯,耦合性較高咱娶,且B業(yè)務(wù)代碼目前全部是外包維護(hù),質(zhì)量較差屈糊,會(huì)影響到我們業(yè)務(wù)前端的穩(wěn)定性
-
流程&人力&效率:由于組件架構(gòu)調(diào)整另玖,目前上線還要依賴原團(tuán)隊(duì)oncall審批表伦,原團(tuán)隊(duì)無法隨時(shí)抽調(diào)人力對(duì)商業(yè)化項(xiàng)目進(jìn)行CR/發(fā)版/上線蹦哼,效率低且可控性差纲熏。
-
無代碼合并權(quán)限:原上線部署流程是oncall人員輪班制度锄俄,oncall需要申請(qǐng)權(quán)限奶赠,負(fù)責(zé)原倉庫的所有業(yè)務(wù)的代碼合并發(fā)版上線回滾操作毅戈,合并需要在oncall群統(tǒng)一艾特相關(guān)人員留存記錄愤惰,合并權(quán)限一周后回收宦言。目前脫離原組織架構(gòu)奠旺,無法繼續(xù)走oncall輪班施流,只能依賴原部門前端嫂沉。
image-20231121152010564.png- oncall人力無法隨時(shí)抽調(diào):日常發(fā)版走定時(shí)班車制趟章,無法隨時(shí)match商業(yè)化后端部署節(jié)奏蚓土。緊急上線回滾時(shí)蜀漆,無法隨時(shí)抽調(diào)原團(tuán)隊(duì)人力支持A業(yè)務(wù)項(xiàng)目的發(fā)版/上線/回滾确丢。
-
框架基建:修改框架基建會(huì)影響到其他不屬于A業(yè)務(wù)的子包,需要推動(dòng)原團(tuán)隊(duì)前端進(jìn)行修改和review
-
機(jī)器資源:機(jī)器資源歸屬于原團(tuán)隊(duì)褂始,目前和B業(yè)務(wù)共用同一臺(tái)機(jī)器發(fā)版崎苗,資源不可控
- 原流水線和容器中胆数,包含了其他業(yè)務(wù)線的業(yè)務(wù)互墓,需要拆包部署隔離
一篡撵、調(diào)研
遷移內(nèi)容:項(xiàng)目中原架構(gòu)為monorepo架構(gòu),本次遷移涉及到A1業(yè)務(wù)子包骂租、A2業(yè)務(wù)子包渗饮。(A1互站、A2均為我負(fù)責(zé)的業(yè)務(wù))
時(shí)間deadline:最多一個(gè)月時(shí)間胡桃,排期緊張。
1容贝、可行性
由于本次遷移涉及范圍是兩個(gè)部門之間,涉及到跨部門之景,所以需要和原部門確認(rèn)該業(yè)務(wù)子包是否可遷出斤富,流水線是否可遷出,可以遷出那機(jī)器的配置和容災(zāi)情況要怎么配锻狗,遷出以后是否會(huì)有風(fēng)險(xiǎn)满力。
流程是否可遷移:復(fù)制流水線
容器是否可遷移:生產(chǎn)環(huán)境容器需要1C2G,測(cè)試環(huán)境需要0.5C1G
代碼是否可遷移:可以轻纪,克隆原倉庫
2油额、難點(diǎn)
本次遷移時(shí)間緊急刻帚,到deadline只有一個(gè)月潦嘶,期間需要保障業(yè)務(wù)研發(fā)穩(wěn)定推進(jìn),還要保障遷移有序進(jìn)行我擂。實(shí)操時(shí)間可能不到一周,需要對(duì)整體節(jié)奏規(guī)劃清楚缓艳,面臨的挑戰(zhàn)主要有:
項(xiàng)目代碼復(fù)雜:相互依賴較多校摩,其他業(yè)務(wù)的包也耦合其中,需要剔除阶淘。
功能驗(yàn)證復(fù)雜:涉及海量頁面衙吩,測(cè)試無法覆蓋到所有頁面。
穩(wěn)定性保障:新舊項(xiàng)目需要完全隔離溪窒,互不影響坤塞。
機(jī)器資源:之前沒有做過機(jī)器相關(guān)的工作冯勉;機(jī)器資源需要申請(qǐng),配置也需要同步摹芙。
域名流量切換:切換流量需要做到用戶無感灼狰,且不出故障。
代碼遷移同步:代碼遷移需要做到和源倉庫完全同步浮禾,保障正在開發(fā)中的需求不受影響交胚。
3、如何度量遷移成果
遷移過程中上線0故障
影響范圍縮小到0:原團(tuán)隊(duì)和A業(yè)務(wù)發(fā)版上線隔離盈电,不會(huì)出現(xiàn)公共包部署帶來的潛在第三方問題
流程閉環(huán)效率提升:A業(yè)務(wù)項(xiàng)目發(fā)版上線蝴簇,不依賴其他團(tuán)隊(duì),可以內(nèi)部獨(dú)立上線&回滾匆帚,效率提升熬词,可隨時(shí)match我們部門前后端節(jié)奏發(fā)版,遇到問題回滾更迅速吸重,更加可控
機(jī)器資源閉環(huán):前端部署的容器資源遷移到A業(yè)務(wù)團(tuán)隊(duì)下互拾,不受原團(tuán)隊(duì)縮減機(jī)器成本影響
二、實(shí)施
盤點(diǎn)機(jī)器資源晤锹,申請(qǐng)遷移所需的機(jī)器資源
新建流水線摩幔,將原代碼倉庫部署到新staging容器上,并將staging流量打到新staging容器鞭铆,穩(wěn)定運(yùn)行一段時(shí)間
將原代碼倉庫部署到新prod容器上或衡,通過測(cè)試路由將流量打到新prod容器上,穩(wěn)定運(yùn)行一段時(shí)間
新建代碼倉庫车遂,遷移原代碼封断,并接入新流水線,打通新staging和新prod容器的流量舶担,通過測(cè)試路由進(jìn)行放量測(cè)試
將線上路由打通到新prod容器坡疼,進(jìn)行灰度測(cè)試,穩(wěn)定運(yùn)行后切掉舊機(jī)器流量衣陶,全部遷移到新容器
1柄瑰、遷移功能盤點(diǎn)
域名流量遷移
保持原path不變,公司內(nèi)部網(wǎng)關(guān)代理流量遷移(提供反向代理剪况、訪問控制教沾、HTTPS 等功能,為接入的 Web 應(yīng)用提供安全防護(hù)译断,所有 Web 服務(wù)部署在改服務(wù)的后方授翻。)。
-
機(jī)器遷移
盤點(diǎn)機(jī)器資源
配置復(fù)制原有配置
將打包內(nèi)容部署到新機(jī)器上
流量切換
容災(zāi)策略
穩(wěn)定性保障
-
流程遷移
流水線復(fù)制
代碼合并權(quán)限
上線通知機(jī)器人遷移
-
代碼遷移
倉庫代碼遷移
代碼同步源倉庫
2、設(shè)定里程碑
時(shí)間點(diǎn)進(jìn)行脫敏處理堪唐,大概看下就行巡语。
2023/0x/xx 盤點(diǎn)機(jī)器資源
2023/0x/xx 方案實(shí)施調(diào)研
2023/0x/xx 方案細(xì)化設(shè)計(jì)
2023/0x/xx 創(chuàng)建流水線
2023/0x/xx 部署到公司的靜態(tài)容器
2023/0x/xx 部署到測(cè)試環(huán)境,staging上可訪問到新容器
2023/0x/xx 功能驗(yàn)證
(x月)容災(zāi)策略制定
(x月)灰度流量切換
(x月)穩(wěn)定性保障
(x月)持續(xù)觀測(cè)無問題
(x月底)完成
3淮菠、遷移
創(chuàng)建靜態(tài)容器部署服務(wù)
流水線創(chuàng)建
關(guān)聯(lián)靜態(tài)部署服務(wù)和流水線
創(chuàng)建路由path
-
使用代理服務(wù)器的路由測(cè)試是否可以正常訪問男公,正常會(huì)跨域,服務(wù)跑不通兜材,只要check靜態(tài)資源加載正常就好理澎。
- 例如代理路由為 xiaoqingwa.proxy.com/frontend/index.html
-
通過代理工具(例如whistle)配置本地代理,將線上真實(shí)staging環(huán)境代理到測(cè)試的域名上曙寡,使用真實(shí)staging路由訪問糠爬,可以正常訪問。并且加載的資源也是靜態(tài)部署容器的
- 舉例:線上staging環(huán)境域名為 staging.kuaishou.com/frontend/index.html举庶,我們部署的服務(wù)為xiaoqingwa.proxy.com/frontend/index.html执隧,通過whistle配置
staging.kuaishou.com/frontend/index.html xiaoqingwa.proxy.com/frontend/index.html
這樣就可以通過正式staging域名訪問到我們部署的服務(wù)進(jìn)行測(cè)試了,可以通過靜態(tài)資源返回Header判斷是否是新容器户侥。image-20231121154048590.png
image-20231121154116806.png
- 舉例:線上staging環(huán)境域名為 staging.kuaishou.com/frontend/index.html举庶,我們部署的服務(wù)為xiaoqingwa.proxy.com/frontend/index.html执隧,通過whistle配置
-
到目前為止镀琉,測(cè)試代理路由是成功的,我們就可以著手切線上流量了蕊唐。
- 到公司內(nèi)網(wǎng)網(wǎng)關(guān)根據(jù)不同的路徑匹配規(guī)則配置對(duì)應(yīng)接口流量轉(zhuǎn)發(fā)到新的容器即可屋摔。
image-20231121154405377.png
image-20231121154428538.png
進(jìn)行功能驗(yàn)證、權(quán)限驗(yàn)證沒問題
beta環(huán)境遷移同上替梨,不贅述了
生產(chǎn)環(huán)境遷移
生產(chǎn)環(huán)境目前有五條線路钓试,我們就叫p1,p2,p3,p4,p5。只有p5是走網(wǎng)關(guān)代理配置副瀑,p1-p4走的是Nginx配置
列遷移計(jì)劃
可以現(xiàn)在p5切流測(cè)試弓熏,生產(chǎn)環(huán)境灰度發(fā)布,漸進(jìn)式遷移
升級(jí)回滾方案需要制定糠睡,保障業(yè)務(wù)不出問題
上線Nginx方案待學(xué)習(xí)
遷移admin.p5 (這里不贅述了挽鞠,和staging,beta環(huán)境一模一樣)
遷移p1-p4
**TODO**
4狈孔、功能驗(yàn)證
staging 驗(yàn)證完成
beta 驗(yàn)證完成
prod 待驗(yàn)證 p5驗(yàn)證完成信认,p1-p4待驗(yàn)證
5、穩(wěn)定性保障
需要制定容災(zāi)回滾策略均抽,才可以部署生產(chǎn)環(huán)境嫁赏,流程如下:
具體細(xì)節(jié):
流量切回舊容器:生產(chǎn)環(huán)境除了p5走ap以外,p1-p4域名都是走的Nginx到忽,需要Nginx配置回滾橄教。上線前要明確回滾操作,找到對(duì)應(yīng)接口人輔助喘漏,切忌盲目上線無法回滾护蝶。
三、總結(jié)
遷移之前想清楚為什么要遷移翩迈,遷移的計(jì)劃要列出來持灰,制定里程碑
遷移中每一步都要做好planB,避免系統(tǒng)損失负饲。盡可能在每一步操作前都可以通過一些特定的方法進(jìn)行線下驗(yàn)證再切換到線上堤魁,把控風(fēng)險(xiǎn)。
遷移后要oncall進(jìn)行觀察功能
做好這三點(diǎn)返十,系統(tǒng)遷移基本上可以穩(wěn)定進(jìn)行妥泉。