- 工信部備案號 滇ICP備05000110號-1
- 滇公安備案 滇53010302000111
- 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證 B1.B2-20181647、滇B1.B2-20190004
- 云南互聯(lián)網(wǎng)協(xié)會(huì )理事單位
- 安全聯(lián)盟認證網(wǎng)站身份V標記
- 域名注冊服務(wù)機構許可:滇D3-20230001
- 代理域名注冊服務(wù)機構:新網(wǎng)數碼
通用的微服務(wù)中的解決方案如下圖所示:通過(guò)配置管理平臺下發(fā)恢復發(fā)布策略給網(wǎng)關(guān)層。
我們知道,一個(gè)RPC傳輸協(xié)議的請求報文中,會(huì )包含很多字段:
灰度發(fā)布策略要放在定長(cháng)的header里組,可以根據上圖紅框標識字段做。
如果我們要做多層的灰度發(fā)布,就需要使用數據協(xié)議中的tag。
也就是說(shuō),通過(guò)網(wǎng)關(guān)層上層的NGINX做Header的過(guò)濾來(lái)轉發(fā)流量,
那么,NGINX怎么過(guò)濾呢?
規則按優(yōu)先順序進(jìn)行如下排序:canary-by-header - > canary-by-cookie- > canary-weight
也就是說(shuō),我們通過(guò)請求header中的tag進(jìn)行匹配。將請求轉發(fā)到對應版本的網(wǎng)關(guān)層。
在實(shí)際項目中,灰度發(fā)布還需要考慮數據庫。即灰度和正常流量的數據,應該都是完整的兩份。這樣當灰度上線(xiàn)時(shí),舊版本才能整套下線(xiàn)。
如下圖所示,我們可以在新版數據訪(fǎng)問(wèn)層前面放一個(gè)MQ。當應用向舊的數據訪(fǎng)問(wèn)層寫(xiě)入數據時(shí),數據也向MQ寫(xiě)入一份,保證新版數據訪(fǎng)問(wèn)層是數據是全量的。
在實(shí)際項目中,我不建議過(guò)度依賴(lài)代碼實(shí)現灰度發(fā)布。原因很簡(jiǎn)單:客戶(hù)的應用系統很多,不太可能把代碼都改一遍。此外,微服務(wù)的環(huán)境本身是跨語(yǔ)言的,有Java,JS,python,go等。此外,可以的應用還可能跨物理機、VM、容器,全通過(guò)該代碼是比較費勁的。
這里,我推薦使用Ansible這種“外科手術(shù)式”、“代碼無(wú)侵入”的方式來(lái)實(shí)現。
通過(guò)Ansible發(fā)布NGINX的yaml配置文件(提前把配置寫(xiě)好,歸類(lèi)成不同的文件)、控制業(yè)務(wù)邏輯層到數據訪(fǎng)問(wèn)層的關(guān)系。例如在SpringBoot的application.properties中可以其訪(fǎng)問(wèn)的DB:
當然,這就還牽扯一個(gè)Ansible操作容器云平臺的問(wèn)題。
Ansible調用K8S、OpenShift有以下兩種方式。我們知道,在K8S中,通過(guò)使用不同deployment或者修改一個(gè)deployment中的image,可以發(fā)布指定版本的應用。如果在OpenShift中,我們用ImageStream控制容器鏡像的版本,就更方便了,還能結合S2I的技術(shù),實(shí)現從源碼構建應用。
最后,在介紹一個(gè)通過(guò)Ansible做混合云應用發(fā)布的場(chǎng)景。
也就說(shuō)說(shuō),開(kāi)發(fā)環(huán)境是容器云,生產(chǎn)環(huán)境有VM on AWS和容器云,需要一鍵式發(fā)布應用。
解決的方法就是:
對于生產(chǎn)環(huán)境容器云,發(fā)布容器鏡像,通過(guò)Jenkins Pipeline部署過(guò)去。
對于生產(chǎn)環(huán)境是AWS VM,將開(kāi)發(fā)環(huán)境的war包拷貝到VM的tomcat對應目錄中。
拷貝war包到tomcat的范例如下:
售前咨詢(xún)
售后咨詢(xún)
備案咨詢(xún)
二維碼
TOP