深入剖析全链路灰度技术内幕
微服务架构带来的挑战
Cloud Native
什么是全链路灰度
Cloud Native
基于 Provider 的治理策略。配置 Cart 的流量流入规则,User 路由到 Cart 时使用 Cart 的流量流入规则。
基于 Consumer 的治理策略。配置 User 的流量流出规则, User 路由到 Cart 时使用 User 的流量流出规则。
全链路灰度的解决方案
Cloud Native
链路上各个组件和服务能够根据请求流量特征进行动态路由 需要对服务下的所有节点进行分组,能够区分版本
需要对流量进行灰度标识、版本标识 需要识别出不同版本的灰度流量
标签路由
节点打标
流量染色
分布式链路追踪
逻辑环境隔离——基于 SDK
逻辑环境隔离——基于 Java Agent
逻辑环境隔离——基于 Service Mesh
三种方式对比
如果您倾向于使用无侵入式的 Java Agent 的方式,但又担心自建带来的稳定性问题,您可以选择 MSE 微服务治理产品,该产品是阿里巴巴内部多年在微服务治理领域的沉淀的产出,经历了各种大促考验。
如果您倾向于使用语言无关、无侵入式的 Service Mesh 的方式,但又担心自建带来的稳定性问题,您可以选择阿里云 ASM 产品,相比开源 Istio,在功能性、稳定性和安全性都有很大的提升。
从 0 到 1 实践全链路灰度
Cloud Native
必备的资源列表
已拥有一个 MSE 云原生网关 已拥有一个 MSE Nacos 注册中心
已拥有一个 ACK 运维集群 已开通 MSE 微服务治理专业版
部署 Demo 应用程序
全链路灰度能力是与注册中心无关的,本文用例暂以 MSE Nacos 作为注册中心,所以需要将 spring.cloud.nacos.discovery.server-addr 换成业务自己的 Nacos 注册中心地址 接入云原生网关的服务,如果需要使用灰度发布,需要在发布服务时在元数据信息增加版本标。在我们的例子,服务 A 是需要暴露给网关,所以发布时为基线版本添加spring.cloud.nacos.discovery.metadata.version=base,为灰度版本添加 spring.cloud.nacos.discovery.metadata.version=gray。
# A 应用 base 版本
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: spring-cloud-a
name: spring-cloud-a
spec:
replicas: 2
selector:
matchLabels:
app: spring-cloud-a
template:
metadata:
annotations:
msePilotCreateAppName: spring-cloud-a
labels:
app: spring-cloud-a
spec:
containers:
env:
name: LANG
value: C.UTF-8
name: JAVA_HOME
value: /usr/lib/jvm/java-1.8-openjdk/jre
name: spring.cloud.nacos.discovery.server-addr
value: mse-455e0c20-nacos-ans.mse.aliyuncs.com:8848
name: spring.cloud.nacos.discovery.metadata.version
value: base
image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-a:0.1-SNAPSHOT
imagePullPolicy: Always
name: spring-cloud-a
ports:
containerPort: 20001
protocol: TCP
resources:
requests:
cpu: 250m
memory: 512Mi
# A 应用 gray 版本
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: spring-cloud-a-new
name: spring-cloud-a-new
spec:
replicas: 2
selector:
matchLabels:
app: spring-cloud-a-new
strategy:
template:
metadata:
annotations:
gray :
msePilotCreateAppName: spring-cloud-a
labels:
app: spring-cloud-a-new
spec:
containers:
env:
name: LANG
value: C.UTF-8
name: JAVA_HOME
value: /usr/lib/jvm/java-1.8-openjdk/jre
name: profiler.micro.service.tag.trace.enable
value: "true"
name: spring.cloud.nacos.discovery.server-addr
value: mse-455e0c20-nacos-ans.mse.aliyuncs.com:8848
name: spring.cloud.nacos.discovery.metadata.version
value: gray
image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-a:0.1-SNAPSHOT
imagePullPolicy: Always
name: spring-cloud-a-new
ports:
containerPort: 20001
protocol: TCP
resources:
requests:
cpu: 250m
memory: 512Mi
# B 应用 base 版本
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: spring-cloud-b
name: spring-cloud-b
spec:
replicas: 2
selector:
matchLabels:
app: spring-cloud-b
strategy:
template:
metadata:
annotations:
msePilotCreateAppName: spring-cloud-b
labels:
app: spring-cloud-b
spec:
containers:
env:
name: LANG
value: C.UTF-8
name: JAVA_HOME
value: /usr/lib/jvm/java-1.8-openjdk/jre
name: spring.cloud.nacos.discovery.server-addr
value: mse-455e0c20-nacos-ans.mse.aliyuncs.com:8848
image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-b:0.2-demo-SNAPSHOT
imagePullPolicy: Always
name: spring-cloud-b
ports:
containerPort: 8080
protocol: TCP
resources:
requests:
cpu: 250m
memory: 512Mi
# C 应用 base 版本
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: spring-cloud-c
name: spring-cloud-c
spec:
replicas: 2
selector:
matchLabels:
app: spring-cloud-c
template:
metadata:
annotations:
msePilotCreateAppName: spring-cloud-c
labels:
app: spring-cloud-c
spec:
containers:
env:
name: LANG
value: C.UTF-8
name: JAVA_HOME
value: /usr/lib/jvm/java-1.8-openjdk/jre
name: spring.cloud.nacos.discovery.server-addr
value: mse-455e0c20-nacos-ans.mse.aliyuncs.com:8848
image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-c:0.2-demo-SNAPSHOT
imagePullPolicy: Always
name: spring-cloud-c
ports:
containerPort: 8080
protocol: TCP
resources:
requests:
cpu: 250m
memory: 512Mi
# C 应用 gray 版本
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: spring-cloud-c-new
name: spring-cloud-c-new
spec:
replicas: 2
selector:
matchLabels:
app: spring-cloud-c-new
template:
metadata:
annotations:
gray :
msePilotCreateAppName: spring-cloud-c
labels:
app: spring-cloud-c-new
spec:
containers:
env:
name: LANG
value: C.UTF-8
name: JAVA_HOME
value: /usr/lib/jvm/java-1.8-openjdk/jre
name: spring.cloud.nacos.discovery.server-addr
value: mse-455e0c20-nacos-ans.mse.aliyuncs.com:8848
image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-c:0.2-demo-SNAPSHOT
imagePullPolicy: Always
name: spring-cloud-c-new
ports:
containerPort: 8080
protocol: TCP
resources:
requests:
cpu: 250m
memory: 512Mi
完成云原生网关初步配置
curl -H "Host: base.example.com" http://118.31.118.69/a
A[172.21.240.105] -> B[172.21.240.106] -> C[172.21.240.46]
curl -H "Host: base.example.com" -H "x-mse-tag: gray" http://118.31.118.69/a
Agray[172.21.240.44] -> B[172.21.240.146] -> Cgray[172.21.240.147]
总结
Cloud Native
评论