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

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 微服务引擎MSE面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持Nacos/ZooKeeper/Eureka)、云原生网关(原生支持Ingress/Envoy)、微服务治理(原生支持Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。

什么是全链路灰度?

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

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

image.png

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

基本概念

image.png

  • 泳道:一条虚拟的流量路径,比如上图中标签1的流量,就属于一个泳道
  • 基线环境:承载所有流量,比如某个服务,没有标签1节点,那么就会回退到基线环境
  • 流量回退:某个服务,没有标签1节点,那么就会回退到基线环境,这个行为叫流量回退
  • 泳道组:为便于理解,流量涉及应用以及其泳道,称为泳道组。


全链路灰度的应用场景

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

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

2.全链路灰度发布

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

3.高可用/临近路由

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

4.全链路压测

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

涉及技术

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

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

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

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

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

标签路由

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

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

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

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

image.png

节点打标

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

image.png

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

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

image.png

标签传递

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

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

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

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

image.png

消息灰度、数据库灰度

image.png

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

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

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

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

image.png

部署Apache Shenyu网关

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

  1. 按照Apache Shenyu的说明文档,依次创建shenyu 命名空间、shenyu-cm ConfigMap。
  2. 按照Apache Shenyu说明,依次创建shenyu-admin-svc Service和shenyu-admin Deployment。

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

  1. 由于我们需要在安装Spring Cloud插件,所以采用手动部署模式:

3.1. 创建spring-boot项目,名字叫shenyu-bootstrap,添加shenyu-spring-boot-starter-plugin-springcloud等相关依赖。

3.2. 在application.yaml中配置,shenyu.sync.websocket.urls为ws://shenyu-admin-svc:9095/websocket,接收shenyu-admin的配置。

shenyu-bootstrap的源码链接 https://github.com/aliyun/alibabacloud-microservice-demo/tree/apache-shenyu-integration/mse-simple-demo/shenyu-bootstrap

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

image.png

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

image.png

设置规则

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

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

image.png

验证

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

image.png

OpenSergo开源微服务治理标准

随着微服务架构的普及,微服务治理的概念也越来越被更多人认知,微服务治理的标准化、治理数据面的多样性、多语言支持等也越来越迫切。我们观察到了这个趋势,发起了OpenSergo项目,致力于制定微服务治理的标准及参考实现。其中,全链路灰度作为基本能力,目前OpenSergo也在制定相关标准,包括如何给机器打标、给流量打标、如何路由等。https://github.com/opensergo/opensergo-specification/issues/9

总结

MSE全链路灰度能力,提供了全链路隔离流量泳道能力,企业和开发这可以通过全链路灰度能力,提供端到端的稳定基线环境、流量一键动态切流、全链路的可观测能力。此外,MSE微服务治理具备无倾入接入能力,基于Java Agent 技术,实现无需修改一行业务代码就能接入。具备无损上下线能力,使得业务发布更加丝滑。接下来,MSE全链路灰度,将会支持更多基础设施(数据库、消息等),支持更多语言、更多接入模式,为企业和开发者提升开发、运维效率。


如有疑问,可加入群聊

mse钉群 6000人群.png

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
16天前
|
API
阿里云微服务引擎及 API 网关 2024 年 2 月产品动态
阿里云微服务引擎及 API 网关 2024 年 2 月产品动态
|
7天前
|
存储 缓存 负载均衡
【Apache ShenYu源码】如何实现负载均衡模块设计
整个模块为ShenYu提供了什么功能。我们可以看下上文我们提到的工厂对象。/***/核心方法很清晰,我们传入Upsteam列表,通过这个模块的负载均衡算法,负载均衡地返回其中一个对象。这也就是这个模块提供的功能。
|
9天前
|
负载均衡 Kubernetes Cloud Native
云原生最佳实践系列2:基于 MSE 云原生网关同城多活
通过使用阿里云的云原生微服务引擎 MSE,可以实现注册中心的同城容灾多活微服务应用。MSE 提供了云原生网关和注册中心,支持机房级故障的秒级自动转移、非对等部署下的全局流量负载均衡以及流量精细化管控。
561 39
|
9天前
|
Java API Apache
【Apache ShenYu源码】看看贡献者如何实现支持提醒通知设计
在阅读中,还发现了有个html文件忘记加了开源协议,我们提下PR修复下,又收获了一次开源贡献!!PR提交戳这。
【Apache ShenYu源码】看看贡献者如何实现支持提醒通知设计
|
15天前
|
Cloud Native 测试技术 Nacos
云效AppStack+阿里云MSE实现应用服务全链路灰度
在应用开发测试验证通过后、进行生产发布前,为了降低新版本发布带来的风险,期望能够先部署到灰度环境,用小部分业务流量进行全链路灰度验证,验证通过后再全量发布生产。本文主要介绍如何通过阿里云MSE 微服务引擎和云效应用交付平台AppStack 实现灰度发布。
140 0
|
15天前
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 API 网关 2024 年 02 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要。
|
5月前
|
Cloud Native 前端开发 测试技术
MSE微服务引擎中我想实现灰度发布,怎么来实现灰度发布流量控制
MSE微服务引擎中我想实现灰度发布,怎么来实现灰度发布流量控制?
59 1
|
6月前
|
Kubernetes Cloud Native 测试技术
基于MSE实现K8s集群内多服务的灰度发布
MSE 云原生网关是阿里云推出的下一代网关,您可以在 MSE 上通过 Ingress 资源来配置不同的转发规则,从而根据不同的规则设置,来注册集群内不同的服务,以及实现多服务的灰度发布。
309 1
|
6月前
|
Kubernetes Cloud Native Serverless
基于MSE实现微服务的全链路灰度
本场景提供MSE Ingress网关集群和Kubernates集群,部署Demo服务。您将掌握支持Spring Cloud/Dubbo、云原生网关的全链路灰度方案。
424 0
|
7月前
|
弹性计算 Cloud Native 安全
MSE-Higress 云原生网关测评
# MSE-Higress 云原生网关测评 在今天的技术环境中,网关的角色变得越来越关键。MSE-Higress 是一款遵循开源 Ingress/Gateway API 标准的下一代网关产品,具有许多引人注目的特点。在此,我将根据以下三个主要主题对其进行全面评估。 ## 1. MSE-Higress 产品体验测评 ## **操作过程:** ### 1)开通MSE-Higress 根据提供的文档,我们可以免费领取并开通MSE-Higress网关。 ![image-20230811160806663](https://yeqiu2023.oss-cn-hangzhou.aliyuncs
139 0

相关产品

  • 微服务引擎
  • 推荐镜像

    更多