微服务全链路灰度方案介绍

目录

一、单体架构下的服务发布

1.1 蓝绿发布

二、微服务架构下的服务发布

三、微服务场景下服务发布的问题

四、全链路灰度解决方案

4.1 物理环境隔离

4.2 逻辑环境隔离

4.3 全链路灰度方案实现技术

4.3.1 标签路由

4.3.2 节点打标

4.3.3 流量染色

4.3.4 分布式链路追踪

4.3.4 逻辑环境隔离

4.4 MSE微服务治理全链路灰度

4.4.1 MSE 服务治理特性

4.4.1.1 可通过定制规则引⼊精细化流量

4.4.1.2 全链路隔离流量泳道

4.4.1.3 端到端的稳定基线环境

4.4.1.4 流量⼀键动态切流

4.4.1.5 低成本接⼊,基于 Java Agent 技术实现⽆需修改⼀⾏业务代码

4.4.1.6 具备⽆损上下线能⼒,使得发布更加丝滑

4.4.2 RPC流量的全链路灰度⽅案


一、单体架构下的服务发布

⾸先,我们先看⼀下在单体架构中,如何对应⽤中某个服务模块进⾏新版本发布。如下图,应⽤中的 Cart 服务模块有新版本迭代:

由于 Cart 服务是应⽤的⼀部分,所以新版本上线时需要对整个应⽤进⾏编译、打包以及部署。服务级别发布问题变成了应⽤级别的发布问题,我们需要对应⽤的新版本⽽不是服务来实施有效的发布策略。

1.1 蓝绿发布

⽬前,业界已经有⾮常成熟的服务发布⽅案,例如蓝绿发布和灰度发布。蓝绿发布需要对服务的新版本进⾏冗余部署,⼀般新版本的机器规格和数量与旧版本保持⼀致,相当于该服务有两套完全相同的部署环境,只不过此时只有旧版本在对外提供服务,新版本作为热备。当服务进⾏版本升级时,我们只需将流量全部切换到新版本即可,旧版本作为热备。我们的例⼦使⽤蓝绿发布的示意图如下,流量切换基于四层代理的流量⽹关即可完成。

在蓝绿发布中,由于存在流量整体切换,所以需要按照原服务占⽤的机器规模为新版本克隆⼀套环境,相当于要求原来 1 倍的机器资源。灰度发布的核⼼思想是根据请求内容或者请求流量的⽐例将线上流量的⼀⼩部分转发⾄新版本,待灰度验证通过后,逐步调⼤新版本的请求流量,是⼀种循序渐进的发布⽅式。我们的例⼦使⽤灰度发布的示意图如下,基于内容或⽐例的流量控制需要借助于⼀个七层代理的微服务⽹关来完成。

其中,Traffic Routing 是基于内容的灰度⽅式,⽐如请求中含有头部 stag=gray 的流量路由到应⽤v2 版本;Traffic Shifting 是基于⽐例的灰度⽅式,以⽆差别的⽅式对线上流量按⽐重进⾏分流。相⽐蓝绿发布,灰度发布在机器资源成本以及流量控制能⼒上更胜⼀筹,但缺点就是发布周期过⻓,对运维基础设施要求较⾼。

二、微服务架构下的服务发布

在分布式微服务架构中,应⽤中被拆分出来的⼦服务都是独⽴部署、运⾏和迭代的。单个服务新版本上线时,我们再也不需要对应⽤整体进⾏发版,只需关注每个微服务⾃身的发布流程即可,如下:

为了验证服务 Cart 的新版本,流量在整个调⽤链路上能够通过某种⽅式有选择的路由到 Cart的灰度版本,这属于微服务治理领域中流量治理问题。常⻅的治理策略包括基于 Provider 和基于 Consumer 的⽅式。

  • 基于 Provider 的治理策略。配置 Cart 的流量流⼊规则,User 路由到 Cart 时使⽤Cart 的流量流⼊规则。
  • 基于 Consumer 的治理策略。配置 User 的流量流出规则, User 路由到 Cart 时使⽤User 的流量流出规则。

此外,使⽤这些治理策略时可以结合上⾯介绍的蓝绿发布和灰度发布⽅案来实施真正的服务级别的版本发布。

三、微服务场景下服务发布的问题

继续考虑上⾯微服务体系中对服务 Cart 进⾏发布的场景,如果此时服务 Order 也需要发布新版本,由于本次新功能涉及到服务 Cart 和 Order 的共同变动,所以要求在灰度验证时能够使得灰度流量同时经过服务 Cart 和 Order 的灰度版本。如下图:

