
1、第一种场景是在消息消费时,可能会产生新的 RPC 调用,如果没有在消息这一环去遵循之前设定好的全链路流量控制的规则,会导致通过消息产生的这部分流量“逃逸”,从而导致全链路灰度的规则遭到破坏,导致出现不符合预期的情况。


前提条件
Cloud Native
开通 MSE 专业版,请参见开通 MSE 微服务治理专业版[1]。 创建 ACK 集群,请参见创建 Kubernetes 集群[2]。
操作步骤
Cloud Native
登录容器服务控制台[3]。 在左侧导航栏单击市场 > 应用目录。 在应用目录页面点击阿里云应用,选择微服务,并单击 ack-mse-pilot。 在 ack-mse-pilot 页面右侧集群列表中选择集群,然后单击创建。

创建成功后,会自动跳转到目标集群的 Helm 页面,检查安装结果。如果出现以下页面,展示相关资源,则说明安装成功。

登录 MSE 治理中心控制台[4],如果您尚未开通 MSE 微服务治理,请根据提示开通。 在左侧导航栏选择微服务治理中心 > Kubernetes 集群列表。 在 Kubernetes 集群列表页面搜索框列表中选择集群名称或集群 ID,然后输入相应的关键字,单击搜索图标。 单击目标集群操作列的管理。 在集群详情页面命名空间列表区域,单击目标命名空间操作列下的开启微服务治理。 在开启微服务治理对话框中单击确认。


