一、项目背景
前端项目开发一个模块,上线前需要灰度一部分用户,实现一个临时的灰度方案。
现有项目状况:
- 一个前端项目1.0.0版本
- 后端服务1.0.0版本
- 后端灰度服务2.0.0版本
- 一个域名解析到前端服务80、443端口
- 前端通过nginx转发静态文件
1、实现原理
- 1、打包一份前端项目2.0.0版本,上传服务器,部署不同端口
- 2、通过nginx获取文件中携带的请求头remote_user,在nginx代理静态文件的时候判断当前用户是否灰度中,请求不同的静态资源
- 3、前端打包的时候,给请求的接口增加版本号2.0.0,请求接口,通过版本号判断访问的后端灰度服务。
2、优缺点
- 实现简单,易于理解
- 通过nginx可以灰度到具体人员 缺点:
- 维护两套程序,不适合长时间的灰度方案
- 灰度人数有限,nginx参数不能过长(可分开配置避免这个问题)
二、具体实践
1、配置一套前端服务,部署在80端口,请求接口版本号version:1.0.0
正常请求域名 https://www.demo.com
2、另外部署一套前端服务,部署端口8080端口,请求接口版本号version: 2.0.0
3、比如要灰度test.lv san.zhang人员名单
4、这样就保证了静态资源通过remote_user分开请求,后端服务通过version请求对应的服务。
配置nginx
server {
listen 80;
server_name www.demo.com;
location / {
if ($http_remote_user ~* (test\.lv|san.zhang)){
proxy_pass http://localhost:8081;
}
root /data/demo;
index index.html index.htm;
}
location ^~/api/ {
if ($http_version = "2.0.0"){
# 代理到新的服务
proxy_pass http://10.11.12.234:9001;
}
proxy_pass http://10.11.12.234:9002;
}
}
三、注意
1、nginx配置需要增加, 保证header小写可以通过nginx
underscores_in_headers on;
2、增加了自定义header,所以在nginx或后端服务中增加对应的hader头,防止出现跨域校验不通过
// 以go为例,增加自定义header
c.Header("Access-Control-Allow-Headers", "Content-Type, remote_user, api_version")