- 背景:一种常见的应用灰度发布的实现
一个线上的应用部署有 4台服务器,nginx 做了负载均衡,策略可能为 ip_hash,轮询,权重,最少连接之类的。
每次的请求可能分发到不同的服务器
在应用发布的时候,先把 发布的文件部署到一台服务器上,并且把这台服务器设置为内部访问,nginx 这时把
这台服务器不加入到负载均衡里面,线上的流量只访问到其他3台节点。测试人员通过内部ip访问到这台新发布应用的
节点,在测试完成之后就把这台服务器重新加入到负载均衡里面。
以上的工作都是运维完成的,相当于重复的工作
-
-
- 用一个全局变量 i 来保存当前指派的是节点数组里的下标(哪一个节点)
- 每次负载的时候 i 判断是否大于数组长度,是的话重置为0,然后拿出i对应的节点,然后 i++
-
- 例如 A, B 2个节点,2个的权重分别是2跟3,A负载了2次后轮到B,B负载3次后到A
- 用一个map(数组下标,对象(节点,次数))结构,和一个数组的下标 i 来存储
- 每次负载的时候根据 i 访问map, 如果该节点次数还没到指定的次数,就用该节点,并且次数加1,i不变
- 如果该节点次数达到上限就重置为0,i++,让下一次访问map去到数组的下一个下标
-
- 后台提供页面,访问接口达到 增加或者删除的效果
- 后台提供页面,访问接口查看当前某一个服务有几个负载的节点
- 这个后台管理 是用 go + beego + vue 实现的
- 当前这个beego项目就是后台管理部分
-
- 前端部分的代码在 nginx-gray-web
-
lua 动态修改 upstream 的接口
接口的 upstream 参数就是对应哪个服务, server 参数就是哪一个节点
-
方案需要的工具
- 1 openresty 或者 nginx
- 2 luajit 环境
- 3 nginx 添加依赖的模块
./configure --add-module=D:\dev\app\nginx\module\ngx_devel_kit-0.3.1 --add-module=D:\dev\app\nginx\module\lua-nginx-module-0.10.16rc5
-
运行步骤
- openresty 配置步骤
- 把 conf 文件夹的配置文件放到 openresty 的 conf/vhost 目录下
- 把 lue-file 文件夹下的 lua 脚本放到 openresty 的 lualib 目录下
- 启动3个web服务,对应到 8081,8082,8083 接口当作负载均衡的3个节点
- 为这3个web服务做一个动态负载均衡的配置,在上面提到的配置文件里,访问这个 服务的一个接口
- beego 项目运行步骤
- 1 项目使用 beego web框架和go mod依赖管理
- 2 新建一个数据库,名字跟配置文件的一样,把 data.sql 脚本执行
- 3 进入项目根目录,执行 go run main.go 会自动下载相关依赖并启动
- 4 浏览器打开 https://localhost:8090/node/page 检验项目是否能正常运行
- openresty 配置步骤