nginx实现灰度系统

正经项目新版本代码的上线基本都会用灰度系统,可以逐步放量的方式来保证上线过程不会出大问题,开始可以 5%(即 5%的用户会使用到该新版本),没啥问题再放到 10%,50%,最后放到 100% 全量。

第一次请求的时候,会按照设定的比例随机对流量染色,也就是设置不同 cookie。再次访问的时候会根据 cookie 来走到不同版本的代码。

nginx 有反向代理的功能,可以转发请求到应用服务器,也叫做网关层我们可以在这一层根据 cookie 里的 version 字段来决定转发请求到哪个服务。在这之前,还需要按照比例来给流量染色,也就是返回不同的 cookie。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
upstream version1.0_server {
server 192.168.3.210:3000;
}
upstream version2.0_server {
server 192.168.3.210:3001;
}
upstream default {
server 192.168.3.210:3000;
}
server {
listen 80;
listen [::]:80;
server_name localhost;

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;
}
}

不管灰度系统做的有多复杂,底层也就是流量染色根据标记转发流量这两部分,我们完全可以自己实现一个。后端代码会根据 cookie 标识来请求不同的服务(或者同一个服务走不同的 if else),前端代码可以根据 cookie 判断走哪段逻辑。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!