其他系列文章导航
文章目录
前言
软件开发一般不会上来就是最终版本,而是会一个版本一个版本的迭代。
新版本上线前都会经过测试,但就算这样,也不能保证上线了不出问题。
所以,在公司里上线新版本代码一般都是通过灰度系统。
一、灰度系统
1.1 灰度系统含义
灰度系统是用来帮助 API 服务在上线时按照受众从小到大最终至全量的发布,实现功能的灰度上线,用来保证发布的服务的质量的系统。
灰度系统可以把流量划分成多份,一份走新版本代码,一份走老版本代码。
如下图所示:
编辑
而且灰度系统支持设置流量的比例,比如可以把走新版本代码的流量设置为 5%,没啥问题再放到 10%,50%,最后放到 100% 全量。
这样可以把出现问题的影响降到最低。
不然一上来就全量,万一出了线上问题,那就是大事故。
而且灰度系统不止这一个用途,比如产品不确定某些改动是不是有效的,就要做 AB 实验,也就是要把流量分成两份,一份走 A 版本代码,一份走 B 版本代码。
1.2 灰度系统实现
那这样的灰度系统是怎么实现的呢?
其实很多都是用 nginx 实现的。
Nginx是一款高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。其特点是占有内存少,并发能力强,在同类型的网页服务器中表现较好。
Nginx能做以下几件事:
- 反向代理:请求不会直接到达真正的服务器(比如tomcat),而是先经过nignx服务器,在由nignx服务器转发到正真的tomcat服务器上。
- 负载均衡:为减少单个服务器访问压力,往往设置多个服务器,nignx恶意根据一定的策略(轮训、ip_hash、权重)来决定将该请求转发到哪一个服务器。
- 动静分离:动态页面(jsp)和静态资源(html/css/jpg)可以分别放在不同的服务器,这样nignx可以根据不同类型的资源请求,将请求转发到不同的服务器。
nginx 是一个反向代理的服务,用户请求发给它,由它转发给具体的应用服务器。
如下图所示:
编辑
这一层也叫做网关层。
由它负责转发请求给应用服务器,那自然就可以在这里控制流量的分配,哪些流量走版本 A,哪些流量走版本 B。
1.3 如何设置cookie
但现在还有一个问题:
什么时候设置的这个 cookie 呢?
比如想实现 80% 的流量走版本 1.0,20% 的流量走版本 2.0
其实公司内部一般都有灰度配置系统,可以配置不同的版本的比例,然后流量经过这个系统之后,就会返回 Set-Cookie 的 header,里面按照比例来分别设置不同的 cookie。
比如随机数载 0 到 0.2 之间,就设置 version=2.0 的 cookie,否则,设置 version=1.0 的 cookie。
这也叫做流量染色。
完整的灰度流程是这样的:
编辑
第一次请求的时候,会按照设定的比例随机对流量染色,也就是设置不同 cookie。
再次访问的时候会根据 cookie 来走到不同版本的代码。
这就实现了灰度功能,可以用来做 5% 10% 50% 100% 这样逐步上线的灰度上线机制。
也可以用来做产品的 AB 实验。
公司里都会用这样的灰度系统。
二、nginx配置cookie实现分流示例
当使用Nginx作为灰度系统时,可以通过配置cookie来实现用户分流和追踪。以下是一个示例的Nginx配置文件,用于设置灰度系统的cookie:
http { # 定义默认的 cookie 参数 cookie_domain example.com; cookie_path /; cookie_expires 60s; cookie_secure off; cookie_httponly on; # 定义灰度分组 map $http_cookie $gray_group { default ""; ~gray1 "group1"; ~gray2 "group2"; ~gray3 "group3"; } server { listen 80; server_name example.com; location / { # 根据 cookie 分组,将请求转发到不同的后端服务器 if ($gray_group) { proxy_pass http://backend_$gray_group; } proxy_pass http://backend; # 默认转发到所有后端服务器 } } }
在上述配置中,我们首先定义了默认的cookie参数,包括域名、路径、过期时间等。然后,使用map
指令将HTTP请求中的cookie进行映射,将其中的gray1
、gray2
和gray3
的cookie值映射为不同的灰度分组。
接下来,在location
块中,我们使用if
指令判断请求中是否存在灰度分组cookie,如果存在则将请求根据不同的分组值转发到相应的后端服务器。如果请求中没有灰度分组cookie,则默认将请求转发到所有的后端服务器。
请注意,上述配置仅是一个示例,实际应用中可能需要根据具体需求进行调整。另外,确保在Nginx配置文件中启用http_cookie
模块,否则cookie配置将无法生效。
三、总结
新版本代码的上线基本都会用灰度系统,可以逐步放量的方式来保证上线过程不会出大问题,也可以用来做产品 AB 实验。
我们可以用 nginx 实现这样的功能。
nginx 有反向代理的功能,可以转发请求到应用服务器,也叫做网关层。
我们可以在这一层根据 cookie 里的 version 字段来决定转发请求到哪个服务。
在这之前,还需要按照比例来给流量染色,也就是返回不同的 cookie。
不管灰度系统做的有多复杂,底层也就是流量染色、根据标记转发流量这两部分,我们完全可以自己实现一个。