Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于 Nginx 实现灰度发布与AB测试

基于 Nginx 实现灰度发布与AB测试

作者头像
肉眼品世界
发布于 2021-10-27 08:14:02
发布于 2021-10-27 08:14:02
2K00
代码可运行
举报
文章被收录于专栏:肉眼品世界肉眼品世界
运行总次数:0
代码可运行

出处:http://adkx.net/9eigk

背景

单位的云办公相关系统没有成熟的平滑发布方案,导致每一次发布都是直接发布,dll文件或配置文件的变更会引起站点的重启。

云办公系统的常驻用户有10000+,即使短短半分多钟,也会收到一堆投诉。基于此,我们梳理了一套平滑发布的方案。

实施方案

1、跟nginx代理服务器约定了一个健康检查的接口

2、通过接口返回的http状态码来让ngx是否分流用户请求(这个我们单位的技术部那边有标准的做法)

3、根据提供的这个服务健康检查的接口:nginx判断只要某个实例的接口返回5xx的状态码,即把该实例下线(nginx不会把流量转发到该实例)

发布流程

目的主要是为了发布的时候能够平滑发布,所以QA与开发人员在发布得时候按照如下步骤操作:

1、打开系统的nginx列表管理页面:[/publish/ngxconfig]

2、下架某一个实例(假设系统集群有A、B、C个实例),比如A实例

3、查看是否下架成功:这个就是我们跟nginx约定的健康检查接口,正常在线状态下是200的statu,切离线后,这个接口返回的是401的statu。

在线情况:

离线情况:

4、观察监控站点,直至该实例下的Req、Connnectiuon流量都消失

5、在该实例下进行版本发布

6、打开Fidller,host到待发布的实例,然后判断是否发布成功(发布dll、配置文件时,IIS站点会短暂重启)

7、QA同学走查灰度的A实例服务器,保证它正常运行,如此循环,直到所有服务器都发布。

进一步AB测试的优化

平滑发布做完之后,确实给我带来很大的便利,不用每次发布都发公告,不重要的或者非功能性的内容发布了就是了。

但是用久了,客户量上去之后,又遇到一个问题,那就是每一次业务大变更,大型发布都是直接发布到生产,这样可能存在风险。设计师设计的功能,用户不一定完全接受,一旦上线新版本,收到一大堆的吐槽,都是用户呀,如果能在小范围人群内进行灰度试用,完成平稳的过度和使用反馈之后,优化后再上到生产会更好一点。

所以这边需要思考和设计一套统一的技术方案,未来无论云办公还是其他的业务系统,都能通过灰度发布在可指定的小范围内先进行体验和功能验证。

基于上面的平滑,我们在Nginx反向代理服务器上动心思,让nginx来帮我们做ABTesting的方案。

以下是我们尝试的几种方案:

1、Nginx反向代理:来路IP策略

流程图:
步骤:

1、进入云办公系统,进入Nginx反代服务器

2、Nginx读取来路IP的AB名单

3、根据IP AB名单进行流量转发(名单A走特定实例,名单B走云办公原有集群实例)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
server {
listen 80;
server_name officecloud.com;
access_log officecloud.com/logs main;
ip_list 192.168.254.4,192.168.254.170

set $group default;
if ($remote_addr in iplist) {
set $group ACluster;
}
location / { 
proxy_pass http://$group;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
index index.html index.htm;
}
}
优缺点:

1、配置简单,原资源平台的灰度升级就是根据IP名单来划分设计升级的

2、外部计算机很多都是非固定IP,这个适合在公司内网实现,比如只是配置公司内网的IP。

2、Nginx反向代理:$.Cookies策略

流程图:
步骤

1、进入云办公系统,进入Nginx反代服务器

2、Nginx读取Http请求的Cokie的version信息(也可以是别的key)

3、根据Key的版本来进行流量转发(比如Version1.1走特定集群,Version1.0走通用集群实例)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
server {
listen 80;
server_name officecloud.com;
access_log officecloud.com/logs main;
ip_list 192.168.254.4,192.168.254.170

set $group default;
if ($http_cookie ~* "version=V1.0"){
set default;
}
if ($http_cookie ~* "version=V1.1"){
set $group ACluster;
}

location / { 
proxy_pass http://$group;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
index index.html index.htm;
}
}
优缺点:

1、配置简单,根据Nginx的 $COOKIE_version 属性来判断

2、相对稳定,对需要开放名单的用户,在Cookie头部加入特定的版本即可,应用只要少许的开发量

3、首次访问静态页面可能不会产生cookie

备注:这是团队内认为最好的Nginx代理方案,同理,User-Agent和Header都可以做此种类型的判断,但是Header需要侵入底层HttpRequest去业务添加,不建议。

3、AB集群+业务代理方式

流程图:

步骤:

1、进入云办公系统,两种方式进入系统,一种是登录页登录:~/login ,一种是default页面带uckey登录:~/default?usertoken=#usertoken#

2、登录的时候和usertoken传入的时候进去 路由代理模块,进行用户信息校验,根据不同的人员和部门(人员和部门配置归属AB名单)分流到两个不同的AB集群

3、根据转发跳到具体的实例集群域名下(可以配置AB集群拥有不同域名,更容易区分)

优缺点 :

1、与Nginx剥离,不用依赖公司的通用平台和技术部的实现

2、需要申请AB集群,AB集群拥有不同的域名。

3、如果是前后端分离情况下,需要保证静态站点和服务站点均申请AB集群

4、所有入口需要统一做代理,有一定的开发量

目前手上2个系统已经根据该方案实现了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 肉眼品世界 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
IDEA中Live Templates和Postfix Completion的用法
1、sout,最基本的输出语句,快速生成 System.out.println();
码客说
2023/07/26
3760
IDEA中Live Templates和Postfix Completion的用法
同事用了这个IDEA技巧,开发效率提升了10倍
在将今天的技巧前,我们需要作几个准备:IntellJ IDEA和开启Postfix Completion。
Lvshen
2022/05/05
2670
同事用了这个IDEA技巧,开发效率提升了10倍
IDEA奇淫小技巧
前几年eclipse在市场上非常流行,因此大多数人都习惯了eclipse的一些快捷键。近年来,随着IDEA的兴起,很多人都放弃了exlipse,进而选择了IDEA,但是有些人习惯将快捷键方式更换成eclipse的。这里我不建议这样做,熟悉一套快捷键差不多一周时间就够了,直接使用IDEA默认的快捷键可以体验到更多隐藏的小技巧~下面我们一起来看看IDEA都有哪些奇淫小技巧。
Java旅途
2020/06/25
4560
IDEA 常用代码模板
变量.null:if(变量 == null) 变量.nn:if(变量 != null) 变量.notnull:if(变量 != null) ifn:if(xx == null) inn:if(xx != null)
CODER-V
2023/03/04
9270
IDEA 代码自动补全,开发效率翻倍的神技
我猜应该少之又少了吧!可能很多新入行的道友甚至都没有听过Eclipse;为啥IDEA会取代Eclipse成为技术人首选的开发工具呢!最重要的一点就是好用嘛!智能撒!
一行Java
2022/04/07
2.6K0
IDEA 代码自动补全,开发效率翻倍的神技
【方向盘】使用IDEA的60+个快捷键分享给你,权为了提效(Live Template&Postfix Completion篇)
你好,这里是Java方向盘,我是方向盘(YourBatman),坐稳扶好,开始发车。
YourBatman
2022/09/16
7930
【方向盘】使用IDEA的60+个快捷键分享给你,权为了提效(Live Template&Postfix Completion篇)
Ideal 使用技巧之PostFix Completion
PostFix Completion 创建变量: new 类名().var new 类名().field 类名.new.var new 类名().cast new 类名().castvar 变量判断: 变量.null 变量.nonull 变量.nn 变量.if 变量.while 变量.not 变量输出/返回: 变量.sout 变量.soutv 变量.return 变量循环: 变量.for 变量.fori 变量.forr 异常捕获: 方法().try
前端小鑫同学
2022/12/24
3430
用了这么久 IDEA,你竟然不知道有个功能叫自动补全!
IDEA 有个很牛逼的功能,那就是后缀补全(不是自动补全),很多人竟然不知道这个操作,还在手动敲代码。
芋道源码
2019/09/25
3970
用了这么久 IDEA,你竟然不知道有个功能叫自动补全!
Intellij IDEA 智能补全的 10 个姿势,简直不能太牛逼!
一年多前,栈长那时候刚从 Eclipse 转型 IDEA 成功,前面转了好多次,都是失败史,都是泪。。
Java技术栈
2019/07/25
4.6K0
Intellij IDEA 智能补全的 10 个姿势,简直不能太牛逼!
用了这么久 IDEA ,你竟然不知道有个功能叫自动补全!
IDEA 有个很牛逼的功能,那就是后缀补全(不是自动补全),很多人竟然不知道这个操作,还在手动敲代码。
Java技术江湖
2019/09/24
3350
用了这么久 IDEA ,你竟然不知道有个功能叫自动补全!
用了这么久 IDEA,你竟然不知道有个功能叫自动补全!
IDEA 有个很牛逼的功能,那就是后缀补全(不是自动补全),很多人竟然不知道这个操作,还在手动敲代码。
JAVA葵花宝典
2021/05/11
5850
用了这么久 IDEA,你竟然不知道有个功能叫自动补全!
4. IDEA的安装与使用(上)
此外,2022年,某美国软件开发商在对近千名专业的Java开发者调研后,发布了《2022年Java开发者生产力报告》。报告提到:JetBrains 的 IntelliJ IDEA是最受欢迎的 Java IDE,占 48%,其次是 Eclipse,占 24%,Visual Studio Code 占 18%。
捞月亮的小北
2023/12/01
5820
4. IDEA的安装与使用(上)
10 个动图, 你会喜欢上 idea 的自动补全!
IDEA 有个很牛逼的功能,那就是后缀补全(不是自动补全),很多人竟然不知道这个操作,还在手动敲代码。
逆锋起笔
2021/06/11
4130
IDEA中关于模块的一些总结,希望对大家有所帮助
它的原理就是配置一些常用代码字母缩写,在输入简写时可以出现你预定义的固定模式的代码,使得开发效率大大提高,同时也可以增加个性化。最简单的例子 就是在 Java 中输入 sout 会出现 System.out.println();
不温卜火
2020/10/28
6620
IDEA中关于模块的一些总结,希望对大家有所帮助
重构工具
参考:https://cloud.tencent.com/developer/article/1497529
大发明家
2021/12/05
6770
IDEA 中骚操作
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
用户1212940
2019/11/03
3950
IntelliJ IDEA不好用?那是因为没掌握这些技巧。
想要愉快的coding,一个好的IDE肯定少不了。而对于Java开发者来说,IntelliJ IDEA绝对是Java-IDE的首屈一指的选择(eclipse党还请绕我一命)。
Java3y
2020/03/03
3.3K0
教你一招用 IDE 编程提升效率的骚操作!
IDEA 有个很牛逼的功能,那就是后缀补全(不是自动补全),很多人竟然不知道这个操作,还在手动敲代码。
良月柒
2019/03/20
3460
教你一招用 IDE 编程提升效率的骚操作!
整理了一些 IDEA 中比较骚的技巧
这个功能可以使用代码补全来模板式地补全语句,如遍历循环语句(for、foreach)、使用 String.format() 包裹一个字符串、使用类型转化包裹一个表达式、根据判(非)空或者其它判别语句生成 if 语句、用 instanceOf 生成分支判断语句等。
IT小马哥
2020/03/18
2810
玩IDEA,你懂的自动补全,怕不全吧!
IDEA 有个很牛逼的功能,那就是后缀补全(不是自动补全),很多人竟然不知道这个操作,还在手动敲代码。
挨踢小子部落阁
2019/09/17
9650
玩IDEA,你懂的自动补全,怕不全吧!
推荐阅读
相关推荐
IDEA中Live Templates和Postfix Completion的用法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验