按照上⼀⼩节提出的两种治理策略,我们需要额外配置服务 Order 的治理规则,确保来⾃灰度环境的服务 Cart 的流量转发⾄服务 Order 的灰度版本。这样的做法看似符合正常的操作逻辑,但在真实业务场景中,业务的微服务规模和数量远超我们的例⼦,其中⼀条请求链路可能经过数⼗个微服务,新功能发布时也可能会涉及到多个微服务同时变更,并且业务的服务之间依赖错综复杂,频繁的服务发布、以及服务多版本并⾏开发导致流量治理规则⽇益膨胀,给整个系统的维护性和稳定性带来了不利因素。

四、全链路灰度解决方案

对于以上的问题,开发者结合实际业务场景和⽣产实践经验,提出了⼀种端到端的灰度发布⽅案,即全链路灰度。全链路灰度治理策略主要专注于整个调⽤链,它不关⼼链路上经过具体哪些微服务,流量控制视⻆从服务转移⾄请求链路上,仅需要少量的治理规则即可构建出从⽹关到整个后端服务的多个流量隔离环境,有效保证了多个亲密关系的服务顺利安全发布以及服务多版本并⾏开发,进⼀步促进业务的快速发展。

如何在实际业务场景中去快速落地全链路灰度呢?⽬前,主要有两种解决思路,基于物理环境隔离和基于逻辑环境隔离。

4.1 物理环境隔离

物理环境隔离,顾名思义,通过增加机器的⽅式来搭建真正意义上的流量隔离。

这种⽅案需要为要灰度的服务搭建⼀套⽹络隔离、资源独⽴的环境,在其中部署服务的灰度版本。由于与正式环境隔离,正式环境中的其他服务⽆法访问到需要灰度的服务,所以需要在灰度环境中冗余部署这些线上服务,以便整个调⽤链路正常进⾏流量转发。此外,注册中⼼等⼀些其他依赖的中间件组件也 需要冗余部署在灰度环境中,保证微服务之间的可⻅性问题,确保获取的节点 IP 地址只属于当前的⽹络环境。

这个⽅案⼀般⽤于企业的测试、预发开发环境的搭建,对于线上灰度发布引流的场景来说其灵活性不够。况且,微服务多版本的存在在微服务架构中是家常便饭,需要为这些业务场景采⽤堆机器的⽅式来 维护多套灰度环境。如果您的应⽤数⽬过多的情况下,会造成运维、机器成本过⼤,成本和代价远超收益;如果应⽤数⽬很⼩,就两三个应⽤,这个⽅式还是很⽅便的,可Microservice 以接受的。

4.2 逻辑环境隔离

另⼀种⽅案是构建逻辑上的环境隔离,我们只需部署服务的灰度版本,流量在调⽤链路上流转时,由流经的⽹关、各个中间件以及各个微服务来识别灰度流量,并动态转发⾄对应服务的灰度版本。如下图:

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


那么全链路灰度具体是如何实现呢?通过上⾯的讨论,我们需要解决以下问题:


1.链路上各个组件和服务能够根据请求流量特征进⾏动态路由。
2.需要对服务下的所有节点进⾏分组,能够区分版本。
3.需要对流量进⾏灰度标识、版本标识。
4.需要识别出不同版本的灰度流量。


接下来,会介绍解决上述问题需要⽤到的技术

4.3 全链路灰度方案实现技术

4.3.1 标签路由

标签路由通过对服务下所有节点按照标签名和标签值不同进⾏分组,使得订阅该服务节点信息的服务消费端可以按需访问该服务的某个分组,即所有节点的⼀个⼦集。服务消费端可以使⽤服务提供者节点上的任何标签信息,根据所选标签的实际含义,消费端可以将标签路由应⽤到更多的业务场景中。

4.3.2 节点打标

那么如何给服务节点添加不同的标签呢?在如今⽕热的云原⽣技术推动下,⼤多数业务都在积极进⾏容器化改造之旅。这⾥,我就以容器化的应⽤为例,介绍在使⽤Kubernetes Service 作为服务发现和使⽤⽐较流⾏的Nacos 注册中⼼这两种场景下如何对服务 Workload 进⾏节点打标。


