欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于Nginx實(shí)現(xiàn)一個(gè)灰度上線系統(tǒng)的示例代碼

 更新時(shí)間:2023年07月10日 14:49:21   作者:zxg_神說要有光  
本文主要介紹了基于Nginx實(shí)現(xiàn)一個(gè)灰度上線系統(tǒng)的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

軟件開發(fā)一般不會(huì)上來就是最終版本,而是會(huì)一個(gè)版本一個(gè)版本的迭代。

新版本上線前都會(huì)經(jīng)過測(cè)試,但就算這樣,也不能保證上線了不出問題。

所以,在公司里上線新版本代碼一般都是通過灰度系統(tǒng)。

灰度系統(tǒng)可以把流量劃分成多份,一份走新版本代碼,一份走老版本代碼。

而且灰度系統(tǒng)支持設(shè)置流量的比例,比如可以把走新版本代碼的流程設(shè)置為 5%,沒啥問題再放到 10%,50%,最后放到 100% 全量。

這樣可以把出現(xiàn)問題的影響降到最低。

不然一上來就全量,萬(wàn)一出了線上問題,那就是大事故。

而且灰度系統(tǒng)不止這一個(gè)用途,比如產(chǎn)品不確定某些改動(dòng)是不是要的,就要做 AB 實(shí)驗(yàn),也就是要把流量分成兩份,一份走 A 版本代碼,一份走 B 版本代碼。

那這樣的灰度系統(tǒng)是怎么實(shí)現(xiàn)的呢?

其實(shí)很多都是用 nginx 實(shí)現(xiàn)的。

nginx 是一個(gè)反向代理的服務(wù),用戶請(qǐng)求發(fā)給它,由它轉(zhuǎn)發(fā)給具體的應(yīng)用服務(wù)器。

這一層也叫做網(wǎng)關(guān)層。

由它負(fù)責(zé)轉(zhuǎn)發(fā)請(qǐng)求給應(yīng)用服務(wù)器,那自然就可以在這里控制流量的分配,哪些流量走版本 A,哪些流量走版本 B。

下面我們實(shí)現(xiàn)一下:

首先,我們準(zhǔn)備兩個(gè)版本的代碼。

這里創(chuàng)建個(gè) nest 項(xiàng)目:

npx nest new gray_test -p npm

把 nest 服務(wù)跑起來:

npm run start

瀏覽器訪問下:

看到 hello world 代表 nest 服務(wù)跑起來了。

然后改下 AppService:

修改下端口:

然后再 npm run start

瀏覽器訪問下:

現(xiàn)在我們就有了兩個(gè)版本的 nest 代碼。

接下來的問題是,如何用 nginx 實(shí)現(xiàn)灰度,讓一部分請(qǐng)求走一個(gè)版本的代碼,一部分請(qǐng)求走另一個(gè)版本呢?

我們先跑一個(gè) nginx 服務(wù)。

docker desktop 搜索 nginx 鏡像(這步需要科學(xué)上網(wǎng)),點(diǎn)擊 run:

設(shè)置容器名為 gray1,端口映射宿主機(jī)的 82 到容器內(nèi)的 80

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

我們要修改下配置文件,把它復(fù)制出來:

docker cp gray1:/etc/nginx/conf.d ~/nginx-config

然后編輯下這個(gè) default.conf

添加這么一行配置:

location ^~ /api {
    rewrite ^/api/(.*)$ /$1 break;
    proxy_pass http://192.168.1.6:3001;
}

這行就是加了一個(gè)路由,把 /api/ 開頭的請(qǐng)求轉(zhuǎn)發(fā)給 http://宿主機(jī)IP:3001 這個(gè)服務(wù)。

用 rewrite 把 url 重寫了,比如 /api/xxx 變成了 /xxx。

然后我們重新跑個(gè) nginx 容器:

容器名為 gray2,端口映射 83 到容器內(nèi)的 80。

指定數(shù)據(jù)卷,掛載本地的 ~/nginx-config 目錄到容器內(nèi)的 /etc/nginx/conf.d 目錄。

點(diǎn)擊 run。

然后看下 files 部分:

可以看到容器內(nèi)的 /etc/nginx/conf.d 目錄標(biāo)識(shí)為了 mounted。

點(diǎn)開看看:

這就是本地的那個(gè)文件。

我們?cè)诒镜馗囊幌略囋嚕?/p>

