步骤一:将应用接入MSE微服务治理
将ACK微服务应用接入MSE治理中心,您可以选择您需要的方式实现应用接入。详细接入说明,请参见ACK微服务应用接入MSE治理中心
为ACK命名空间中的应用开启MSE微服务治理
登录MSE治理中心控制台,并在顶部菜单栏选择地域。
在左侧导航栏,选择治理中心 > 应用治理。
在应用列表页面,单击ACK应用接入。
在ACK应用接入对话框中,进行配置,配置完成后,单击确定。

配置项 | 说明 |
接入类型 | 选择命名空间接入。 |
集群类型 | 选择ACK集群或者ACK Serverless集群。
说明 选择集群类型为ASK集群时,需要单击去授权链接对ASK集群进行授权。 |
集群名称/ID | 选择接入MSE微服务治理的集群名称/ID,可通过关键词搜索。 |
ack-onepilot | 显示ack-onepilot接入状态。如果您未安装ack-onepilot,单击ack-onepilot右侧的点击安装,安装完成后状态会显示为已安装。
说明 该步骤接入的组件为ack-onepilot,您可以登录容器服务管理控制台进入目标集群,然后单击运维管理>组件管理查看详情。 |
集群命名空间 | 选择集群命名空间。 |
接入治理命名空间 | 选择接入治理命名空间。在对应命名空间下重新部署现有应用或新创建的应用,均会接入到MSE微服务治理中。关于命名空间的相关信息,请参见命名空间介绍。 |
为单个应用开启MSE微服务治理
登录MSE治理中心控制台,并在顶部菜单栏选择地域。
在左侧导航栏,选择治理中心 > 应用治理。
在应用列表页面,单击ACK应用接入。
在ACK应用接入对话框中,进行配置,配置完成后,单击确定。

配置项 | 说明 |
接入类型 | 选择单个应用接入。 |
集群类型 | 选择ACK集群或者ACK Serverless集群 |
集群名称/ID | 选择接入MSE微服务治理的集群名称/ID,可通过关键词搜索。 |
ack-onepilot | 显示ack-onepilot接入状态。如果您未安装ack-onepilot,单击ack-onepilot右侧的点击安装,安装完成后状态会显示为已安装。
说明 该步骤接入的组件为ack-onepilot,您可以登录容器服务管理控制台进入目标集群,然后单击运维管理>组件管理查看详情。 |
接入步骤 | 按照接入步骤进行操作。 Step 1:进入集群工作负载-无状态应用页面,切换到应用的命名空间下。 Step 2:找到所接入的应用,点击「查看Yaml」。 Step 3:按以下格式编辑Labels,完成后点击「更新」。 spec:
template:
metadata:
labels:
# 填写“on”表示开启接入,需加上双引号
msePilotAutoEnable: "on"
# 填写接入到的治理命名空间,值不存在可自动新建
mseNamespace: xl-mse-demo
# 填写接入MSE的实际应用名称,需加上双引号
msePilotCreateAppName: "your-deployment-name"
|
步骤二:部署应用,模拟线上场景
分别部署spring-cloud-zuul、spring-cloud-a、spring-cloud-b、spring-cloud-c这四个业务应用,以及注册中心Nacos Server和消息服务RocketMQ Server,模拟出一个真实的调用链路。您也可以直接在Demo中获取对应的源码。
Demo应用的结构图下图,应用之间的调用,既包含了Spring Cloud的调用,也包含了Dubbo的调用,覆盖了当前市面上最常用的两种微服务框架。其中C应用会生产出RocketMQ消息,由A应用进行消费,A应用在消费消息时,也会发起新的调用。这些应用都是基础的Spring Cloud、Dubbo和RocketMQ的标准用法。

