灰度发布(又称金丝雀发布)是指在黑与白之间能够平滑过渡的一种发布方式。在其上可以进行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来实现,实现过程也是不复杂的。如果希望某一群体的用户使用新版本,那么此时可以通过基于客户端请求的方式来实现灰度发布;如果只是单纯的线上验证新版本,那么可以通过基于权重的方式实现灰度发布。