容器內(nèi)也同樣修改了。

在容器內(nèi)修改這個(gè)文件,本地同樣也會(huì)修改。

也就是說掛載數(shù)據(jù)卷之后,容器內(nèi)的這個(gè)目錄就是本地目錄,是同一份。

然后我們?cè)L問下 http://localhost:83/api/ 看看:

nest 服務(wù)訪問成功了。

現(xiàn)在我們不是直接訪問 nest 服務(wù)了,而是經(jīng)歷了一層 nginx 反向代理或者說網(wǎng)關(guān)層。

自然,我們可以在這一層實(shí)現(xiàn)流量控制的功能。

前面我們講負(fù)載均衡的時(shí)候,是這么配的:

默認(rèn)會(huì)輪詢把請(qǐng)求發(fā)給 upstream 下的 server。

現(xiàn)在需要有多組 upstream:

upstream version1.0_server {
    server 192.168.1.6:3000;
}
upstream version2.0_server {
    server 192.168.1.6:3001;
}
upstream default {
    server 192.168.1.6:3000;
}

有版本 1.0 的、版本 2.0 的,默認(rèn)的 server 列表。

然后需要根據(jù)某個(gè)條件來區(qū)分轉(zhuǎn)發(fā)給哪個(gè)服務(wù)。

我們這里根據(jù) cookie 來區(qū)分:

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;
}

如果包含 version=1.0 的 cookie,那就走 version1.0_server 的服務(wù),有 version=2.0 的 cookie 就走 version2.0_server 的服務(wù),否則,走默認(rèn)的。

這樣就實(shí)現(xiàn)了流量的劃分,也就是灰度的功能。

然后我們重新跑下容器:

這時(shí)候,你訪問 http://localhost:83/api/ 走到的就是默認(rèn)的版本。

然后帶上 version=2.0 的 cookie,走到的就是另一個(gè)版本的代碼:

這樣,我們就實(shí)現(xiàn)了灰度的功能。

但現(xiàn)在還有一個(gè)問題:

什么時(shí)候設(shè)置的這個(gè) cookie 呢?

比如我想實(shí)現(xiàn) 80% 的流量走版本 1.0,20% 的流量走版本 2.0

其實(shí)公司內(nèi)部一般都有灰度配置系統(tǒng),可以配置不同的版本的比例,然后流量經(jīng)過這個(gè)系統(tǒng)之后,就會(huì)返回 Set-Cookie 的 header,里面按照比例來分別設(shè)置不同的 cookie。

比如隨機(jī)數(shù)載 0 到 0.2 之間,就設(shè)置 version=2.0 的 cookie,否則,設(shè)置 version=1.0 的 cookie。

這也叫做流量染色。

完整的灰度流程是這樣的:

第一次請(qǐng)求的時(shí)候,會(huì)按照設(shè)定的比例隨機(jī)對(duì)流量染色,也就是設(shè)置不同 cookie。

再次訪問的時(shí)候會(huì)根據(jù) cookie 來走到不同版本的代碼。

這就實(shí)現(xiàn)了灰度功能,可以用來做 5% 10% 50% 100% 這樣逐步上線的灰度上線機(jī)制。

也可以用來做產(chǎn)品的 AB 實(shí)驗(yàn)。

公司里都會(huì)用這樣的灰度系統(tǒng)。

總結(jié)

新版本代碼的上線基本都會(huì)用灰度系統(tǒng),可以逐步放量的方式來保證上線過程不會(huì)出大問題,也可以用來做產(chǎn)品 AB 實(shí)驗(yàn)。

我們可以用 nginx 實(shí)現(xiàn)這樣的功能。

nginx 有反向代理的功能,可以轉(zhuǎn)發(fā)請(qǐng)求到應(yīng)用服務(wù)器,也叫做網(wǎng)關(guān)層。

我們可以在這一層根據(jù) cookie 里的 version 字段來決定轉(zhuǎn)發(fā)請(qǐng)求到哪個(gè)服務(wù)。

在這之前,還需要按照比例來給流量染色,也就是返回不同的 cookie。

不管灰度系統(tǒng)做的有多復(fù)雜,底層也就是流量染色、根據(jù)標(biāo)記轉(zhuǎn)發(fā)流量這兩部分,我們完全可以自己實(shí)現(xiàn)一個(gè)。