在使⽤Kubernetes Service 作为服务发现的业务系统中,服务提供者通过向 ApiServer 提交Service 资源完成服务暴露,服务消费端监听与该 Service 资源下关联的 Endpoint 资源,从Endpoint 资源中获取关联的业务 Pod 资源,读取上⾯的 Labels 数据并作为该节点的元数据信息。所以,我们只要在业务应⽤描述资源 Deployment 中的 Pod 模板中为节点添加标签即可。

在使⽤Nacos 作为服务发现的业务系统中,⼀般是需要业务根据其使⽤的微服务框架来决定打标⽅式。 如果 Java 应⽤使⽤的 Spring Cloud 微服务开发框架,我们可以为业务容器添加对应的环境变量来完成标签的添加操作。⽐如我们希望为节点添加版本灰度标,那么为业务容器添加 `spring.cloud.nacos.discovery.metadata.version=gray`,这样框架向 Nacos 注册该节点时会为其添加⼀个标签 `verison=gray`。

4.3.3 流量染色

请求链路上各个组件如何识别出不同的灰度流量?答案就是流量染⾊,为请求流量添加不同灰度标识来⽅便区分。我们可以在请求的源头上对流量进⾏染⾊,前端在发起请求时根据⽤户信息或者平台信息的不同对流量进⾏打标。如果前端⽆法做到,我们也可以在微服务⽹关上对匹配特定路由规则的请求动态 添加流量标识。此外,流量在链路中流经灰度节点时,如果请求信息中不含有灰度标识,需要⾃动为其染⾊,接下来流量就可以在后续的流转过程中优先访问服务的灰度版本。

4.3.4 分布式链路追踪

还有⼀个很重要的问题是如何保证灰度标识能够在链路中⼀直传递下去呢?如果在请求源头染⾊,那么请求经过⽹关时,⽹关作为代理会将请求原封不动的转发给⼊⼝服务,除⾮开发者在⽹关的路由策略中实施请求内容修改策略。接着,请求流量会从⼊⼝服务开始调⽤下⼀个微服务,会根据业务代码逻辑形成新的调⽤请求,那么我们如何将灰度标识添加到这个新的调⽤请求,从⽽可以在链路中传递下去呢?

从单体架构演进到分布式微服务架构,服务之间调⽤从同⼀个线程中⽅法调⽤变为从本地进程的服务调⽤远端进程中服务,并且远端服务可能以多副本形式部署,以⾄于⼀条请求流经的节点是不可预知的、不确定的,⽽且其中每⼀跳的调⽤都有可能因为⽹络故障或服务故障⽽出错。分布式链路追踪技术对⼤型分布式系统中请求调⽤链路进⾏详细记录,核⼼思想就是通过⼀个全局唯⼀的 traceid 和每⼀条的 spanid 来记录请求链路所经过的节点以及请求耗时,其中traceid 是需要整个链路传递的。

借助于分布式链路追踪思想,我们也可以传递⼀些⾃定义信息,⽐如灰度标识。业界常⻅的分布式链路追踪产品都⽀持链路传递⽤户⾃定义的数据,其数据处理流程如下图所示:

4.3.4 逻辑环境隔离

⾸先,需要⽀持动态路由功能,对于 Spring Cloud、Dubbo 开发框架,可以对出⼝流量实现⾃定义 Filter,在该 Filter 中完成流量识别以及标签路由。同时需要借助分布式链路追踪技术完成流量识别以及标签路由。同时需要借助分布式链路追踪技术完成流量标识链路传递以及流量⾃动染⾊。此外,需要引⼊⼀个中⼼化的流量治理平台,⽅便各个业务线的开发者定义⾃⼰的全链路灰度规则。如下图所示:

实现全链路灰度的能⼒,⽆论是成本还是技术复杂度都是⽐较⾼的,以及后期的维护、扩展都是⾮常⼤的成本。

如果我们不想自己维护,且考虑后期成本问题,那么,我们可以选择使用阿里的MSE微服务治理全链路灰度方案。下面我们来看下MSE产品提供的方案。

4.4 MSE微服务治理全链路灰度

阿⾥云 MSE 服务治理产品,该产品就是⼀款基于 Java Agent 实现的⽆侵⼊式企业⽣产级服务治理产品,您不需要修改任何⼀⾏业务代码,即可拥有不限于全链路灰度的治理能⼒,并且⽀持近 5 年内所有的 Spring Boot、Spring Cloud 和 Dubbo。

4.4.1 MSE 服务治理特性

