通过MSE提供的全链路灰度能力,您可以无需修改业务代码,实现全链路流量控制。本文介绍如何通过配置MSE全链路灰度功能,为Java微服务网关或者Spring Cloud应用这类入口应用实现全链路灰度。
使用限制
由于全链路灰度功能整合了标签路由功能,因此不推荐已经加入全链路流量控制的应用同时配置金丝雀发布、标签路由规则。
限制项 | 限制值 | 备注 |
---|---|---|
Spring Cloud版本 | Spring Cloud Edgware及以上版本。 | 无 |
Dubbo版本 | 2.5.3~2.7.8 | Dubbo 3.0+版本支持当前处于灰度中,如有场景需求,请加入钉群(钉群号:34754806)联系技术支持。 |
客户端类型 |
|
无 |
Java应用JDK版本 | 目前支持JDK 1.6、1.7、1.8版本应用接入 | JDK 1.11版本当前处于灰度中,如有场景需求,请加入钉群(钉群号:34754806)联系技术支持。 |
负载均衡类型 |
|
无 |
Spring Cloud Gateway版本 | Spring Cloud Gateway 2.1.0.RELEASE+ | 无 |
Spring Cloud Zuul版本 | 1.3.x | 无 |
注册中心类型 |
|
微服务治理能力无关注册中心,可以是MSE托管注册中心,也可以是自建注册中心。 |
背景信息
在微服务场景中,当您部署的Spring Cloud应用或Dubbo应用存在升级版本时,由于应用间的调用是随机的,会导致无法将具有一定特征的流量路由到应用的目标版本。全链路流量控制功能将应用的相关版本隔离成一个独立的运行环境(即 泳道 ),通过设置泳道规则,将满足规则的请求流量路由到目标版本应用。
本文以电商架构中的下单场景为例,介绍Java微服务网关到微服务的全链路流控功能。假设应用的架构由Java微服务网关Zuul,以及后端的微服务架构(Spring Cloud)组成。后端调用链路有3个:购物车(A)、交易中心(B)和库存中心(C),可以通过客户端或者是HTML来访问后端服务,这些服务之间通过Nacos注册中心实现服务发现。
用户下单后,流量从Java微服务网关(Spring Cloud Gateway或者Spring Cloud Zuul)进来,调用交易中心,交易中心再调用商品中心,商品中心调用下游的库存中心。交易中心和商品中心各有两个新版本(1和2)在运行,需要对这两个新版本进行灰度验证。此时通过配置微服务网关的全链路灰度规则将满足特定流控规则的请求流量路由到新版本,其余流量全部路由到线上(正式)版本。

术语说明
术语 | 说明 |
---|---|
泳道 | 相同版本应用定义的一套隔离环境。只有满足了流控路由规则的请求流量才会路由到对应泳道里的打标应用。每条泳道,和一个标签相对应。泳道组里标签相同的多个应用节点,必定属于同一个泳道。一个应用可以属于多个泳道,一个泳道可以包含多个应用,应用和泳道是多对多的关系。 |
泳道组 | 泳道的集合。泳道组的作用主要是为了区分不同团队或不同场景。 |
适用场景
- 入口应用为Java微服务网关(Spring Cloud Gateway/Spring Cloud Zuul)或者Spring Cloud应用。
- 想要根据请求的Header、Cookie和Parameter等特征配置规则来实现全链路灰度。
准备工作
创建Kubernetes集群
具体创建操作,请参见创建Kubernetes托管版集群和创建Kubernetes专有版集群。
开启MSE微服务治理
部署Demo应用程序
部署所使用的YAML文件
# 部署 Nacos Server
apiVersion: apps/v1
kind: Deployment
metadata:
name: nacos-server
spec:
selector:
matchLabels:
app: nacos-server
template:
metadata:
labels:
app: nacos-server
msePilotAutoEnable: 'off'
spec:
containers:
- env:
- name: MODE
value: "standalone"
image: registry.cn-shanghai.aliyuncs.com/yizhan/nacos-server:latest
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
msePilotAutoEnable: 'on'
spec:
containers:
- name: spring-cloud-zuul
image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-zuul:1.0.0
imagePullPolicy: Always
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
---
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
msePilotAutoEnable: 'on'
spec:
containers:
- name: spring-cloud-a
image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-a:1.0.0
imagePullPolicy: Always
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
msePilotAutoEnable: 'on'
spec:
containers:
- name: spring-cloud-b
image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-b:1.0.0
imagePullPolicy: Always
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
msePilotAutoEnable: 'on'
spec:
containers:
- name: spring-cloud-c
image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-c:1.0.0
imagePullPolicy: Always
ports:
- containerPort: 20003
livenessProbe:
tcpSocket:
port: 20003
initialDelaySeconds: 10
periodSeconds: 30
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-cloud-a-gray
spec:
selector:
matchLabels:
app: spring-cloud-a-gray
template:
metadata:
labels:
app: spring-cloud-a-gray
alicloud.service.tag: gray
msePilotCreateAppName: spring-cloud-a
msePilotAutoEnable: 'on'
spec:
containers:
- name: spring-cloud-a-gray
image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-a:1.0.0
imagePullPolicy: Always
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:
app: spring-cloud-b-gray
alicloud.service.tag: gray
msePilotCreateAppName: spring-cloud-b
spec:
containers:
- name: spring-cloud-b-gray
image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-b:1.0.0
imagePullPolicy: Always
ports:
- containerPort: 20002
livenessProbe:
tcpSocket:
port: 20002
initialDelaySeconds: 10
periodSeconds: 30
步骤一:创建泳道组
步骤二:创建泳道
步骤三:验证特征流量路由到目标应用
结果验证
查看打标应用的流量监控图
查看所有应用监控图
您除了查看单个应用的监控图外,您还可以查看泳道组内所有应用的监控图。在QPS监控图右侧单击查看所有应用监控(流量逃逸观测),您可以查看该泳道所有应用的流量监控视图。您可以选择查看同一时刻调用的应用概览信息,也可以分析流量逃逸问题,判断逃逸对象。
