基于Nginx實(shí)現(xiàn)灰度發(fā)布的詳細(xì)流程
灰度發(fā)布概述
軟件開發(fā)過程中,通常不會直接推出最終版本,而是通過逐步迭代的方式進(jìn)行降低風(fēng)險(xiǎn)。
灰度發(fā)布系統(tǒng)的核心是將用戶流量分成不同部分,一部分用戶使用新版本,而另一部分用戶繼續(xù)使用舊版本。通過控制流量比例,例如最初只有 5% 的用戶使用新版本,如果沒有問題,比例可以逐步提高到 10%、50%,最終實(shí)現(xiàn) 100% 用戶使用新版本。這種方法可以最大程度地減少潛在問題對用戶的影響。
除了逐步推出新版本外,灰度發(fā)布系統(tǒng)還可用于產(chǎn)品的 A/B 測試。通過將流量分成兩部分,一部分用戶使用 A 版本,另一部分用戶使用 B 版本,可以測試哪個版本更有利于業(yè)務(wù)。
灰度發(fā)布的流程
- 用戶首次請求時,根據(jù)設(shè)定的比例隨機(jī)設(shè)置 cookie,實(shí)現(xiàn)流量染色。
- 用戶再次訪問時,根據(jù) cookie 轉(zhuǎn)發(fā)至不同版本的服務(wù)。
- 后端根據(jù) cookie 請求不同的服務(wù),前端根據(jù) cookie 執(zhí)行不同邏輯。
實(shí)現(xiàn)灰度發(fā)布
其灰度發(fā)布通常是通過 Nginx 實(shí)現(xiàn)的。Nginx 是一個反向代理服務(wù),可以將用戶請求轉(zhuǎn)發(fā)給具體的應(yīng)用服務(wù)器,這一層也被稱為網(wǎng)關(guān)層。在網(wǎng)關(guān)層,可以控制流量分配,決定哪些流量使用 A 版本,哪些使用 B 版本。
創(chuàng)建 nest
創(chuàng)建個 nest 項(xiàng)目開啟兩個端口,一個 3000,一個 3001:
npx nest new gray_test -p npm
分別訪問返回 Hello111 和 Hello 222:
現(xiàn)在我們就有了兩個版本的 nest 代碼。
使用 docker 運(yùn)行 nginx 服務(wù)
設(shè)置容器名為 gray1,端口映射宿主機(jī)的 82 到容器內(nèi)的 80:
現(xiàn)在訪問 http://localhost:82/ 就可以看到 nginx 頁面了:
繼續(xù)跑個 nginx 容器:
容器名為 gray2,端口映射 83 到容器內(nèi)的 80。
掛載目錄不變。
修改 Nginx 配置文件,設(shè)置路由規(guī)則,將特定請求轉(zhuǎn)發(fā)給指定的服務(wù)
把配置文件復(fù)制出來:
docker cp gray1:/etc/nginx/conf.d/default.conf ~/nginx-config
編輯復(fù)制文件:
# 定義一個location塊,用于處理以/api開頭的請求 location ^~ /api { # 使用rewrite模塊來重寫請求的URI # 將請求中/api/(.*)的部分重寫為/$1,即去掉/api前綴 # 'break'標(biāo)志表示停止后續(xù)的重寫操作 rewrite ^/api/(.*)$/$1 break; # 將重寫后的請求代理到后端服務(wù)器 # 請求將被轉(zhuǎn)發(fā)到192.168.0.100:3001這個地址 proxy_pass http://192.168.0.100:3001; }
然后我們訪問下 http://localhost:83/api/:
創(chuàng)建多組 upstream,分別代表不同版本的服務(wù)
之前負(fù)載均衡的時候,是這么配的:
現(xiàn)在我們需要配置多組 upstream:
# 定義上游服務(wù)器組,用于版本1.0的服務(wù) upstream version1.0_server { server 192.168.0.100:3000; # 指定服務(wù)器IP地址和端口號 } # 定義上游服務(wù)器組,用于版本2.0的服務(wù) upstream version2.0_server { server 192.168.0.100:3001; # 指定服務(wù)器IP地址和端口號 } # 定義默認(rèn)的上游服務(wù)器組,當(dāng)請求沒有指定版本時使用 upstream default { server 192.168.0.100:3000; # 指定默認(rèn)的服務(wù)器IP地址和端口號 }
根據(jù)請求中的 cookie 決定流量轉(zhuǎn)發(fā)的版本
set $group "default"; if ($http_cookie ~* "version=1.0"){ set $group version1.0_server; } if ($http_cookie ~* "version=2.0"){ set $group version2.0_server; } location ^~ /api { rewrite ^/api/(.*)$ /$1 break; proxy_pass http://$group; }
測試驗(yàn)證
我們重新跑下容器:
訪問 http://localhost:83/api/ 走到的就是默認(rèn)的版本:
帶上 version=2.0 的 cookie,走到的就是另一個版本的代碼:
以上就是基于Nginx實(shí)現(xiàn)灰度發(fā)布的詳細(xì)流程的詳細(xì)內(nèi)容,更多關(guān)于Nginx灰度發(fā)布的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Nginx實(shí)現(xiàn)瀏覽器可實(shí)時查看訪問日志的步驟詳解
我們經(jīng)常需要在頁面上實(shí)時查看nginx的日志輸出,并且能在頁面上顯示,那么下面小編就給大家說下怎么在瀏覽器上實(shí)時動態(tài)的查看nginx的訪問日志,有需要的朋友們可以參考借鑒。2016-09-09Nginx正反向代理及負(fù)載均衡等功能實(shí)現(xiàn)配置代碼實(shí)例
這篇文章主要介紹了Nginx正反向代理及負(fù)載均衡等功能實(shí)現(xiàn)配置代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11Nginx部署項(xiàng)目上傳文件報(bào)錯413的解決方法
本文主要介紹了Nginx部署項(xiàng)目上傳文件報(bào)錯413的解決方法,報(bào)錯413是因?yàn)镹ginx對上傳大小做了限制,所以我們需要配置文件,下面就來解決這個問題,感興趣的可以了解一下2024-03-03