背景介绍
在大多数业务场景中对于消息的灰度并没有RPC调用那么严格,但是当全链路灰度调用中涉及到消息消费时,如果消息消费没有按照全链路流量规则路由,则会导致通过消息产生的流量逃逸,从而破坏全链路规则,导致出现一些不符合预期的情况。
如下图所示,本文分别部署网关、app-a、app-a-gray、app-b、app-b-gray、app-c、app-c-gray以及RocketMQ,模拟一个真实的全链路灰度场景。
通过网关调用app-a应用的接口,当满足路由规则后,灰度流量会被路由到app-a-gray,app-a-gray又会调用app-b-gray,随后由app-b-gray发送灰度消息,app-c-gray将会收到灰度消息,而app-c不会收到灰度消息。
前提条件
- 用户已开通微服务治理中心企业版。
- 用户已开通云容器引擎。
- 用户已部署RocketMQ,且RocketMQ版本在4.5.0以上,broker.conf中已配置enablePropertyFilter=true。
具体操作
一,部署Demo应用
准备自建入口网关msgc-zuul,准备应用msgc-app-a,msgc-app-b和msgc-app-c。调用过程是msgc-app-a –> msgc-app-b -> msgc-app-c。
步骤1:在云容器引擎中安装微服务治理插件
- 登录“云容器引擎”控制台
- 在左侧菜单栏选择“集群”,点击目标集群
- 在集群管理页面点击“插件”-“插件市场”,选择“cubems”插件安装
步骤2:为应用开启微服务治理能力
- 登录“云容器引擎”控制台
- 左侧菜单栏选择“集群”,点击目标集群
- 在集群管理页面点击“工作负载”-“无状态”,选择目标命名空间
- 在Deployment列表页选择指定Deployment,并点击“全量替换”,进入Deployment编辑页
- 在Deployment编辑页点击“显示高级设置”,新增“Pod标签”: mseCubeMsAutoEnable:on, 随后新增“Pod注解”,mse.appName:app-a,mse.enable:true
- 完成分别为app-a-gray、app-b-gray和app-c-gray应用添加标签。
- 完成编辑后点击“提交”,重新发布容器即可接入。
app-a应用的配置
基线:
灰度:
app-b应用的配置
基线:
灰度:
app-c应用的配置
基线:
灰度:
zuul应用的配置:
二,创建泳道组
- 登录微服务治理控制台
- 在左侧导航栏选择全链路灰度,点击创建泳道组
- 在创建泳道组也页面,设置泳道组相关参数,然后单击确定
三,创建泳道
- 找到目标泳道组页面,点击创建第一个分流泳道
- 设置泳道名称,选择目标应用所属标签,创建泳道
四,设置泳道组路由规则
设置路由规则,通过前端访问传过来不同的Header,在自建网关通过header判断将流量路由到指定的泳道。
五,开启消息灰度
- 进入微服务治理中心控制台,点击应用治理。
- 依次点击应用卡片app-a、app-b和app-c。
- 选择流量治理->消息灰度。
- 点击编辑,分别打开app-a、app-b和app-c的消息灰度开关。
结果验证
通过自建网关访问app-a->app-b->app-c。
不携带Header参数tag=gray请求app-a接口/a/mqGray,发现app-c获得消息消费。
携带Header参数tag=gray请求app-a接口/a/mqGray,发现app-c-gray获得消息消费。