基于Nginx实现灰度发布的实现方案
灰度发布(又称金丝雀发布)是指在黑与白之间能够平滑过渡的一种发布方式。在其上可以进行A/B 测试,先让让一部分用户继续用产品特性A,另一部分用户开始用产品特性B,如果特性B没有什么问题,那么逐步扩大范围,把所有用户都迁移到B上面来。
灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度,目前国内的很多大厂都在使用灰度发布方式。下面介绍几种通过Nginx实现的灰度发布的方案。
1、基于Nginx的权重实现方案
首先将服务器A下线(从Nginx的服务列表中剔除),运维人员通过Jenkins一键发布最新的代码到服务器A上,代码发布成功之后运维人员开始配置Nginx,配置Nginx核心就是配置Nginx的upstream这块,如下图所示的Nginx配置:
upstream webservers {
server 192.168.201.121 weight=90;
server 192.168.201.120 weight=10;
}
server {
listen 80;
location / {
proxy_pass http://webservers
}
}
值得注意的是权重值没有限定,如果weight的值设置的越大,那么这台服务器分配的流量就越高。通过上面的配置就可以实现对服务器A的灰度发布了,运维人员执行Nginx的重新加载配置命令将新的Nginx配置生效。此时将会有90%的流量分配到服务器B上,10%的流量分配到服务器A上。
如果新版本验证没有问题了,那么可以逐步将流量放到服务器A上。随后可以采用同样的方式升级服务器B。这种实现灰度发布的方式比较简单,Nginx自带的功能就可以实现。
2、基于客户端请求的方式
首先下掉服务器A,运维人员一键发布最新的代码到服务器A上,随后运维人员配置Nginx配置文件来处理客户端请求到底是要发送到哪个服务器上。Nginx的配置文件中的核心配置如下所示:
upstream webservers {
server 192.168.201.121;
}
#新版本的服务器配置
upstream webservers-newweb {
server 192.168.201.120;
}
server {
listen 80;
set $backend "webservers";
#判断请求中是否存在特点的标识,如果存在特点的标识就转发服务器A
if ($http_cookie~*"A=a") {
set $backend="webservers-newweb"
}
location / {
# 根据上面的$backend参数值转发到对应的服务器上
proxy_pass http://$backend
}
}
基于客户端请求是Nginx通过获取客户端携带的Cookie或者Http请求头指定的键值对(如A=a键值对)将流量转发到新版本上(服务器A),如果新版本测试通过,那么可以将全部流量或者部分流量切换到新版上,这种策略比较适合特定的用户或者客户端访问新的版本。
总结:
以上的两种方式都是基于Nginx来实现,实现过程也是不复杂的。如果希望某一群体的用户使用新版本,那么此时可以通过基于客户端请求的方式来实现灰度发布;如果只是单纯的线上验证新版本,那么可以通过基于权重的方式实现灰度发布。