记一次前端简单的灰度方案,使用nginx

1,897 阅读2分钟

一、项目背景

前端项目开发一个模块,上线前需要灰度一部分用户,实现一个临时的灰度方案。

现有项目状况:

  • 一个前端项目1.0.0版本
  • 后端服务1.0.0版本
  • 后端灰度服务2.0.0版本
  • 一个域名解析到前端服务80、443端口
  • 前端通过nginx转发静态文件

1、实现原理

image.png

  • 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")