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

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 我们希望可以对这些服务的新版本同时进行小流量灰度验证,这就是微服务架构中特有的全链路灰度场景,通过构建从网关到整个后端服务的环境隔离来对多个不同版本的服务进行灰度验证。

作者:卜比

什么是全链路灰度

微服务体系架构中,服务之间的依赖关系错综复杂,有时某个功能发版依赖多个服务同时升级上线。我们希望可以对这些服务的新版本同时进行小流量灰度验证,这就是微服务架构中特有的全链路灰度场景,通过构建从网关到整个后端服务的环境隔离来对多个不同版本的服务进行灰度验证。


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


1.png


上图可以很好展示这种方案的效果,我们用不同的颜色来表示不同版本的灰度流量,可以看出无论是微服务网关还是微服务本身都需要识别流量,根据治理规则做出动态决策。当服务版本发生变化时,这个调用链路的转发也会实时改变。相比于利用机器搭建的灰度环境,这种方案不仅可以节省大量的机器成本和我们希望可以对这些服务的新版本同时进行小流量灰度验证,这就是微服务架构中特有的全链路灰度场景,通过构建从网关到整个后端服务的环境隔离来对多个不同版本的服务进行灰度验证。运维人力,而且可以帮助开发者实时快速的对线上流量进行精细化的全链路控制。


基本概念


2.png


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


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


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


  • 泳道组:为便于理解,流量涉及应用以及其泳道,称为泳道组。


全链路灰度的应用场景


日常/开发/项目/测试环境隔离


构造日常、开发、项目、测试等多套环境的“泳道”,每个项目环境都有唯一的一个项目标签,流量带上这个项目标签后会路由到该项目环境,否则会去主干环境。如果没有这套机制,开发环境要进行物理隔离,这就需要部署整套微服务架构,成本非常高。


全链路灰度发布


线上所有应用部署灰度版本,灰度流量全部进入灰度版本,正常流量进入生产版本。灰度版本只针对灰度流量验证,有效减少风险。云上客户安 x 就有这样的场景,要灰度发布 N 个应用,想灰度流量在这 N 个应用的灰度版本之间路由。

高可用/临近路由


业务高可用部署后,服务调用如果跨机房,会带来额外的调用延迟。开启同机房优先路由后, 让 Consumer 服务调用优先选择相同机房的 Provider,降低 rt。

全链路压测


直接使用线上环境压测,让压测流量的 DB 操作落库到影子表,Redis 落到影子 KEY,MQ 落到影子 TOPIC。如果没有路由能力,需要搭建一套仿真的线上环境用于压测,成本直线上升。用线上环境配合流量控制能力可以实现 0 机器成本,0 维护成本完成全链路压测。


涉及技术


那么全链路灰度具体是如何实现呢?我们需要解决以下问题:


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

2.需要对服务下的所有节点按照标签分组,能够区分版本 (节点打标)

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

4. 除了对 RPC/HTTP 调用需要按照标签灰度,对 DB、消息、分布式任务也需要按照标签灰度(消息灰度、数据库灰度)


标签路由


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


不论节点、流量、还是消息,都不再通过 IP、节点来标记,运维开发同学只需要关注标签就可以。


在不同的上下文中,有不同的标签值,可以带来不同的业务场景。


比如当标签值是可用区的时候,就可以实现临近路由;当标签值是版本的时候,就可以据此实现金丝雀发布、全链路灰度等。


3.png


节点打标


在云原生环境下,尤其是典型的 K8s 部署模式下,我们可以通过 labels 来给一组 pod/workload 打标,这样就能通过标签来标记、查找节点。比如 K8s 的 service 就依赖了 label;阿里云微服务引擎(MSE)也使用 label alicloud.service.tag 来设置节点标签。


4.png


当然,业务上肯定也有一些应用不是 K8s 部署的,所以节点打标也需要支持非 K8s 环境。


在非 K8s 环境中,可以通过环境变量、系统参数、文件等方式标记节点的标签,然后把这些标签注册到注册中心,consumer 在调用的时候,可以根据这些标签来实现路由逻辑。


5.png


标签传递


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


在 OpenTelemetry 之前,可以通过自定义 Header 来实现流量标签透传,比如 MSE 就使用了 x-mse-tag header。


OpenTelemetry 引入了 Baggage 概念,可以通过标准方式来添加 Header。


上述两种技术,都实现了流量标签的传递。


6.png


消息灰度、数据库灰度


7.png


比如在上图中,以 RocketMQ 为例,C 应用生产消息,A 应用消费消息,那么如何做到 C 应用的 gray 节点的消息,只能被 A 应用的 gray 节点消费。


首先,要给消息打标。gray 节点生产的消息,可以通过 userProperty 特性,添加额外 property 来给消息打标。