当我们调用 /A/dubbo 的时候返回值是这样 A[10.25.0.32] -> B[10.25.0.152] -> C[10.25.0.30]同时,A 应用在接收到消息之后,输出的日志如下2021-12-28 10:58:50.301 INFO 1 --- [essageThread_15] c.a.mse.demo.service.MqConsumer : topic:TEST_MQ,producer:C[10.25.0.30],invoke result:A[10.25.0.32] -> B[10.25.0.152] -> C[10.25.0.30]
# 部署 Nacos ServerapiVersion: apps/v1kind: Deploymentmetadata:name: nacos-serverspec:selector:matchLabels:app: nacos-servertemplate:metadata:annotations:labels:app: nacos-serverspec:containers:- env:- name: MODEvalue: "standalone"image: registry.cn-shanghai.aliyuncs.com/yizhan/nacos-server:latestimagePullPolicy: IfNotPresentname: nacos-serverports:- containerPort: 8848---apiVersion: v1kind: Servicemetadata:name: nacos-serverspec:type: ClusterIPselector:app: nacos-serverports:- name: httpport: 8848targetPort: 8848# 部署业务应用---apiVersion: apps/v1kind: Deploymentmetadata:name: spring-cloud-zuulspec:selector:matchLabels:app: spring-cloud-zuultemplate:metadata:annotations:msePilotCreateAppName: spring-cloud-zuullabels:app: spring-cloud-zuulspec:containers:- env:- name: JAVA_HOMEvalue: /usr/lib/jvm/java-1.8-openjdk/jre- name: enable.mq.invokevalue: 'true'image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-zuul:1.0.0imagePullPolicy: Alwaysname: spring-cloud-zuulports:- containerPort: 20000---apiVersion: v1kind: Servicemetadata:annotations:service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: slb.s1.smallservice.beta.kubernetes.io/alicloud-loadbalancer-address-type: internetname: zuul-slbspec:ports:- port: 80protocol: TCPtargetPort: 20000selector:app: spring-cloud-zuultype: LoadBalancerstatus:loadBalancer: {}---apiVersion: apps/v1kind: Deploymentmetadata:name: spring-cloud-aspec:selector:matchLabels:app: spring-cloud-atemplate:metadata:annotations:msePilotCreateAppName: spring-cloud-alabels:app: spring-cloud-aspec:containers:- env:- name: JAVA_HOMEvalue: /usr/lib/jvm/java-1.8-openjdk/jreimage: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-a:1.0.0imagePullPolicy: Alwaysname: spring-cloud-aports:- containerPort: 20001livenessProbe:tcpSocket:port: 20001initialDelaySeconds: 10periodSeconds: 30---apiVersion: apps/v1kind: Deploymentmetadata:name: spring-cloud-bspec:selector:matchLabels:app: spring-cloud-btemplate:metadata:annotations:msePilotCreateAppName: spring-cloud-blabels:app: spring-cloud-bspec:containers:- env:- name: JAVA_HOMEvalue: /usr/lib/jvm/java-1.8-openjdk/jreimage: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-b:1.0.0imagePullPolicy: Alwaysname: spring-cloud-bports:- containerPort: 20002livenessProbe:tcpSocket:port: 20002initialDelaySeconds: 10periodSeconds: 30---apiVersion: apps/v1kind: Deploymentmetadata:name: spring-cloud-cspec:selector:matchLabels:app: spring-cloud-ctemplate:metadata:annotations:msePilotCreateAppName: spring-cloud-clabels:app: spring-cloud-cspec:containers:- env:- name: JAVA_HOMEvalue: /usr/lib/jvm/java-1.8-openjdk/jreimage: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-c:1.0.0imagePullPolicy: Alwaysname: spring-cloud-cports:- containerPort: 20003livenessProbe:tcpSocket:port: 20003initialDelaySeconds: 10periodSeconds: 30---apiVersion: apps/v1kind: Deploymentmetadata:name: rockectmq-brokerspec:selector:matchLabels:app: rockectmq-brokertemplate:metadata:labels:app: rockectmq-brokerspec:containers:- command:- sh- mqbroker- '-n'- 'mqnamesrv:9876'- '-c /home/rocketmq/rocketmq-4.5.0/conf/broker.conf'env:- name: ROCKETMQ_HOMEvalue: /home/rocketmq/rocketmq-4.5.0image: registry.cn-shanghai.aliyuncs.com/yizhan/rocketmq:4.5.0imagePullPolicy: Alwaysname: rockectmq-brokerports:- containerPort: 9876protocol: TCP- containerPort: 10911protocol: TCP- containerPort: 10912protocol: TCP- containerPort: 10909---apiVersion: apps/v1kind: Deploymentmetadata:name: rocketmq-name-serverspec:selector:matchLabels:app: rocketmq-name-servertemplate:metadata:labels:app: rocketmq-name-serverspec:containers:- command:- sh- mqnamesrvenv:- name: ROCKETMQ_HOMEvalue: /home/rocketmq/rocketmq-4.5.0image: registry.cn-shanghai.aliyuncs.com/yizhan/rocketmq:4.5.0imagePullPolicy: Alwaysname: rocketmq-name-serverports:- containerPort: 9876protocol: TCP- containerPort: 10911protocol: TCP- containerPort: 10912protocol: TCP- containerPort: 10909protocol: TCP---apiVersion: v1kind: Servicemetadata:name: mqnamesrvspec:type: ClusterIPselector:app: rocketmq-name-serverports:- name: mqnamesrv-9876-9876port: 9876targetPort: 9876
➜ ~ kubectl get svc,deployNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEservice/kubernetes ClusterIP 192.168.0.1 <none> 443/TCP 7dservice/mqnamesrv ClusterIP 192.168.213.38 <none> 9876/TCP 47hservice/nacos-server ClusterIP 192.168.24.189 <none> 8848/TCP 47hservice/zuul-slb LoadBalancer 192.168.189.111 123.56.253.4 80:30260/TCP 47hNAME READY UP-TO-DATE AVAILABLE AGEdeployment.apps/nacos-server 1/1 1 1 4mdeployment.apps/rockectmq-broker 1/1 1 1 4mdeployment.apps/rocketmq-name-server 1/1 1 1 5mdeployment.apps/spring-cloud-a 1/1 1 1 5mdeployment.apps/spring-cloud-b 1/1 1 1 5mdeployment.apps/spring-cloud-c 1/1 1 1 5mdeployment.apps/spring-cloud-zuul 1/1 1 1 5m
➜ ~ curl http://123.56.253.4/A/dubboA[10.25.0.32] -> B[10.25.0.152] -> C[10.25.0.30]

使用此功能您无需修改应用的代码和配置。
消息的生产者和消息的消费者,需要同时开启消息灰度,消息的灰度功能才能生效。
消息类型目前只支持 RocketMQ,包含开源版本和阿里云商业版。
如果您使用开源 RocketMQ,则 RocketMQ Server 和 RocketMQ Client 都需要使用 4.5.0 及以上版本。
如果您使用阿里云 RocketMQ,需要使用铂金版,且 Ons Client 使用 1.8.0.Final 及以上版本。
开启消息灰度后,MSE 会修改消息的 Consumer Group。例如原来的 Consumer Group 为 group1,环境标签为 gray,开启消息灰度后,则 group 会被修改成 group1_gray,如果您使用的是阿里云 RocketMQ ,请提前创建好 group。
默认使用 SQL92 的过滤方式,如果您使用的开源 RocketMQ,需要在服务端开启此功能(即在 broker.conf 中配置 enablePropertyFilter=true)。
默认情况下,未打标节点将消费所有环境的消息,若需要指定 未打标环节点 不消费 某个标签环境生产出来的消息,请配置“未打标环境忽略的标签”,修改此配置后动态生效,无需重启应用。

