作者:卜比

什么是全链路灰度

微服务体系架构中,服务之间的依靠联系扑朔迷离,有时某个功能发版依靠多个服务一起升级上线。咱们希望能够对这些服务的新版别一起进行小流量灰度验证,这便是微服务架构中特有的全链路灰度场景,经过构建从网关到整个后端服务的环境阻隔来对多个不同版别的服务进行灰度验证。

在发布过程中,咱们只需布置服务的灰度版别,流量在调用链路上流转时,由流经的网关、各个中间件以及各个微服务来辨认灰度流量,并动态转发至对应服务的灰度版别。如下图:

MSE 支持 Apache Shenyu 网关实现全链路灰度

上图能够很好展示这种计划的效果,咱们用不同的色彩来表示不同版别的灰度流量,能够看出无论是微服务网关仍是微服务本身都需求辨认流量,依据管理规矩做出动态决策。当服务版别发生变化时,这个调用链路的转发也会实时改变。相比于运用机器建立的灰度环境,这种计划不只能够节省大量的机器本钱和运维人力,并且能够帮助开发者实时快速的对线上流量进行精细化的全链路操控。

基本概念

MSE 支持 Apache Shenyu 网关实现全链路灰度

  • 泳道:一条虚拟的流量途径,比方上图中标签 1 的流量,就属于一个泳道

  • 基线环境:承载一切流量,比方某个服务,没有标签 1 节点,那么就会回退到基线环境

  • 流量回退:某个服务,没有标签 1 节点,那么就会回退到基线环境,这个行为叫流量回退

  • 泳道组:为便于了解,流量触及运用以及其泳道,称为泳道组。

全链路灰度的运用场景

日常/开发/项目/测验环境阻隔

结构日常、开发、项目、测验等多套环境的“泳道”,每个项目环境都有唯一的一个项目标签,流量带上这个项目标签后会路由到该项目环境,否则会去骨干环境。假如没有这套机制,开发环境要进行物理阻隔,这就需求布置整套微服务架构,本钱非常高。

全链路灰度发布

线上一切运用布置灰度版别,灰度流量悉数进入灰度版别,正常流量进入出产版别。灰度版别只针对灰度流量验证,有效减少危险。云上客户安 x 就有这样的场景,要灰度发布 N 个运用,想灰度流量在这 N 个运用的灰度版别之间路由。

高可用/接近路由

事务高可用布置后,服务调用假如跨机房,会带来额定的调用延迟。敞开同机房优先路由后, 让 Consumer 服务调用优先选择相同机房的 Provider,降低 rt。

全链路压测

直接运用线上环境压测,让压测流量的 DB 操作落库到影子表,Redis 落到影子 KEY,MQ 落到影子 TOPIC。假如没有路由才能,需求建立一套仿真的线上环境用于压测,本钱直线上升。用线上环境配合流量操控才能能够完成 0 机器本钱,0 保护本钱完成全链路压测。

触及技能

那么全链路灰度具体是怎么完成呢?咱们需求解决以下问题:

1.链路上各个组件和服务能够依据恳求流量特征进行动态路由 (标签路由)

2.需求对服务下的一切节点依照标签分组,能够区分版别 (节点打标)

3.需求对流量进行灰度标识、版别标识,并向下传递 (标签传递)

  1. 除了对 RPC/HTTP 调用需求依照标签灰度,对 DB、音讯、分布式使命也需求依照标签灰度(音讯灰度、数据库灰度)

标签路由

在云原生环境下,因为节点的生命周期缩短,IP 变化,导致原来依照 IP 来设置路由规矩的方法不再适用。所以,标签是云原生环境下的一等公民。

不管节点、流量、仍是音讯,都不再经过 IP、节点来符号,运维开发同学只需求重视标签就能够。

在不同的上下文中,有不同的标签值,能够带来不同的事务场景。

比方当标签值是可用区的时分,就能够完成接近路由;当标签值是版别的时分,就能够据此完成金丝雀发布、全链路灰度等。

MSE 支持 Apache Shenyu 网关实现全链路灰度

节点打标

在云原生环境下,尤其是典型的 K8s 布置形式下,咱们能够经过 labels 来给一组 pod/workload 打标,这样就能经过标签来符号、查找节点。比方 K8s 的 service 就依靠了 label;阿里云微服务引擎(MSE)也运用 label alicloud.service.tag 来设置节点标签。

MSE 支持 Apache Shenyu 网关实现全链路灰度

当然,事务上必定也有一些运用不是 K8s 布置的,所以节点打标也需求支撑非 K8s 环境。

在非 K8s 环境中,能够经过环境变量、体系参数、文件等方法符号节点的标签,然后把这些标签注册到注册中心,consumer 在调用的时分,能够依据这些标签来完成路由逻辑。

MSE 支持 Apache Shenyu 网关实现全链路灰度

标签传递

