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

这篇具有很好参考价值的文章主要介绍了MSE 支持 Apache Shenyu 网关实现全链路灰度。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是全链路灰度

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

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

shenyu网关 修改header,apache,微服务,java,阿里云,云计算

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

基本概念

shenyu网关 修改header,apache,微服务,java,阿里云,云计算

  • 泳道:一条虚拟的流量路径,比如上图中标签 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、节点来标记,运维开发同学只需要关注标签就可以。

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

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

shenyu网关 修改header,apache,微服务,java,阿里云,云计算

节点打标

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

shenyu网关 修改header,apache,微服务,java,阿里云,云计算

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

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

shenyu网关 修改header,apache,微服务,java,阿里云,云计算

标签传递

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

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

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

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

shenyu网关 修改header,apache,微服务,java,阿里云,云计算

消息灰度、数据库灰度

shenyu网关 修改header,apache,微服务,java,阿里云,云计算

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

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

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

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

shenyu网关 修改header,apache,微服务,java,阿里云,云计算

部署 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 命令安装部署:

 

按照 demo 部署好后,可以在 shenyu-admin 上,看到 sc-A 已经注册到网关了:

shenyu网关 修改header,apache,微服务,java,阿里云,云计算

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

shenyu网关 修改header,apache,微服务,java,阿里云,云计算

设置规则

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

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

shenyu网关 修改header,apache,微服务,java,阿里云,云计算

验证

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

shenyu网关 修改header,apache,微服务,java,阿里云,云计算

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

作者:卜比

原文链接

本文为阿里云原创内容,未经允许不得转载。文章来源地址https://www.toymoban.com/news/detail-645610.html

到了这里,关于MSE 支持 Apache Shenyu 网关实现全链路灰度的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Apache ShenYu 学习笔记一

    这是一个异步的,高性能的,跨语言的,响应式的 API 网关。 官网文档:https://shenyu.apache.org/zh/docs/index 仓库地址:https://github.com/apache/shenyu 本次体验基本参照官方快速开始文档步骤 开发工具:IDEA JDK:1.8 IDEA打开上一步下载好的项目 找到 shenyu-admin 子项目,运行 ShenyuAdminBoo

    2024年02月01日
    浏览(61)
  • ShenYu网关注册中心之HTTP注册原理

    当客户端启动后,根据相关配置,读取属性信息,然后写入队列。以官方提供的 shenyu-examples-http 为例,开始源码分析。 该例子是一个springboot项目,所以注册的入口往往在自动装配类中。不妨可以先看下项目的pom文件中引入了什么依赖: 这里面看到就 shenyu-spring-boot-starter-c

    2024年01月21日
    浏览(39)
  • 基于云原生网关的全链路灰度实践

    作者: 倪海峰(海迩) 随着企业规模的不断扩大,传统单体应用已很难进一步支持业务的发展,业务的迭代速度已经难以满足业务的增长,此时企业会对应用系统做微服务化的改造,降低业务的耦合度,提升开发迭代的效率,让开发更加敏捷。 系统架构微服务化的,原本的

    2024年02月15日
    浏览(44)
  • 【从0到1设计一个网关】灰度发布的实现

    代码讲解链接 项目开源代码-点个star领取完整4w字开发文档 先简单介绍一下什么是灰度发布 灰度发布(Gray Release)是一种软件部署和发布策略,用于逐步将新版本的应用或服务引入生产环境,以降低潜在的风险并确保系统的稳定性。在灰度发布中,新版本的应用或服务不会一

    2024年02月05日
    浏览(45)
  • 云原生最佳实践系列2:基于 MSE 云原生网关同城多活

    分布在同城多个机房内的应用同时对外提供服务。同城机房物理距离较小,一般小于 50 公里。同城多活架构的难点有三个: 当某机房出现故障,能不能做到机房级的快速切换? 如何实现非对等部署下的全局的流量负载均衡? 对流量的精细化管控? 常见的同城多活实现方式

    2024年04月25日
    浏览(46)
  • 注册配置、微服务治理、云原生网关三箭齐发,阿里云 MSE 持续升级

    注册中心是日常使用频率很高的微服务组件,通过较低的资源溢价帮助客户缩短微服务的构建周期、提升可用性; 微服务治理实现了 0 门槛就能接入全链路灰度、无损上下线、限流降级、环境隔离、数据库治理等能力,轻松完成开源到稳定生产的跨越; 云原生网关则将网络

    2024年02月02日
    浏览(36)
  • SpringCloud全链路灰度发布

    日升时奋斗,日落时自省  目录 1、实现框架 2、负载均衡模块 3、封装负载均衡器 4、网关模块 5、服务模块 5.1、注册为灰度服务实例 5.2、设置负载均衡器 5.3、传递灰度标签 Spring Cloud全链路灰色发布实现构架: 灰度发布的具体实现 : 前端程序在灰度测试用户Header头中打上

    2024年01月21日
    浏览(42)
  • 微服务全链路灰度方案介绍

    目录 一、单体架构下的服务发布 1.1 蓝绿发布 二、微服务架构下的服务发布 三、微服务场景下服务发布的问题 四、全链路灰度解决方案 4.1 物理环境隔离 4.2 逻辑环境隔离 4.3 全链路灰度方案实现技术 4.3.1 标签路由 4.3.2 节点打标 4.3.3 流量染色 4.3.4 分布式链路追踪 4.3.4 逻辑

    2024年02月03日
    浏览(36)
  • 构建基于 Ingress 的全链路灰度能力

    随着云原生技术不断普及,越来越多的业务应用开始向云原生架构转变,借助容器管理平台 Kubernetes 的不可变基础设施、弹性扩缩容和高扩展性,助力业务迅速完成数字化转型。其中,集群入口流量管理方式在云原生技术演进过程中逐步通用化、标准化,用户通过 Kubernetes 定

    2024年01月22日
    浏览(35)
  • 第十章 : Spring cloud 网关中心 Gateway (灰度发布)

    第十章 : Spring cloud 网关中心 Gateway (灰度发布) 前言 本章知识点:介绍了常用版本发布的方式:蓝绿发布,滚动发布以及金丝雀发布,并对比了各个发布方式的优劣势,重点阐述了如何通过Spring cloud 网关中心 Gateway 基于nacos 注册中心与配置中心的前提条件下,实现网关灰

    2024年01月17日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包