基于Nginx實現(xiàn)灰度發(fā)布的詳細流程
灰度發(fā)布概述
軟件開發(fā)過程中,通常不會直接推出最終版本,而是通過逐步迭代的方式進行降低風險。
灰度發(fā)布系統(tǒng)的核心是將用戶流量分成不同部分,一部分用戶使用新版本,而另一部分用戶繼續(xù)使用舊版本。通過控制流量比例,例如最初只有 5% 的用戶使用新版本,如果沒有問題,比例可以逐步提高到 10%、50%,最終實現(xiàn) 100% 用戶使用新版本。這種方法可以最大程度地減少潛在問題對用戶的影響。
除了逐步推出新版本外,灰度發(fā)布系統(tǒng)還可用于產(chǎn)品的 A/B 測試。通過將流量分成兩部分,一部分用戶使用 A 版本,另一部分用戶使用 B 版本,可以測試哪個版本更有利于業(yè)務。
灰度發(fā)布的流程
- 用戶首次請求時,根據(jù)設(shè)定的比例隨機設(shè)置 cookie,實現(xiàn)流量染色。
- 用戶再次訪問時,根據(jù) cookie 轉(zhuǎn)發(fā)至不同版本的服務。
- 后端根據(jù) cookie 請求不同的服務,前端根據(jù) cookie 執(zhí)行不同邏輯。

實現(xiàn)灰度發(fā)布
其灰度發(fā)布通常是通過 Nginx 實現(xiàn)的。Nginx 是一個反向代理服務,可以將用戶請求轉(zhuǎn)發(fā)給具體的應用服務器,這一層也被稱為網(wǎng)關(guān)層。在網(wǎng)關(guān)層,可以控制流量分配,決定哪些流量使用 A 版本,哪些使用 B 版本。
創(chuàng)建 nest
創(chuàng)建個 nest 項目開啟兩個端口,一個 3000,一個 3001:
npx nest new gray_test -p npm
分別訪問返回 Hello111 和 Hello 222:


現(xiàn)在我們就有了兩個版本的 nest 代碼。
使用 docker 運行 nginx 服務
設(shè)置容器名為 gray1,端口映射宿主機的 82 到容器內(nèi)的 80:

現(xiàn)在訪問 http://localhost:82/ 就可以看到 nginx 頁面了:

繼續(xù)跑個 nginx 容器:

容器名為 gray2,端口映射 83 到容器內(nèi)的 80。
掛載目錄不變。
修改 Nginx 配置文件,設(shè)置路由規(guī)則,將特定請求轉(zhuǎn)發(fā)給指定的服務
把配置文件復制出來:
docker cp gray1:/etc/nginx/conf.d/default.conf ~/nginx-config

編輯復制文件:
# 定義一個location塊,用于處理以/api開頭的請求
location ^~ /api {
# 使用rewrite模塊來重寫請求的URI
# 將請求中/api/(.*)的部分重寫為/$1,即去掉/api前綴
# 'break'標志表示停止后續(xù)的重寫操作
rewrite ^/api/(.*)$/$1 break;
# 將重寫后的請求代理到后端服務器
# 請求將被轉(zhuǎn)發(fā)到192.168.0.100:3001這個地址
proxy_pass http://192.168.0.100:3001;
}
然后我們訪問下 http://localhost:83/api/:

創(chuàng)建多組 upstream,分別代表不同版本的服務
之前負載均衡的時候,是這么配的:

現(xiàn)在我們需要配置多組 upstream:
# 定義上游服務器組,用于版本1.0的服務
upstream version1.0_server {
server 192.168.0.100:3000; # 指定服務器IP地址和端口號
}
# 定義上游服務器組,用于版本2.0的服務
upstream version2.0_server {
server 192.168.0.100:3001; # 指定服務器IP地址和端口號
}
# 定義默認的上游服務器組,當請求沒有指定版本時使用
upstream default {
server 192.168.0.100:3000; # 指定默認的服務器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;
}

測試驗證
我們重新跑下容器:

訪問 http://localhost:83/api/ 走到的就是默認的版本:

帶上 version=2.0 的 cookie,走到的就是另一個版本的代碼:

以上就是基于Nginx實現(xiàn)灰度發(fā)布的詳細流程的詳細內(nèi)容,更多關(guān)于Nginx灰度發(fā)布的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Nginx實現(xiàn)UDP四層轉(zhuǎn)發(fā)的過程
為了解決VPN連接速度慢的問題,可以通過Nginx實現(xiàn)UDP的四層轉(zhuǎn)發(fā),首先檢查Nginx是否安裝了with-stream模塊,然后修改nginx.conf配置文件進行UDP端口的轉(zhuǎn)發(fā)設(shè)置,使用nginx-t檢查配置文件語法,無誤后重新加載Nginx,這樣通過國內(nèi)服務器中轉(zhuǎn),可以提升連接到國外服務器的速率2024-09-09
詳解Linux環(huán)境下使Nginx服務器支持中文url的配置流程
這篇文章主要介紹了Linux環(huán)境下使Nginx服務器支持中文url的配置流程,文中還介紹了一個在Linux下將非UTF-8的文件名轉(zhuǎn)換為UTF-8編碼,的方法,需要的朋友可以參考下2016-04-04
Nginx配置動態(tài)代理后通過curl訪問報403問題
本文主要介紹了Nginx配置動態(tài)代理后通過curl訪問報403問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-06-06

