【黑马】Java架构师实战笔记《博学谷》

294 阅读4分钟

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,如下操作:

。。。。