到此這篇關(guān)于基于Nginx實(shí)現(xiàn)一個(gè)灰度上線系統(tǒng)的示例代碼的文章就介紹到這了,更多相關(guān)Nginx灰度上線系統(tǒng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Nginx部署SpringBoot項(xiàng)目的實(shí)現(xiàn)

    Nginx部署SpringBoot項(xiàng)目的實(shí)現(xiàn)

    本文主要介紹了Nginx部署SpringBoot項(xiàng)目的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Nginx代理MySQL實(shí)現(xiàn)通過域名連接數(shù)據(jù)庫(kù)的詳細(xì)教程

    Nginx代理MySQL實(shí)現(xiàn)通過域名連接數(shù)據(jù)庫(kù)的詳細(xì)教程

    我們的生產(chǎn)環(huán)境基本上都部署在云服務(wù)器上,例如應(yīng)用服務(wù)器、MySQL服務(wù)器等,如果MySQL服務(wù)器直接暴露在公網(wǎng),就會(huì)存在很大的風(fēng)險(xiǎn),為了保證數(shù)據(jù)安全,MySQL服務(wù)器的端口是不對(duì)外開放的,所以本文介紹了Nginx代理MySQL實(shí)現(xiàn)通過域名連接數(shù)據(jù)庫(kù)的詳細(xì)教程
    2024-07-07
  • Nginx正向代理實(shí)現(xiàn)局域網(wǎng)電腦訪問外網(wǎng)的過程詳解

    Nginx正向代理實(shí)現(xiàn)局域網(wǎng)電腦訪問外網(wǎng)的過程詳解

    在工作中我遇到了一個(gè)類似的情況:在公司網(wǎng)絡(luò)中,由于管理要求,局域網(wǎng)內(nèi)的電腦不能直接訪問外網(wǎng),但是,工作上領(lǐng)導(dǎo)吩咐需要讓局域網(wǎng)內(nèi)的電腦能夠訪問外網(wǎng)上的某個(gè)網(wǎng)站,這時(shí)候就需要用到正向代理,本文將介紹如何配置 Nginx 實(shí)現(xiàn)這一功能,需要的朋友可以參考下
    2024-03-03
  • nginx中狀態(tài)統(tǒng)計(jì)的實(shí)現(xiàn)

    nginx中狀態(tài)統(tǒng)計(jì)的實(shí)現(xiàn)

    本文主要介紹了nginx中狀態(tài)統(tǒng)計(jì)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Nginx timeout超時(shí)配置詳解

    Nginx timeout超時(shí)配置詳解

    這篇文章主要介紹了Nginx timeout超時(shí)配置詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 很詳細(xì)的Nginx配置說明

    很詳細(xì)的Nginx配置說明

    這篇文章主要為大家分享了一篇很詳細(xì)的Nginx配置說明,主要內(nèi)容包括Nginx常用功能、Nginx配置文件結(jié)構(gòu),想要了解Nginx配置的朋友不要錯(cuò)過,參考一下
    2016-02-02
  • Nginx解決轉(zhuǎn)發(fā)地址時(shí)跨域的問題

    Nginx解決轉(zhuǎn)發(fā)地址時(shí)跨域的問題

    這篇文章主要介紹了Nginx實(shí)現(xiàn)轉(zhuǎn)發(fā)地址解決跨域問題的方法,文中介紹的很詳細(xì),對(duì)大家的學(xué)習(xí)具有一定的參考借鑒價(jià)值,有需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • Nginx跨域使用字體文件的配置方法

    Nginx跨域使用字體文件的配置方法

    這篇文章主要介紹了Nginx跨域使用字體文件的配置方法,使用HttpHeadersModule模塊實(shí)現(xiàn),需要的朋友可以參考下
    2014-06-06
  • nginx使用replace-filter-nginx-module實(shí)現(xiàn)內(nèi)容替換的示例

    nginx使用replace-filter-nginx-module實(shí)現(xiàn)內(nèi)容替換的示例

    本篇文章主要介紹了nginx使用replace-filter-nginx-module實(shí)現(xiàn)內(nèi)容替換的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • nginx鏡像構(gòu)建的知識(shí)點(diǎn)及方法步驟詳解

    nginx鏡像構(gòu)建的知識(shí)點(diǎn)及方法步驟詳解

    這篇文章主要為大家介紹了nginx鏡像構(gòu)建的知識(shí)點(diǎn)詳解,<BR>有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08

最新評(píng)論