全链路灰度作为 MSE 服务治理专业版中的拳头功能,具备以下六⼤特点:

4.4.1.1 可通过定制规则引⼊精细化流量

除了简单地按照⽐例进⾏流量引⼊外,我们还⽀持 Spring Cloud 与 Dubbo 流量按规则引⼊,Spring Cloud 流量可根据请求的 cookie、header、param 参数或随机百分⽐引⼊流量,Dubbo 流量可按照服务、⽅法、参数来引⼊。

4.4.1.2 全链路隔离流量泳道

1)通过设置流量规则对所需流量进⾏'染⾊','染⾊'流量会路由到灰度机器。
2)灰度流量携带灰度标往下游传递,形成灰度专属环境流量泳道,⽆灰度环境应⽤会默认选择未打标的基线环境。

4.4.1.3 端到端的稳定基线环境

未打标的应⽤属于基线稳定版本的应⽤,即稳定的线上环境。当我们将发布对应的灰度版本代码,然后可以配置规则定向引⼊特定的线上流量,控制灰度代码的⻛险。

4.4.1.4 流量⼀键动态切流

流量规则定制后,可根据需求进⾏⼀键停启,增删改查,实时⽣效。灰度引流更便捷。

4.4.1.5 低成本接⼊,基于 Java Agent 技术实现⽆需修改⼀⾏业务代码

MSE 微服务治理能⼒基于 Java Agent 字节码增强的技术实现,⽆缝⽀持市⾯上近 5 年的所有Spring Cloud 和 Dubbo 的版本,⽤户不⽤改⼀⾏代码就可以使⽤,不需要改变业务的现有架构,随时可上可下,没有绑定。只需开启 MSE 微服务治理专业版,在线配置,实时⽣效。

4.4.1.6 具备⽆损上下线能⼒,使得发布更加丝滑

应⽤开启MSE服务治理后就具备⽆损上下线能⼒,⼤流量下的发布、回滚、扩容、缩容等场景,均能保证流量⽆损。

4.4.2 RPC流量的全链路灰度⽅案

基于消息队列 RocketMQ 的全链路灰度⽅案

详细可以了解 MSE 服务治理的帮助⽂档 :

MSE基于消息队列RocketMQ版实现全链路灰度_微服务引擎(MSE)-阿里云帮助中心 (aliyun.com)

MSE 服务治理以⽆侵⼊的⽅式提供了全链路灰度、离群实例摘除、⾦丝雀发布、微服务治理流量可观测等核⼼能⼒,以更经济的⽅式、更⾼效的路径帮助我们的系统在云上快速构建起完整微服务治理体系。中小企业可选择该中方式实现全链路灰度方案。

友情连接:如果你对发布稳定性的相关方案内容也感兴趣,可查看本人博客文章线上发布稳定性方案介绍-CSDN博客

好了,本次分享就到这里,如果帮助到大家,欢迎大家点赞+关注+收藏,有疑问也欢迎大家评论留言!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/585533.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java美容管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web美容管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&…

子网掩码与IP段计算

一.什么叫子网掩码: 子网掩码(subnet mask)又叫网络掩码、地址掩码、子网络遮罩,它用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。 子网掩…

【源码】-MyBatis-如何系统地看源码