其次,要按照标签消费消息。gray 节点消费消息的时候,可以通过 SQL92 Filter 特性,只筛选特定标签的消息。


使用 Shenyu 网关,实现全链路灰度


8.png


部署 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 的配置。


4. 访问 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 已经注册到网关了:


9.png


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


10.png


设置规则


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


接下来配置规则,例如有参数 name=xiaoming 的,我们认为是灰度流量,走 gray 标签的泳道:


11.png


验证


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


12.png

OpenSergo 开源微服务治理标准


随着微服务架构的普及,微服务治理的概念也越来越被更多人认知,微服务治理的标准化、治理数据面的多样性、多语言支持等也越来越迫切。


我们观察到了这个趋势,发起了 OpenSergo[3]项目,致力于制定微服务治理的标准及参考实现。


其中,全链路灰度作为基本能力,目前 OpenSergo 也在制定相关标准,包括如何给机器打标、给流量打标、如何路由等。


总结


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


此外,MSE 微服务治理具备无倾入接入能力,基于 Java Agent 技术,实现无需修改一行业务代码就能接入。具备无损上下线能力,使得业务发布更加丝滑。


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


相关链接


[1] Apache Shenyu 的说明文档:

https://shenyu.apache.org/zh/docs/deployment/deployment-k8s/


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

https://github.com/aliyun/alibabacloud-microservice-demo/tree/apache-shenyu-integration/mse-simple-demo/shenyu-bootstrap


[3] OpenSergo:

https://github.com/opensergo/opensergo-specification/issues/9

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
7天前
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 云原生 API 网关 2025 年 2 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要
303 10
阿里云微服务引擎 MSE 及 云原生 API 网关 2025 年 2 月产品动态
|
27天前
|
Cloud Native API 微服务
微服务引擎 MSE 及云原生 API 网关 2025 年 1 月产品动态
微服务引擎 MSE 及云原生 API 网关 2025 年 1 月产品动态。
|
1月前
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 云原生 API 网关 2025 年 1 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要
阿里云微服务引擎 MSE 及 云原生 API 网关 2025 年 1 月产品动态
|
2月前
|
Cloud Native API 微服务
微服务引擎 MSE 及云原生 API 网关 2024 年 12 月产品动态
微服务引擎 MSE 及云原生 API 网关 2024 年 12 月产品动态。
|
2月前
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 云原生 API 网关 2024 年 12 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要
175 12
|
9天前
|
存储 大数据 数据处理
您有一份 Apache Flink 社区年度报告请查收~
您有一份 Apache Flink 社区年度报告请查收~
|
3月前
|
存储 SQL 人工智能
Apache Flink 2.0:Streaming into the Future
本文整理自阿里云智能高级技术专家宋辛童、资深技术专家梅源和高级技术专家李麟在 Flink Forward Asia 2024 主会场的分享。三位专家详细介绍了 Flink 2.0 的四大技术方向:Streaming、Stream-Batch Unification、Streaming Lakehouse 和 AI。主要内容包括 Flink 2.0 的存算分离云原生化、流批一体的 Materialized Table、Flink 与 Paimon 的深度集成,以及 Flink 在 AI 领域的应用。
675 13
Apache Flink 2.0:Streaming into the Future
|
3月前
|
存储 人工智能 大数据
The Past, Present and Future of Apache Flink
本文整理自阿里云开源大数据负责人王峰(莫问)在 Flink Forward Asia 2024 上海站主论坛开场的分享,今年正值 Flink 开源项目诞生的第 10 周年,借此时机,王峰回顾了 Flink 在过去 10 年的发展历程以及 Flink社区当前最新的技术成果,最后展望下一个十年 Flink 路向何方。
428 33
The Past, Present and Future of Apache Flink
|
5月前
|
SQL Java API
Apache Flink 2.0-preview released
Apache Flink 社区正积极筹备 Flink 2.0 的发布,这是自 Flink 1.0 发布以来的首个重大更新。Flink 2.0 将引入多项激动人心的功能和改进,包括存算分离状态管理、物化表、批作业自适应执行等,同时也包含了一些不兼容的变更。目前提供的预览版旨在让用户提前尝试新功能并收集反馈,但不建议在生产环境中使用。
1086 13
Apache Flink 2.0-preview released
|
5月前
|
存储 缓存 算法
分布式锁服务深度解析:以Apache Flink的Checkpointing机制为例
【10月更文挑战第7天】在分布式系统中,多个进程或节点可能需要同时访问和操作共享资源。为了确保数据的一致性和系统的稳定性,我们需要一种机制来协调这些进程或节点的访问,避免并发冲突和竞态条件。分布式锁服务正是为此而生的一种解决方案。它通过在网络环境中实现锁机制,确保同一时间只有一个进程或节点能够访问和操作共享资源。
189 3

相关产品

  • 微服务引擎
  • 推荐镜像

    更多