apiVersion: apps/v1kind: Deploymentmetadata:name: spring-cloud-a-grayspec:selector:matchLabels:app: spring-cloud-a-graytemplate:metadata:annotations:alicloud.service.tag: graymsePilotCreateAppName: spring-cloud-alabels:app: spring-cloud-a-grayspec:containers:- env:- name: JAVA_HOMEvalue: /usr/lib/jvm/java-1.8-openjdk/jreimage: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-a:1.0.0imagePullPolicy: Alwaysname: spring-cloud-a-grayports:- containerPort: 20001livenessProbe:tcpSocket:port: 20001initialDelaySeconds: 10periodSeconds: 30---apiVersion: apps/v1kind: Deploymentmetadata:name: spring-cloud-b-grayspec:selector:matchLabels:app: spring-cloud-b-graytemplate:metadata:annotations:alicloud.service.tag: graymsePilotCreateAppName: spring-cloud-blabels:app: spring-cloud-b-grayspec:containers:- env:- name: JAVA_HOMEvalue: /usr/lib/jvm/java-1.8-openjdk/jreimage: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-b:1.0.0imagePullPolicy: Alwaysname: spring-cloud-b-grayports:- containerPort: 20002livenessProbe:tcpSocket:port: 20002initialDelaySeconds: 10periodSeconds: 30---apiVersion: apps/v1kind: Deploymentmetadata:name: spring-cloud-c-grayspec:selector:matchLabels:app: spring-cloud-c-graytemplate:metadata:annotations:alicloud.service.tag: graymsePilotCreateAppName: spring-cloud-clabels:app: spring-cloud-c-grayspec:containers:- env:- name: JAVA_HOMEvalue: /usr/lib/jvm/java-1.8-openjdk/jreimage: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-c:1.0.0imagePullPolicy: Alwaysname: spring-cloud-c-grayports:- containerPort: 20003livenessProbe:tcpSocket:port: 20003initialDelaySeconds: 10periodSeconds: 30
登录 MSE 治理中心控制台[4],选择应用列表。 单击应用 spring-cloud-a 应用详情菜单,此时可以看到,所有的流量请求都是去往 spring-cloud-a 应用未打标的版本,即稳定版本。

点击页面下方的 标签路由中的添加按钮,为 spring-cloud-a 应用的 gray 版本设置灰度规则。


发起流量调用,我们通过 zuul-slb,分别发起流量调用,并查看灰度的情况。





调整 spring-cloud-a 未打标环境的过滤规则。比如这里我们要选择未打标环境不再消费 gray 环境生产出来的消息,只需要在“未打标环境忽略的标签”里面选择 gray,然后点击确定即可。

调整规则之后,规则是可以动态地生效,不需要进行重启的操作,我们直接查看 spring-cloud-a 的日志,验证规则调整生效。

操作总结
Cloud Native
全链路消息灰度的整个过程是不需要修改任何代码和配置的。 目前仅支持 RocketMQ,Client 版本需要在 4.5.0 之后的版本。RocketMQ Server 端需要支持 SQL92 规则过滤,即开源 RocketMQ 需要配置 enablePropertyFilter=true,阿里云 RocketMQ 需要使用铂金版。 开启消息灰度后,MSE Agent 会修改消息消费者的 group,如原来的消费 group 为 group1,环境标签为 gray,则 group 会被修改成 group1_gray,如果使用的是阿里云 RocketMQ,需要提前创建好修改后的 group。 开启和关闭消息灰度后,应用需要重启才能生效;修改未打标环境忽略的标签功能可以动态生效,不需要重启。
相关链接
Cloud Native
[1] MSE 微服务治理专业版:
https://help.aliyun.com/document_detail/333529.html
[2] Kubernetes 集群:
https://help.aliyun.com/document_detail/86488.html
深入剖析全链路灰度技术内幕
如何用20分钟就能获得同款企业级全链路灰度能力?
了解更多相关信息,请扫描下方二维码或搜索微信号(AlibabaCloud888)添加云原生小助手!获取更多相关资讯!

文章转载自阿里巴巴云原生,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