写在前面 前段时间做过一个项目,期间用到了动态数据源dynamic-datasource,经历了dbcp2的数据库连接池没有生效到排查定位、MyBatis多种数据库产品兼容、手写MyBatis拦截器等事情。 花费了好久,一直在打磨这篇文章(不知道花费这么长…

光电耦合器:什么是隔离放大器

隔离放大器是现代电子系统中的关键组件,在维持信号完整性和确保敏感设备的安全方面发挥着关键作用。隔离放大器采用的关键技术之一是光耦合器,这是一种设计用于传输信号同时电隔离输入和输出电路的器件。在本文中,我们深入研究隔离放大器领域…

基于Java网上点餐系统设计与实现

博主介绍: ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精彩专栏 推荐订阅 👇🏻 不然下次找不到 Java项目精品实…

提供电商API-100+接口,等你来试用(免费测试)

什么是 API 调用? 应用程序编程接口 (API)是一个程序与另一个程序交互的一种方式。API 调用是它们交互的媒介。API 调用(或 API 请求)是发送到服务器的消息,要求 API 提供服务或信息。 如果 Jan 招待很多客人共进晚餐&#xff0c…

Linux磁盘阵列

一.RAID磁盘阵列介绍 RAID(Redundatnt Array of lndependent Disks),全称为:独立冗余磁盘阵列 解释: RAID是一种把多块独立的硬盘(物理硬盘)按不同的方式组合起来形成一个硬盘组(逻…

netstat命令使用

在线安装 yum install -y net-tools 离线安装 下载本文关联的资源 解压得到离线安装包 拷贝到服务器 执行离线安装命令,需要在rpm文件所在路径执行 # 离线安装 rpm -Uvh --force --nodeps *.rpm 使用 netstat -nltp

【华为机试】2023年真题B卷(python)-解密犯罪时间

一、题目 题目描述: 警察在侦破一个案件时,得到了线人给出的可能犯罪时间,形如 “HH:MM” 表示的时刻。 根据警察和线人的约定,为了隐蔽,该时间是修改过的,解密规则为: 利用当前出现过的数字&am…

Python武器库开发-武器库篇之上传本地仓库到Git(三十八)

武器库篇之上传本地仓库到Git(三十八) 当我们在Git中创建远程仓库和进行了SSH key免密登陆之后,我们点击 Your respositories 可以查看我们所创建的远程仓库,如图所示: 如果我们需要将本地的仓库上传到Git,首先我们需要建立一个本…

大数据学习(30)-Spark Shuffle

&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博主哦&#x1f91…

高斯泼溅的全面概述

一、说明 高斯泼溅是一种用于表示 3D 场景和渲染新颖视图的方法,在“实时辐射场渲染的 3D 高斯泼溅”中引入。它可以被认为是 NeRF 类模型的替代品,就像当年的 NeRF 一样,高斯分布导致了许多新的研究工作,这些工作选择将其用作各种…

2020年认证杯SPSSPRO杯数学建模B题(第一阶段)分布式无线广播全过程文档及程序

2020年认证杯SPSSPRO杯数学建模 B题 分布式无线广播 原题再现: 以广播的方式来进行无线网通信,必须解决发送互相冲突的问题。无线网的许多基础通信协议都使用了令牌的方法来解决这个问题,在同一个时间段内,只有唯一一个拿到令牌…

世界经济论坛制定了五项指导原则,实现跨OT环境的网络安全。

内容概述: 世界经济论坛在其题为“解锁工业环境中的网络弹性:五项原则”的报告中列出:原则一:执行全面风险管理OT 环境、原则二:确保OT工程师和安装操作员对OT网络安全负责、原则三:与高层组织领导、战略规…

冒泡排序--------(C每日一题)

冒泡排序&#xff1a; 每次将相邻的两个数比较,将小的调到前头--升序 冒泡排序一个结论&#xff1a; n个数要进行n-1轮比较&#xff0c;第j轮要进行n-j次两两比较 循环体代码&#xff1a; int main() {int i, j,n,a[10],t;//n是几个数比较for(j1;j<n-1;j)//控制轮次for…

一篇文章深入认识微服务SpringCloud和Dubbo的区别

1、SpringCloud是什么 SpringCloud, 基于SpringBoot提供了一套微服务解决方案&#xff0c;包括服务注册与发现&#xff0c;配置中心&#xff0c;全链路监控&#xff0c;服务网关&#xff0c;负载均衡&#xff0c;熔断器等组件&#xff0c;除了基于NetFlix的开源组件做高度抽象…

鸿蒙系列--组件介绍之容器组件

一、Badge 描述&#xff1a;给其他组件添加标记 子组件&#xff1a;支持单个子组件 1.创建数字标记 Badge(value: {count: number, position?: BadgePosition, maxCount?: number, style: BadgeStyle}) 2.创建字符串标记 Badge(value: {value: string, position?: Badge…

【Bootstrap学习 day4】

Bootstrap5 列表组 使用Bootstrap创建列表 可以创建三种不类型的HTML列表&#xff1a; 无序列表—顺序无关紧要的项目列表。无序列表中的列表标有项目符号&#xff0c;例如。、等ul>li有序列表—顺序确实很重要的项目列表。有序列表中的列表项用数字标记&#xff0c;例如1、…

linux休眠机制介绍

一、概述 Linux系统提供了休眠和低功耗模式&#xff0c;可以帮助节省电力和延长电池寿命&#xff0c;休眠对应的另外一种模式就是唤醒。 二、常用的休眠方式 常用的休眠方式有freeze,standby, mem, disk&#xff0c;hibernate freeze: 冻结所有的进程&#xff0c;包括用户空…