浅析微服务全链路灰度解决方案

本文涉及的产品
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 微服务全链路灰度解决方案,帮助应用发布版本过程中更精细化,提高了发布过程中的稳定性。服务转移⾄请求链路上进行流量控制,有效保证了多个亲密关系的服务顺利安全发布以及服务多版本并⾏开发,进⼀步促进业务的快速发展。

本文摘选自《微服务治理技术白皮书》,该白皮书历经半年多筹备,长达379页。希望通过本书,能对高效解决云原生架构下的微服务治理难题,起到一点点作用,电子版免费下载地址:https://developer.aliyun.com/ebook/7565

图片 1.png

长按二维码直达下载地址



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


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

图片 2.png

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

 

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

图片 3.png

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

图片 4.png

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



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


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

图片 5.png

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

 

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

 

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

 


三、什么是全链路灰度


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

图片 5-1.png

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

 

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

 


四、全链路灰度的解决⽅案


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

 

物理环境隔离

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

图片 6.png

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

 

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

 

逻辑环境隔离

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

图片 7.png

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

 

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

 

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

2.需要对服务下的所有节点进分组,能够区分版本。

3.需要对流量进灰度标识、版本标识。

4.需要识别出不同版本的灰度流量。

 

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

 

标签路由

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

图片 8.png

节点打标

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

 

在使Kubernetes Service作为服务发现的业务系统中,服务提供者通过向ApiServer提交

Service资源完成服务暴露,服务消费端监听与该Service资源下关联的Endpoint资源,从

Endpoint资源中获取关联的业务Pod资源,读取上Labels数据并作为该节点的元数据信息。所以,我们只要在业务应描述资源Deployment中的Pod模板中为节点添加标签即可。

图片 9.png

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

图片 10.png

流量染

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

 

分布式链路追踪

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

 

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

traceid是需要整个链路传递的。

 

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

图片 11.png

逻辑环境隔离

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

图片 12.png


总体上看,实现全链路灰度的能论是成本还是技术复杂度都是的,以及后期的维护、扩展都是的成本,但确实更精细化的提高了发布过程中的应用稳定性。