在整个的微服务调用中,咱们希望流量上的标能够一直传递下去,其一是回溯流量来源,其二是能够在恣意节点上依据流量做灰度。

在 OpenTelemetry 之前,能够经过自定义 Header 来完成流量标签透传,比方 MSE 就运用了 x-mse-tag header。

OpenTelemetry 引入了 Baggage 概念,能够经过规范方法来增加 Header。

上述两种技能,都完成了流量标签的传递。

MSE 支持 Apache Shenyu 网关实现全链路灰度

音讯灰度、数据库灰度

MSE 支持 Apache Shenyu 网关实现全链路灰度

比方在上图中,以 RocketMQ 为例,C 运用出产音讯,A 运用消费音讯,那么怎么做到 C 运用的 gray 节点的音讯,只能被 A 运用的 gray 节点消费。

首先,要给音讯打标。gray 节点出产的音讯,能够经过 userProperty 特性,增加额定 property来给音讯打标。

其次,要依照标签消费音讯。gray 节点消费音讯的时分,能够经过 SQL92 Filter 特性,只挑选特定标签的音讯。

运用 Shenyu 网关,完成全链路灰度

MSE 支持 Apache Shenyu 网关实现全链路灰度

布置 Apache Shenyu 网关

Apache Shenyu 网关分为 shenyu-admin(用于规矩管控)和 shenyu-bootstrap(用于处理流量)。

  1. 依照Apache Shenyu 的阐明文档 [ 1] ,顺次创立 shenyu 命名空间、shenyu-cm ConfigMap。

  2. 依照 Apache Shenyu 阐明文档,顺次创立 shenyu-admin-svc Service 和 shenyu-admin Deployment。

  3. 因为咱们需求再安装 Spring Cloud 插件,所以选用手动布置形式:

  • 创立 spring-boot 项目,名字叫shenyu-bootstrap [ 2] ,增加 shenyu-spring-boot-starter-plugin-springcloud 等相关依靠。

  • 在 application.yaml 中装备,shenyu.sync.websocket.urls 为 ws://shenyu-admin-svc:9095/websocket,接纳 shenyu-admin 的装备。

  1. 访问 shenyu-admin,翻开 Spring Cloud 插件。

布置微服务 demo

mse-simple-demo 分为 A、B、C三个运用,顺次调用各自目录下的 build.sh 构建镜像。

然后创立 values.example.yaml,在其间装备好镜像地址、注册中心地址后,履行 helm 命令安装布置:

helm3 upgrade mse-simple-demo1 helm/mse-simple-demo \
   --namespace shenyu --create-namespace \
   --install \
   --values helm/mse-simple-demo/values.example.yaml

依照 demo 布置好后,能够在 shenyu-admin 上,看到 sc-A 现已注册到网关了:

MSE 支持 Apache Shenyu 网关实现全链路灰度

此时默许没有任何流量规矩,A->B->C 调用链路默许都走基线环境:

MSE 支持 Apache Shenyu 网关实现全链路灰度

设置规矩

首先,创立 shenyu-demo 泳道组,选择 shenyu-bootstrap 作为流量入口,A、B、C 作为泳道组运用。

接下来装备规矩,例如有参数 name=xiaoming 的,咱们认为是灰度流量,走 gray 标签的泳道:

MSE 支持 Apache Shenyu 网关实现全链路灰度

验证

然后咱们访问网关,带上 name=xiaoming,发现 A 运用和 B 运用都走到了 gray 节点,C 运用因为没有 gray 节点,走到了基线节点:

MSE 支持 Apache Shenyu 网关实现全链路灰度

OpenSergo 开源微服务管理规范

跟着微服务架构的普及,微服务管理的概念也越来越被更多人认知,微服务管理的规范化、管理数据面的多样性、多言语支撑等也越来越迫切。

咱们观察到了这个趋势,发起了OpenSergo [ 3] 项目,致力于拟定微服务管理的规范及参阅完成。

其间,全链路灰度作为基本才能,目前 OpenSergo 也在拟定相关规范,包括怎么给机器打标、给流量打标、怎么路由等。

总结

MSE 全链路灰度才能,提供了全链路阻隔流量泳道才能,企业和开发这能够经过全链路灰度才能,提供端到端的安稳基线环境、流量一键动态切流、全链路的可观测才能。

此外,MSE 微服务管理具有无倾入接入才能,基于 Java Agent 技能,完成无需修改一行事务代码就能接入。具有无损上下线才能,使得事务发布愈加丝滑。

接下来,MSE 全链路灰度,将会支撑更多基础设施(数据库、音讯等),支撑更多言语、更多接入形式,为企业和开发者提升开发、运维功率。

相关链接

[ 1]Apache Shenyu 的阐明文档:

shenyu.apache.org/zh/docs/dep…

[2] shenyu-bootstrap的源码链接:

github.com/aliyun/alib…

[3] OpenSergo:

github.com/opensergo/o…