黑白之间的平稳过度
前言
听了组里一位大佬关于灰度发布方案的分享会,受益匪浅。于是整理了这一篇博客,加深一下印象和理解。
什么是灰度发布
引用百度百科的一段解释:
灰度发布(又名金丝雀发布)是指在黑与白之间,能够平滑过渡的一种发布方式。在其上可以进行A/B testing,即让一部分用户继续用产品特性A,一部分用户开始用产品特性B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。
为什么要做灰度发布
一个产品,如果需要快速迭代开发上线,又要保证质量,保证刚上线的系统,一旦出现问题那么可以很快的控制影响面,就需要设计一套灰度发布系统。灰度发布系统的作用在于,可以根据自己的配置,来将用户的流量导到新上线的系统上,来快速验证新的功能修改,而一旦出问题,也可以马上的恢复,简单的说,就是一套A/BTest系统。
- 灰度发布,动态分流,即时生效,无需重启
- 降低系统升级带来的影响范围,保证系统稳定性
- 提前规避一定的风险,具有一定的容灾能力
方案选型
ngx_lua
简介:
- Openresty (https://openresty.org/cn/)
原理:
- 将lua VM嵌入到nginx worker里,nginx各阶段lua都可以参与
- nginx IO原语封装注入lua VM,lua可以发起IO请求
- ngx_lua采用协程处理每个请求,协程间互相隔离,数据安全
- lua调用IO操作不能立即完成时,将自身协程挂起,不拥塞worker
虚拟主机配置:

第一红框处,定义了两个upstream节点,一个是灰度服务器,一个是默认服务器;
第二个红框处,代理了这两个upstream节点;
第三个红框处,加载灰度策略控制的lua脚本。
灰度策略控制中心lua脚本:

在redis中存放需要认证的一些条件,然后在lua脚本中中获取这些条件进行判断,达到不同case走不同的upstream的效果。
架构图:

客户端(Client)发起请求,负载均衡集群(LB)接受参数并传入代理层(Proxy),然后经过规则验证命中不同的服务器(Server)。
策略控制中心:

整体流程图:

实现细节
动态策略管理后台:
- 项目配置
- 策略类型
- 策略功能
分流策略控制中心:
- 项目标识获取
- 策略参数提取
- 策略配置提取
- 策略命中
- 动态分流
灰度监控:
- 策略控制中心异常监控
- 灰度结果监控(业务监控等等)
异常处理:
- 策略控制中心异常处理
- 灰度结果异常处理
代码发布流程
