电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

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

瀏覽:8日期:2023-07-22 19:57:34

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

npx nest new gray_test -p npm

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

npm run start

瀏覽器訪問下:

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

然后改下 AppService:

修改下端口:

然后再 npm run start:

瀏覽器訪問下:

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

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

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

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

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

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

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

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

然后編輯下這個 default.conf

添加這么一行配置:

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

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

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

然后我們重新跑個 nginx 容器:

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

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

點擊 run。

然后看下 files 部分:

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

點開看看:

這就是本地的那個文件。

我們在本地改一下試試:

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

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

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

然后我們訪問下 http://localhost:83/api/ 看看:

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

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

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

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

默認(rèn)會輪詢把請求發(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ù)某個條件來區(qū)分轉(zhuǎn)發(fā)給哪個服務(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)的。

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

然后我們重新跑下容器:

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

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

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

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

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

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

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

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

這也叫做流量染色。

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

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

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

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

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

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

總結(jié)

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

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

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

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

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

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

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

標(biāo)簽: Nginx
主站蜘蛛池模板: 西安耀程造价培训机构_工程预算实训_广联达实作实操培训 | 广东恩亿梯电源有限公司【官网】_UPS不间断电源|EPS应急电源|模块化机房|电动汽车充电桩_UPS电源厂家(恩亿梯UPS电源,UPS不间断电源,不间断电源UPS) | 超声波电磁流量计-液位计-孔板流量计-料位计-江苏信仪自动化仪表有限公司 | 气弹簧定制-气动杆-可控气弹簧-不锈钢阻尼器-工业气弹簧-可调节气弹簧厂家-常州巨腾气弹簧供应商 | 英国公司注册-新加坡公司注册-香港公司开户-离岸公司账户-杭州商标注册-杭州优创企业 | 武汉高低温试验箱_恒温恒湿试验箱厂家-武汉蓝锐环境科技有限公司 | Magnescale探规,Magnescale磁栅尺,Magnescale传感器,Magnescale测厚仪,Mitutoyo光栅尺,笔式位移传感器-苏州连达精密量仪有限公司 | 武汉森源蓝天环境科技工程有限公司-为环境污染治理提供协同解决方案 | uv固化机-丝印uv机-工业烤箱-五金蚀刻机-分拣输送机 - 保定市丰辉机械设备制造有限公司 | 活性炭厂家-蜂窝活性炭-粉状/柱状/果壳/椰壳活性炭-大千净化-活性炭 | 购买舔盐、舔砖、矿物质盐压块机,鱼饵、鱼饲料压块机--请到杜甫机械 | 沈阳建筑设计公司_加固改造设计_厂房设计_设计资质加盟【金辉设计】 | 科研ELISA试剂盒,酶联免疫检测试剂盒,昆虫_植物ELISA酶免试剂盒-上海仁捷生物科技有限公司 | 北京乾茂兴业科技发展有限公司| 光泽度计_测量显微镜_苏州压力仪_苏州扭力板手维修-苏州日升精密仪器有限公司 | 气力输送_输送机械_自动化配料系统_负压吸送_制造主力军江苏高达智能装备有限公司! | 钢托盘,钢制托盘,立库钢托盘,金属托盘制造商_南京飞天金属制品实业有限公司 | 岛津二手液相色谱仪,岛津10A液相,安捷伦二手液相,安捷伦1100液相-杭州森尼欧科学仪器有限公司 | 无菌水质袋-NASCO食品无菌袋-Whirl-Pak无菌采样袋-深圳市慧普德贸易有限公司 | 四川实木门_成都实木门 - 蓬溪聚成门业有限公司 | 氟氨基酮、氯硝柳胺、2-氟苯甲酸、异香兰素-新晨化工 | 首页|专注深圳注册公司,代理记账报税,注册商标代理,工商变更,企业400电话等企业一站式服务-慧用心 | 电子海图系统-电梯检验系统-智慧供热系统开发-商品房预售资金监管系统 | 武汉EPS线条_EPS装饰线条_EPS构件_湖北博欧EPS线条厂家 | 珠海白蚁防治_珠海灭鼠_珠海杀虫灭鼠_珠海灭蟑螂_珠海酒店消杀_珠海工厂杀虫灭鼠_立净虫控防治服务有限公司 | 气动绞车,山东气动绞车,气动绞车厂家-烟台博海石油机械有限公司 气动隔膜泵厂家-温州永嘉定远泵阀有限公司 | 造价工程师网,考试时间查询,报名入口信息-网站首页 | 棕刚玉_白刚玉_铝酸钙-锐石新材料 | 智能垃圾箱|垃圾房|垃圾分类亭|垃圾分类箱专业生产厂家定做-宿迁市传宇环保设备有限公司 | 鄂泉泵业官网|(杭州、上海、全国畅销)大流量防汛排涝泵-LW立式排污泵 | 硫酸钡厂家_高光沉淀硫酸钡价格-河南钡丰化工有限公司 | 视频直播 -摄影摄像-视频拍摄-直播分发 | 一体化污水处理设备,一体化污水设备厂家-宜兴市福源水处理设备有限公司 | 免费分销系统 — 分销商城系统_分销小程序开发 -【微商来】 | 济宁工业提升门|济宁电动防火门|济宁快速堆积门-济宁市统一电动门有限公司 | 北京模型公司-军事模型-工业模型制作-北京百艺模型沙盘公司 | 交联度测试仪-湿漏电流测试仪-双85恒温恒湿试验箱-常州市科迈实验仪器有限公司 | 护腰带生产厂家_磁石_医用_热压护腰_登山护膝_背姿矫正带_保健护具_医疗护具-衡水港盛 | 防水套管|柔性防水套管|伸缩器|伸缩接头|传力接头-河南伟创管道 防水套管_柔性防水套管_刚性防水套管-巩义市润达管道设备制造有限公司 | 数控走心机-双主轴走心机厂家-南京建克| 金联宇电缆总代理-金联宇集团-广东金联宇电缆实业有限公司 |