全链路灰度-场景1
什么是全链路灰度
微服务架构下,有些开发需求,微服务调用链路上的多个微服务同时发生了改动,通常每个微服务都会有灰度环境或分组来接收灰度流量。此时希望通过进入上游灰度环境的流量,也能进入下游灰度的环境中,确保1个请求始终在灰度环境中传递。
全链路灰度适用场景
- 用户体验不能中断的业务。
- 微服务业务的存在关联关系的多个微服务的特性变更。
全链路灰度的实现方案
可以基于域名分离的方式实现全链路灰度,通过不同的域名区分灰度环境和稳定环境。用户的请求通过灰度域名访问到灰度版本的服务,通过稳定域名访问到稳定版本的服务。
灰度请求通过灰度域名接入到网关,网关通过域名识别到灰度请求后,将请求优先路由到灰度版本的服务,并通过请求头的方式进行灰度染色。后续微服务之间,服务框架通过请求头识别到灰度请求,会优先将请求路由到灰度版本服务,如果寻址不到灰度版本,则路由到稳定版本服务。
前置条件
部署polaris
如果已经部署好了polaris,可忽略这一步。
polaris支持在kubernetes环境中进行部署,注意必须保证暴露HTTP端口为8090,gRPC端口为8091。具体部署方案请参考:
阶段一:实例打标
Spring Cloud Tencent 接入
打标实例版本号
Spring Cloud Tencent支持通过以下2种方式进行实例的版本号打标:
- 方式一:配置文件
在服务实例的配置文件中添加配置,如在 bootstrap.yml
添加如下所示即可:
spring:
cloud:
tencent:
metadata:
content:
version: 2.0.0
- 方式二:环境变量
在服务实例所在的操作系统中添加环境变量也可进行打标,例如:SCT_METADATA_CONTENT_version=2.0.0
。
打标灰度标签透传
由于Spring Cloud默认不会对所有的请求标签进行透传,因此需要增加Spring Cloud透传标识,可以通过添加环境变量SCT_TRAFFIC_CONTENT_RAW_TRANSHEADERS=gray
的方式,进行灰度标识gray:true
的透传。
Envoy Proxy 接入
应用需要基于K8S进行部署,才可以使用Envoy Proxy的接入模式。
实例的版本标签需要通过POD标签的方式打入,然后在部署过程中,北极星的controller会自动把POD标签同步到北极星。
可以在K8S的部署配置中,在template配置中,添加labels的方式完成版本打标。可参考这里的部署配置:微服务部署配置
spec:
template:
metadata:
labels:
app: user
version: 2.0.0
阶段二:部署应用
Spring Cloud Tencent 接入
支持虚拟机、Docker Composer、K8S等多种部署模式,注意需要保证业务进程与北极星服务的网络连通性。
Envoy Proxy 接入
只支持K8S的部署模式,同时,为了实现POD标签的自动同步,以及Envoy Proxy的自动注入,需要预先部署北极星的Controller组件(polaris-controller)。具体部署方案请参考:
阶段三:网关路由&染色
网关作为流量入口,配置网关路由的目标主要是为了可以将通过灰度域名接入的流量,导入到灰度版本的下游微服务上,同时通过流量打标的方式,将路由到灰度版本的请求,在Header上打入gray:true
的标签,便于后续微服务按照标签进行路由。
配置域名切流量的规则
用户可以使用任意对接了北极星服务发现的网关进行操作(Envoy, Nginx, Kong等),这里给出Envoy的VirtualHost路由配置,便于大家理解,具体配置可以参考LDS配置
virtual_hosts:
- name: local_service
domains:
- "*"
routes:
- match:
prefix: "/"
route:
weighted_clusters:
total_weight: 100
clusters:
- name: user
weight: 80
metadata_match:
filter_metadata:
envoy.lb:
version: 1.0.0
- name: user
weight: 20
request_headers_to_add:
- header:
key: gray
value: "true"
metadata_match:
filter_metadata:
envoy.lb:
version: 2.0.0
阶段四:微服务路由
通过配置微服务路由,目标是使得对于灰度流量的调用,都只在新版本的服务分组中进行。
打开北极星控制台,通过点击侧边栏:动态路由->自定义规则页面,配置自定义路由规则,规则可配置对命名空间下全部服务生效。
- 配置灰度规则,使得header中带有
gray:true
灰度标签的流量都只流向version=2.0.0
的分组:
- 配置兜底规则,使得不带灰度标签的流量都只流向
version=1.0.0
的分组:
阶段五:观察监控并查看流量的灰度过程
通过北极星的可观测性能力,可以准确看到不同分组的流量切换的过程,以及服务调用成功率,等到所有流量都切换到新版本分组以及没有失败请求,代表灰度完成。
阶段六:灰度完成的收尾动作
灰度完成后,需要做以下事情:
- 对老版本分组的实例进行缩容下线
- 删除网关的路由规则
- 在北极星控制台删除自定义路由规则
一键部署体验
北极星提供了一键部署demo,可以通过一键部署demo快速体验蓝绿发布。详细请参考: