灰度发布整体解决方案

文章介绍了在系统升级中,为避免直接影响用户体验,可以采用灰度发布策略。在单体架构中,蓝绿发布和灰度发布是常见方法,而在微服务架构下,灰度发布更为复杂,需要关注服务间的依赖。全链路灰度发布通过流量染色和标签路由等技术,实现对调用链路的精细化控制,减少发布风险。物理环境隔离和逻辑环境隔离是实现全链路灰度的两种途径,后者能节省成本并提高控制效率。
摘要由CSDN通过智能技术生成

在我们项目进行版本升级的时候,肯定要求系统不间断的提供服务,如果直接将某版本上线发布给全部用户,一旦遇到线上事故(或BUG),对用户的影响极大,解决问题周期较长,甚至有时不得不回滚到前一版本,严重影响了用户体验。
基于此,可以采用灰度发布的方式来解决。

单体架构下的服务发布

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

在这里插入图片描述
由于 Cat 服务是应用的一部分,所以新版本上线时需要对整个应用进行编译、打包以及部署服务级别发布问题变成了应用级别的发布问题,我们需要对应用的新版本而不是服务来实施有效的发布策略。

目前业界已经有非常成熟的服务发布方案,例如蓝绿发布和灰度发布。

蓝绿发布

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

在这里插入图片描述
在蓝绿发布中,由于存在流量整体切换,所以需要按照原服务占用的机器规模为新版本克隆一套环境,相当于要求原来一倍的机器资源。

灰度发布

根据请求内容或者请求流量的比例将线上流量的一小部分转发至新版本,待灰度验证通过后,逐步调大新版本的请求流量,是一种循序渐进的发布方式。 我们的例⼦使⽤灰度发布的示意图如下,基于内容或⽐例的流量控制需要借助于⼀个七层代理的微服务⽹关来完成。

在这里插入图片描述

  • Traffic Routing,基于内容的灰度方式,比如在请求头上携带tag=gray的流量路由到v2版本;
  • Traffic Shifting,基于比例的灰度方式,以无差别的方式对线上流量按照比重的方式进行分流

注意:灰度发布在机器资源成本以及流量控制能力更胜一筹,缺点就是发布周期过长,对运维基础设施要求过高。

微服务架构下的服务发布

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

在这里插入图片描述
为了验证服务Cart的新版本,流量在整个调用链路上能够通过某种方式有选择的路由到Cart的灰度版本。这属于微服务治理领域中流量治理问题。

常见的治理策略包括基于Provide和基于Consumer的方式。

  • 1、基于Provider的治理策略:配置Cart的流量流入规则,User路由到Cart时使用Cart的流量流入规则。
  • 2、基于Consumer的治理策略:配置User的流量流出规则,User路由到Cart时使用User的流量流出规则。

全链路灰度发布

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

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

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

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

物理环境隔离

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

在这里插入图片描述

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

逻辑环境隔离

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

在这里插入图片描述
上图可以很好展示这种方案的效果,我们用不同的颜色来表示不同版本的灰度流量,可以看出无论是微服务网关还是微服务本身都需要识别流量,根据治理规则做出动态决策。

当服务版本发生变化时,这个调用链路的转发也会实时改变。相比于利用机器搭建的灰度环境,这种方案 不仅可以节省大量的机器成本和运维人力,而且可以帮助开发者实时快速的对线上流量进行精细化的全链路控制。

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

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

需要的技术:

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

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

分布式链路追踪:保证灰度标识能够在链路中一直传递下去,分布式链路追踪技术对大型分布式系统中请求调用链路进行详细记录,核心思想就是通过一个全局唯一的 traceid 和每一条的 spanid 来记录请求链路所经过的节点以及请求耗时,其中traceid 是需要整个链路传递的。借助于分布式链路追踪思想,我们也可以传递一些自定义信息,如灰度标识。业界常用的分布式链路追踪产品都支持链路传递用户自定义的数据。

在这里插入图片描述

首先,需要支持动态路由功能,对于 Spring Cloud、Dubbo 开发框架,可以对出口流量实现自定义 Filter,在该 Filter 中完成流量识别以及标签路由。同时需要借助分布式链路追踪技术完成流量标识链路传递以及流量自动染色。此外,需要引入一个中心化的流量治理平台,方便各个业务线的开发者定义自己的全链路灰度规则。如下图所示:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小军的编程之旅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值