相关实践学习
基于OpenTelemetry构建全链路追踪与监控
本实验将带领您快速上手可观测链路OpenTelemetry版,包括部署并接入多语言应用、体验TraceId自动注入至日志以实现调用链与日志的关联查询、以及切换调用链透传协议以满足全链路打通的需求。
分布式链路追踪Skywalking
Skywalking是一个基于分布式跟踪的应用程序性能监控系统,用于从服务和云原生等基础设施中收集、分析、聚合以及可视化数据,提供了一种简便的方式来清晰地观测分布式系统,具有分布式追踪、性能指标分析、应用和服务依赖分析等功能。 分布式追踪系统发展很快,种类繁多,给我们带来很大的方便。但在数据采集过程中,有时需要侵入用户代码,并且不同系统的 API 并不兼容,这就导致了如果希望切换追踪系统,往往会带来较大改动。OpenTracing为了解决不同的分布式追踪系统 API 不兼容的问题,诞生了 OpenTracing 规范。OpenTracing 是一个轻量级的标准化层,它位于应用程序/类库和追踪或日志分析程序之间。Skywalking基于OpenTracing规范开发,具有性能好,支持多语言探针,无侵入性等优势,可以帮助我们准确快速的定位到线上故障和性能瓶颈。 在本套课程中,我们将全面的讲解Skywalking相关的知识。从APM系统、分布式调用链等基础概念的学习加深对Skywalking的理解,从0开始搭建一套完整的Skywalking环境,学会对各类应用进行监控,学习Skywalking常用插件。Skywalking原理章节中,将会对Skywalking使用的agent探针技术进行深度剖析,除此之外还会对OpenTracing规范作整体上的介绍。通过对本套课程的学习,不止能学会如何使用Skywalking,还将对其底层原理和分布式架构有更深的理解。本课程由黑马程序员提供。
相关文章
|
3月前
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo:微服务通信的高效解决方案
【10月更文挑战第15天】随着信息技术的发展,微服务架构成为企业应用开发的主流。Spring Cloud Dubbo结合了Dubbo的高性能RPC和Spring Cloud的生态系统,提供高效、稳定的微服务通信解决方案。它支持多种通信协议,具备服务注册与发现、负载均衡及容错机制,简化了服务调用的复杂性,使开发者能更专注于业务逻辑的实现。
84 2
|
3月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
180 3
|
28天前
|
Java Nacos Sentinel
Spring Cloud Alibaba:一站式微服务解决方案
Spring Cloud Alibaba(简称SCA) 是一个基于 Spring Cloud 构建的开源微服务框架,专为解决分布式系统中的服务治理、配置管理、服务发现、消息总线等问题而设计。
222 13
Spring Cloud Alibaba:一站式微服务解决方案
|
14天前
|
运维 监控 Java
为何内存不够用?微服务改造启动多个Spring Boot的陷阱与解决方案
本文记录并复盘了生产环境中Spring Boot应用内存占用过高的问题及解决过程。系统上线初期运行正常,但随着业务量上升,多个Spring Boot应用共占用了64G内存中的大部分,导致应用假死。通过jps和jmap工具排查发现,原因是运维人员未设置JVM参数,导致默认配置下每个应用占用近12G内存。最终通过调整JVM参数、优化堆内存大小等措施解决了问题。建议在生产环境中合理设置JVM参数,避免资源浪费和性能问题。
37 3
|
6月前
|
Kubernetes 测试技术 数据库
详解微服务应用灰度发布最佳实践
相对于传统软件研发,微服务架构下典型的需求交付最大的区别在于有了能够小范围真实验证的机制,且交付单位较小,风险可控,灰度发布可以弥补线下测试的不足。本文从 DevOps 视角概述灰度发布实践,介绍如何将灰度发布与 DevOps 工作融合,快来了解吧~
31431 19
|
6月前
|
数据库 开发者 微服务
微服务架构下的数据一致性挑战与解决方案
在当今的软件开发领域,微服务架构因其灵活性和可扩展性而受到广泛青睐。然而,这种架构风格也带来了数据一致性的复杂问题。本文将深入探讨微服务环境中数据一致性面临的挑战,并提出一系列解决策略。我们将以实际案例分析如何应用这些策略,并讨论它们在不同场景下的利弊。文章旨在为后端开发者提供一套实用工具和方法,帮助他们在设计和实现微服务时确保数据一致性。
167 0
|
7月前
|
存储 消息中间件 运维
从单体到微服务:架构演进中的技术挑战与解决方案
在软件开发的过程中,系统架构的选择对项目的成功与否起到至关重要的作用。本文将深入探讨从单体架构向微服务架构演进过程中所遇到的技术挑战,并提供相应的解决方案。
187 0
|
5月前
|
API 微服务
【Azure 微服务】面对Service Fabric中节点状态不正常(Disabling/Warning/RemoveNode)的几种尝试解决方案
【Azure 微服务】面对Service Fabric中节点状态不正常(Disabling/Warning/RemoveNode)的几种尝试解决方案
|
6月前
|
关系型数据库 分布式数据库 数据库
PolarDB,阿里云的开源分布式数据库,与微服务相结合,提供灵活扩展和高效管理解决方案。
【7月更文挑战第3天】PolarDB,阿里云的开源分布式数据库,与微服务相结合,提供灵活扩展和高效管理解决方案。通过数据分片和水平扩展支持微服务弹性,保证高可用性,且兼容MySQL协议,简化集成。示例展示了如何使用Spring Boot配置PolarDB,实现服务动态扩展。PolarDB缓解了微服务数据库挑战,加速了开发部署,为云原生应用奠定基础。
342 3
|
7月前
|
缓存 Java 微服务
Springboot微服务整合缓存的时候报循环依赖的错误 两种解决方案
Springboot微服务整合缓存的时候报循环依赖的错误 两种解决方案
92 1