部署之前,简单介绍一下Demo示例的调用链路:spring-cloud-zuul应用在收到/A/dubbo
的请求时,会把请求转发给spring-cloud-a,然后 spring-cloud-a通过Dubbo协议去访问spring-cloud-b,spring-cloud-b也通过Dubbo协议去访问spring-cloud-c,spring-cloud-c在收到请求后,会生产一个消息,并返回自己的环境标签和IP。这些生产出来的消息会由spring-cloud-a应用消费,spring-cloud-a应用在消费消息的时候,会通过spring cloud去调用spring-cloud-b,spring-cloud-b进而通过spring cloud去调用spring-cloud-c,并且将结果输出到自己的日志中。
#当我们访问/A/dubbo的时候
#返回值是这样A[10.25.xx.xx] -> B[10.25.xx.xx] -> C[10.25.xx.xx]
#同时,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.xx.xx],invoke result:A[10.25.xx.xx] -> B[10.25.xx.xx] -> C[10.25.xx.xx]
本章将以容器服务控制台部署应用为例进行说明,您也可以使用kubectl
的方式部署应用。
在容器服务控制台左侧导航栏中,单击集群。
在集群列表页面,单击目标集群名称或者目标集群右侧操作列下的详情。
在集群管理页左侧导航栏,选择。
在无状态页面选择命名空间,然后单击使用YAML创建资源。
部署所使用的YAML文件如下。
展开查看YAML文件
# 部署Nacos Server
apiVersion: apps/v1
kind: Deployment
metadata:
name: nacos-server
spec:
selector:
matchLabels:
app: nacos-server
template:
metadata:
labels:
app: nacos-server
spec:
containers:
- env:
- name: MODE
value: "standalone"
image: registry.cn-shanghai.aliyuncs.com/yizhan/nacos-server:latest
imagePullPolicy: IfNotPresent
name: nacos-server
ports:
- containerPort: 8848
---
apiVersion: v1
kind: Service
metadata:
name: nacos-server
spec:
type: ClusterIP
selector:
app: nacos-server
ports:
- name: http
port: 8848
targetPort: 8848
# 部署业务应用
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-cloud-zuul
spec:
selector:
matchLabels:
app: spring-cloud-zuul
template:
metadata:
labels:
app: spring-cloud-zuul
msePilotCreateAppName: spring-cloud-zuul
spec:
containers:
- env:
- name: JAVA_HOME
value: /usr/lib/jvm/java-1.8-openjdk/jre
- name: enable.mq.invoke
value: 'true'
image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-zuul:1.0.0
imagePullPolicy: Always
name: spring-cloud-zuul
ports:
- containerPort: 20000
---
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: slb.s1.small
service.beta.kubernetes.io/alicloud-loadbalancer-address-type: internet
name: zuul-slb
spec:
ports:
- port: 80
protocol: TCP
targetPort: 20000
selector:
app: spring-cloud-zuul
type: LoadBalancer
status:
loadBalancer: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-cloud-a
spec:
selector:
matchLabels:
app: spring-cloud-a
template:
metadata:
labels:
app: spring-cloud-a
msePilotCreateAppName: spring-cloud-a
spec:
containers:
- env:
- name: JAVA_HOME
value: /usr/lib/jvm/java-1.8-openjdk/jre
image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-a:1.0.0
imagePullPolicy: Always
name: spring-cloud-a
ports:
- containerPort: 20001
livenessProbe:
tcpSocket:
port: 20001
initialDelaySeconds: 10
periodSeconds: 30
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-cloud-b
spec:
selector:
matchLabels:
app: spring-cloud-b
template:
metadata:
labels:
app: spring-cloud-b
msePilotCreateAppName: spring-cloud-b
spec:
containers:
- env:
- name: JAVA_HOME
value: /usr/lib/jvm/java-1.8-openjdk/jre
image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-b:1.0.0
imagePullPolicy: Always
name: spring-cloud-b
ports:
- containerPort: 20002
livenessProbe:
tcpSocket:
port: 20002
initialDelaySeconds: 10
periodSeconds: 30
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-cloud-c
spec:
selector:
matchLabels:
app: spring-cloud-c
template:
metadata:
labels:
app: spring-cloud-c
msePilotCreateAppName: spring-cloud-c
spec:
containers:
- env:
- name: JAVA_HOME
value: /usr/lib/jvm/java-1.8-openjdk/jre
image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-c:1.0.0
imagePullPolicy: Always
name: spring-cloud-c
ports:
- containerPort: 20003
livenessProbe:
tcpSocket:
port: 20003
initialDelaySeconds: 10
periodSeconds: 30
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: rockectmq-broker
spec:
selector:
matchLabels:
app: rockectmq-broker
template:
metadata:
labels:
app: rockectmq-broker
spec:
containers:
- command:
- sh
- mqbroker
- '-n'
- 'mqnamesrv:9876'
- '-c /home/rocketmq/rocketmq-4.5.0/conf/broker.conf'
env:
- name: ROCKETMQ_HOME
value: /home/rocketmq/rocketmq-4.5.0
image: registry.cn-shanghai.aliyuncs.com/yizhan/rocketmq:4.5.0
imagePullPolicy: Always
name: rockectmq-broker
ports:
- containerPort: 9876
protocol: TCP
- containerPort: 10911
protocol: TCP
- containerPort: 10912
protocol: TCP
- containerPort: 10909
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: rocketmq-name-server
spec:
selector:
matchLabels:
app: rocketmq-name-server
template:
metadata:
labels:
app: rocketmq-name-server
spec:
containers:
- command:
- sh
- mqnamesrv
env:
- name: ROCKETMQ_HOME
value: /home/rocketmq/rocketmq-4.5.0
image: registry.cn-shanghai.aliyuncs.com/yizhan/rocketmq:4.5.0
imagePullPolicy: Always
name: rocketmq-name-server
ports:
- containerPort: 9876
protocol: TCP
- containerPort: 10911
protocol: TCP
- containerPort: 10912
protocol: TCP
- containerPort: 10909
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: mqnamesrv
spec:
type: ClusterIP
selector:
app: rocketmq-name-server
ports:
- name: mqnamesrv-9876-9876
port: 9876
targetPort: 9876
执行以下命令:
kubectl get svc,deploy
预期输出:
➜ ~ kubectl get svc,deploy
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 192.168.xx.xx <none> 4xx/TCP 7d
service/mqnamesrv ClusterIP 192.168.xx.xx <none> 98xx/TCP 47h
service/nacos-server ClusterIP 192.168.xx.xx <none> 88xx/TCP 47h
service/zuul-slb LoadBalancer 192.168.xx.xx 123.56.xx.xx 80:302xxx/TCP 47h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nacos-server 1/1 1 1 4m
deployment.apps/rockectmq-broker 1/1 1 1 4m
deployment.apps/rocketmq-name-server 1/1 1 1 5m
deployment.apps/spring-cloud-a 1/1 1 1 5m
deployment.apps/spring-cloud-b 1/1 1 1 5m
deployment.apps/spring-cloud-c 1/1 1 1 5m
deployment.apps/spring-cloud-zuul 1/1 1 1 5m
步骤三:为应用开启RocketMQ消息灰度
假设spring-cloud-c、spring-cloud-a应用为消息的生产者和消费者,为其开启RocketMQ消息灰度。
说明 RocketMQ消息灰度功能开启和关闭需要容器服务控制台重新部署应用后才能生效。
消息的生产者和消息的消费者,需要同时开启RocketMQ消息灰度,消息的灰度功能才能生效。
消息类型目前只支持RocketMQ,包含开源版本和阿里云商业版。
开启RocketMQ消息灰度后,MSE会修改消息的Consumer Group。例如原来的Consumer Group为group1,环境标签为gray,开启RocketMQ消息灰度后,则group会被修改成group1_gray,如果您使用的是阿里云RocketMQ ,请提前创建好group。
MSE默认使用SQL92的过滤方式,如果您使用开源RocketMQ,需要在服务端开启SQL92过滤功能(即在broker.conf中配置enablePropertyFilter=true
)。
登录MSE治理中心控制台。
在左侧导航栏,选择,然后单击目标资源卡片。
在左侧导航栏,单击流量治理,然后单击消息灰度页签,打开开启消息灰度开关,单击确定。
在容器服务控制台重新部署应用使配置生效。
步骤四:部署新版本应用
在K8s集群中部署新版本的spring-cloud-a-gray、spring-cloud-b-gray和spring-cloud-c-gray。
在容器服务控制台左侧导航栏中,单击集群。
在集群列表页面,单击目标集群名称或者目标集群右侧操作列下的详情。
在集群管理页左侧导航栏,选择。
在无状态页面选择命名空间,然后单击使用YAML创建资源。
部署所使用的YAML文件如下。
展开查看YAML文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-cloud-a-gray
spec:
selector:
matchLabels:
app: spring-cloud-a-gray
template:
metadata:
labels:
alicloud.service.tag: gray
app: spring-cloud-a-gray
msePilotCreateAppName: spring-cloud-a
spec:
containers:
- env:
- name: JAVA_HOME
value: /usr/lib/jvm/java-1.8-openjdk/jre
image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-a:1.0.0
imagePullPolicy: Always
name: spring-cloud-a-gray
ports:
- containerPort: 20001
livenessProbe:
tcpSocket:
port: 20001
initialDelaySeconds: 10
periodSeconds: 30
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-cloud-b-gray
spec:
selector:
matchLabels:
app: spring-cloud-b-gray
template:
metadata:
labels:
alicloud.service.tag: gray
app: spring-cloud-b-gray
msePilotCreateAppName: spring-cloud-b
spec:
containers:
- env:
- name: JAVA_HOME
value: /usr/lib/jvm/java-1.8-openjdk/jre
image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-b:1.0.0
imagePullPolicy: Always
name: spring-cloud-b-gray
ports:
- containerPort: 20002
livenessProbe:
tcpSocket:
port: 20002
initialDelaySeconds: 10
periodSeconds: 30
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-cloud-c-gray
spec:
selector:
matchLabels:
app: spring-cloud-c-gray
template:
metadata:
labels:
alicloud.service.tag: gray
app: spring-cloud-c-gray
msePilotCreateAppName: spring-cloud-c
spec:
containers:
- env:
- name: JAVA_HOME
value: /usr/lib/jvm/java-1.8-openjdk/jre
image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-c:1.0.0
imagePullPolicy: Always
name: spring-cloud-c-gray
ports:
- containerPort: 20003
livenessProbe:
tcpSocket:
port: 20003
initialDelaySeconds: 10
periodSeconds: 30
步骤五:引入流量并进行验证
在MSE治理中心控制台 左侧导航栏,选择治理中心 > 应用治理,然后单击目标应用spring-cloud-a资源卡片。
进入应用概览页,可以看到所有的流量请求都是去往spring-cloud-a应用未打标的版本,即稳定版本。
在应用概览页面下方,单击流量治理 > 标签路由,在打了gray
标签的应用流量规则下方单击添加。
在创建标签路由面板中配置流量规则,然后单击确定。
本文示例中设置的流量规则条件为name=xiaoming
。

