3 API网关灰度发布
我们回顾下灰度发布,灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式。在其上可以进行A/B testing,即让一部分用户继续用产品特性A,一部分用户开始用产品特性B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现问题、调整问题,以保证其影响度。
前面我们学习了配置灰度发布、静态资源灰度发布、App 灰度方法方案,API网关灰度发布是什么呢?
API网关灰度发布是指在API网关实现不同功能的灰度路由操作,由于API网关能拦截所有请求,因此可以在微服务网关层实现很多复杂的路由操作。
API网关能实现复杂规则策略的灰度发布操作:
1:根据IP实现区域IP切流路由
2:根据不同版本号实现切流路由
3:根据不同ID实现切流路由
4:根据权重切流路由
5:按照业务切流路由
接下来我们分别对微服务网关灰度发布的权重切流、版本切流、IP/ID切流进行讲解。
3.1 网关层灰度发布分析
在网关层实现灰度发布,我们可以采用2种方式实现,分别是权重和灰度规则配置。
1)权重
当我们的系统刚发布的时候,还不是很稳定,可以放一部分流量来测试新系统,微服务网关可以采用权
重的方式实现流量控制,如果新系统没有问题,逐步把老系统换成新系统。
2)灰度规则配置
灰度规则配置则是网关层常用的灰度发布方式,实现的流程我们分析一下:
1:用户请求到达微服务网关
2:微服务网关执行拦截
3:加载规则配置
4:按照规则配置适配服务
5:执行链路调用
规则配置比较灵活,没有绝对的方案,常用的有 区域IP切流 、 固定用户切流 、 指定版本切流 。
区域IP切流: 指定省份或城市的IP使用灰度版本,多用于多城市的站点发布
固定用户切流: 部分内部账号或测试账号或部分指定会员使用灰度版本
指定版本切流: 根据用户当前版本使用指定服务,用户版本信息一般会传递到后台,多用于APP灰度发送布。
3.2 灰度发布-权重分流
基于Gateway实现灰度发布,首先要做的就是拦截用户请求,再根据规则路由请求。
准备好的项目结构
权重分流结构
如上图,加入 carv1 是稳定版, carv2 是测试版本,我们为了测试 carv2 是否稳定,可以放部分流量到 carv2 来测试,放部分流量可以采用权重的方式来实现,让 carv1 占据90%流量, carv2 只占据10%流量。
权重配置只需要做2个操作:
1:让相关服务归属一个服务组
2:给服务组配置权重
修改 gray-gateway 的 bootstrap.yml 配置文件,如下:
配置代码如
gateway:
routes:
# 通过访问http://localhost:8001/car,来测试权重
- id: car-version1
uri: lb://car-version1
predicates:
- Path=/car/**
- Weight=group1, 8
- id: car-version2
uri: lb://car-version2
predicates:
- Path=/car/**
- Weight=group1, 2
3.3 多策略灰度发布
3.3.1 多策略灰度发布实现分析
如上图,实现多策略灰度发布,可以按照这个流程来实
1:稳定系统和灰度系统将信息注册到Nacos中,包括版本信息
2:用户执行请求,我们需要根据灰度规则动态筛选指定服务,可以编写过滤器拦截所有请求,再执行服务筛选
3:服务筛选方法在ReactorServiceInstanceLoadBalancer对象中,叫choose(),我们需要重写它
4:根据当前用户请求信息、IP信息、用户信息进行不同策略的灰度服务筛选
5:筛选后,需要将筛选的服务返回给过滤器,过滤器执行链路
3.3.2 多策略主流程实现
我们先把主要运行流程代码实现出来,再编写不同的策略进行切换即可。主流程我们按照如下流程实现操:
1:配置服务节点注册到nacos中的版本信息
2:配置服务调用的scheme
3:获取scheme,bootstrap.yml中 uri: scheme://xxx
4:判断当前scheme是否为灰度服务,我们定义灰度服务的scheme为grayLb
5:根据不同策略获取灰度服务实例
7:灰度服务链路调用
3.2.1 version和scheme配置
修改 carv1 和 carv2 的bootstrap.yml,如下操作:
。。。。