灰度发布配置方案
- 基于权重的灰度发布
- 原理:通过给不同版本的微服务实例分配不同的权重,使得Nginx按照权重比例将请求分发给新旧版本的服务。权重越高,接收的请求越多。这样可以逐步增加新版本服务的流量,观察其运行状态。
- 配置示例:
upstream my_service {
server old_version_service_ip:port weight=80; # 旧版本服务,权重80
server new_version_service_ip:port weight=20; # 新版本服务,权重20
}
server {
listen 80;
server_name your_domain.com;
location / {
proxy_pass http://my_service;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
- 基于特定条件的灰度发布(如用户ID、请求头)
- 原理:根据请求中的特定信息(如用户ID、请求头中的特定字段),将请求分发给指定版本的服务。例如,对于特定用户群体(如白名单用户)的请求,发送到新版本服务进行测试。
- 配置示例(基于用户ID):
map $arg_user_id $version {
default old;
~^[1-100]$ new; # 用户ID在1到100之间,访问新版本服务
}
upstream old_version_service {
server old_version_service_ip:port;
}
upstream new_version_service {
server new_version_service_ip:port;
}
server {
listen 80;
server_name your_domain.com;
location / {
if ($version = new) {
proxy_pass http://new_version_service;
} else {
proxy_pass http://old_version_service;
}
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
故障快速回滚
- 基于权重回滚
- 原理:在灰度发布过程中,如果发现新版本服务出现故障,可通过修改权重,将流量快速切回旧版本服务。例如,将新版本服务权重设为0,旧版本服务权重设为100。
- 操作:修改上述
upstream
配置中的权重,重新加载Nginx配置(nginx -s reload
),即可快速将流量全部导向旧版本服务。
- 基于特定条件回滚
- 原理:如果是基于特定条件(如用户ID)进行灰度发布,出现故障时,可通过修改判断条件,不再将请求导向新版本服务。
- 操作:修改
map
指令中的条件判断逻辑,例如将~^[1-100]$ new;
改为~^[1-100]$ old;
,重新加载Nginx配置,使得原本发送到新版本服务的请求,重新发送到旧版本服务。