什么是灰度发布?灰度发布几种类型

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

一、方案背景介绍

1. 什么是灰度发布

灰度发布是指在 黑和白(0和1)之间能够平滑过渡的一种发布方式。

AB test就是一种灰度发布方式指为产品已发布A版本在发布B版本时在同一时间维度
让一部分用户继续用A版本一部分用户开始用B版本如果用户对B版本没有什么反对意见那么逐步扩大范围把所有用户都迁移到B版本上面来。灰度发布可以保证整体系统的稳定在初始灰度发布时就可以发现及调整问题以保证其影响度。

1.2 灰度发布好处

  • 降低发布影响面 就算出问题也只会影响部分用户从而可以提前发现新版本中的 bug然后在下一次发布前提前修复避免影响更多用户
  • 提升用户体验 除了能发现 bug还能很好的收集新版本的用户使用反馈从而提前调整系统提升用户体验也能给后续的产品演进带来参考价值。
  • 可以做到不停机的热迁移版本回滚便捷速度快

1.3 背景

针对我们当前现状使用灰度发布的背景
在目前app完成测试准备上线发布时候就需要运维支持了其中的挑战点在于如何不影响当前在线业务的情况下来进行升级。
系统升级就会有风险系统宕机风险用户使用习惯改变而造成用户流失的风险服务错误不可用等等风险。
利用灰度发布 降低发布带来的影响虽然功能都在test环境测过但毕竟没发布到prod环境如果先让少部分用户先使用新版本提前发现bug或者性能问题提前做好修复就可以降低新版本带来的影响。
其主要思想就是把影响集中到一个点然后再发散到一个面出现意外情况后很容易就回退即使影响也是可控的。

二、灰度发布几种类型

灰度发布的主要分类

  • 金丝雀发布
  • 滚动发布
  • 蓝绿发布

1金丝雀发布
金丝雀发布成本较低只需要一个实例即可降低新版本存在的风险适合缺乏足够的发布工具研发能力及成长型的小公司。但是金丝雀发布也有缺点当升级全部剩余实例时如果流量过多可能会导致服务中断。
[图片]

2滚动发布
滚动发布则是在金丝雀发布的基础上进行的改进和优化第一次也是使用金丝雀发布后续则使用多批次的形式发布剩余实例每次批次之间会进行观察如果有问题再进行回滚。
[图片]

3蓝绿发布

蓝绿发布比较简单只是对全量发布的一种优化而已发布前不用全部停机而是另外部署新版本全部实例然后再把流量全部再切换到新版本。
[图片]

三、选型

在这里插入图片描述

全量发布不建议使用

蓝绿发布适合于对于资源预算比较充足的业务或者是比较简单的单体应用可以快速实现系统的整体变更

金丝雀和全链路灰度适合需要针对特定用户或者人群进行现网请求验证的业务可以显著减低风险

综上建议选择 金丝雀或者全链路灰度 进行服务的升级发布。

四、灰度发布流程及实现思路

用户请求————> 网关----->服务a----->服务b
1、用户会发送请求
2、经过网关分发请求到具体的服务A
3、服务A 调用服务B
[图片]
灰度发布的核心就是路由转发如果我们能够自定义网关到 服务A 及 服务A到服务B中间的路由策略就可以实现用户引流灰度发布。

五、几种实现方案

1SpringCloud+Redis 实现灰度发布

通过网关寻找下层服务之前通过拦截器处理请求头的参数信息通过判断Redis数据当前请求是否符合灰度的要求如果符合走灰度服务否则走正常服务。

[图片]

2Nginx +Lua + Redis 实现灰度发布

原理使用nginx做负载均衡和反向代理nginx内嵌lua模块解析并执行lua编写的脚本逻辑可以通过lua解析cookie以及访问redis而一些灰度发布分流的策略就是放在redis里通过cookie关联

执行过程

  • 当用户请求到达前段代理服务nginx內嵌的lua模块解析nginx配置文件中的lua脚本代码
  • lua变量获取到客户端的ip地址去查询redis缓存内是否有该建值如果有返回值执行@client_test否则执行@client
  • location @client_test把请求转发给灰度发布服务location@client把请求转发给正常服务服务器返回结果。
    [图片]

3Openresty+Lua+Redis灰度发布

OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项用于方便地搭建能够处理高并发、高扩展性的动态 Web 应用、Web 服务和动态网关。
Http协议的灰度功能主要基于ngx_http_lua_module模块实现Tcp协议的灰度功能主要基于ngx_stream_lua_module模块实现。

本系统实现了对Http协议和Tcp协议的灰度功能并且提供后台管理系统对灰度白名单进行管理。
三种方式灰度实现
Http协议灰度实现如下功能

  • 通过IP或者IP段验证客户端IP是否灰度白名单
  • 通过获取header头中的userid验证是否灰度白名单
  • 通过获取header头中的device-id验证是否灰度白名单。
    TCP协议灰度实现如下功能
  • 通过IP或者IP段验证客户端IP是否灰度白名单
    后台管理系统实现如下功能
  • 支持对设备deviceId灰度白名单新增、删除和查询功能
  • 支持对客户端IP灰度白名单新增、删除和查询功能
  • 支持对用户userId灰度白名单新增、删除和查询功能同时可以根据配置灰度策略将满足条件的用户自动导入灰度白名单中。
    [图片]

说明
1、当用户请求到达前端web代理服务器Openresty内嵌的lua模块解析Nginx配置文件中的lua脚本代码
2、Lua获取客户端IP地址、userId和设备ID去查询Redis中是否有该键值如果有则转发到灰度环境否则转发到生产环境中
3、后端管理系统提供可视化界面可以管理redis中的白名单信息包括客户端IP白名单、userId白名单、设备Id白名单。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6