关于流量规则的配置,请参见配置标签路由。
流量规则生效后,在应用概览页面可以查看流量分布结果。
在spring-cloud-a的应用概览页面下方,单击流量治理 > 标签路由,在打了gray
标签的应用流量规则下方单击目标规则名称,打开链路传递的开关,然后单击确定。
说明 打开链路传递开关后,name=xiaoming
的灰度流量能在全链路里进行透传,且无需重复地配置规则。

在容器服务控制台集群详情页面左侧导航栏选择。
单击zuul-slb服务所对应的外部端点地址。
在服务调用页面输入/A/a?name=xiaoming,然后单击开始调用。
全链路金丝雀发布已经生效。
此时,spring-cloud-b应用的请求数据如下:

步骤六:调整消息的标签过滤规则,并进行验证
登录MSE治理中心控制台。
在左侧导航栏,选择,然后单击目标应用spring-cloud-a资源卡片。
在左侧导航栏,单击流量治理,然后单击消息灰度页签,找到未打标环境忽略的标签参数,在标签列表中选择gray
,单击确定。
在未打标环境忽略的标签中,选择gray
,意味着带着gray环境标的消息,只能由spring-cloud-a-gray消费,不能由spring-cloud-a来消费。未打标环境忽略的标签参数配置完成后动态生效,您不需要进行重启的操作。
说明 默认情况下,未打标节点将消费所有环境的消息,如果需要指定某个未打标环节点不消费某个标签环境生产出来的消息,只需配置未打标环境忽略的标签参数即可。
登录容器服务控制台,查看spring-cloud-a应用的日志,验证配置。
从下图日志中,可以看到,此时基线环境可以同时消费gray和基线环境生产出来的消息,而且在消费对应环境消息时产生的Spring Cloud调用分别路由到gray和基线环境中。
