首页 > 其他分享 >全链路灰度的挑战、实现思路与解决方案

全链路灰度的挑战、实现思路与解决方案

时间:2023-08-01 11:56:38浏览次数:35  
标签:服务 解决方案 流量 发布 灰度 链路 路由

作者:ZadigX

微服务架构下的灰度发布挑战

在传统的单体应用架构中,灰度发布相对简单。只需要在服务的流量入口处进行分流,通过使用 K8s Service 或各种类型的网关即可实现。然而,微服务架构引入了新的复杂性,服务之间的依赖关系错综复杂。有时候,某个功能的发布可能依赖于多个服务,要求灰度流量在整个调用链中准确路由到灰度版本的服务。传统的单个服务流量入口设置分流的做法无法满足这一需求。为了解决微服务架构下的灰度发布问题,全链路灰度发布引入了泳道(Lane)的概念。泳道将灰度视角从单个服务扩展到整个请求的调用链上,确保流量能够精确地在一组指定规则的服务之间流动,就像在预先设置好的泳道中一样。全链路灰度发布方案专为微服务架构设计,旨在应对微服务架构下的灰度发布挑战。

全链路灰度发布的实现思路

全链路灰度发布的核心在于流量泳道概念的实现,而泳道正如上文所说,是对满足指定规则的流量定下一个活动范围,它有以下两种实现思路:

第一种思路:完整环境隔离

泳道实现的主要难点在于,流量在服务间调用的过程中如何路由到正确的服务版本,但有一个简单的实现思路可以规避这个问题:复制一个包含所有微服务的完整环境,将需要灰度的服务替换为灰度版本。然后只需要在两个环境的流量入口处通过网关对流量进行规则分流,由于两套环境间存在网络隔离,灰度环境天然成为了一个灰度流量泳道。

image

然而,对于服务数量较多的微服务项目来说,这种方法会浪费资源,因为在灰度环境中创建非灰度服务会消耗额外的资源。如果要同时灰度多个版本,就需要创建多套完整环境,进一步增加了资源的浪费。

第二种思路:服务流量路由

image

若能赋予每个服务路由流量的能力,泳道的设置就可以共用正常服务从而充分利用资源,多版本的全链路灰度发布也可以同时在同一个环境中进行。具体而言,需要两个能力:全链路流量路由和全链路数据透传。

全链路流量路由

流量路由指的是服务本身发送流量时,可以根据指定规则将其路由到正确的目的地,例如带有灰度标的流量应该优先发往灰度版本的服务,全链路流量路由则要求每个服务都具备这种能力。

全链路流量路由目前有两种主流实现:

  1. 基于 Istio: 采用 Istio 这个开源 Service Mesh 组件,通过在每个服务的容器中部署 Envoy 透明代理,拦截服务之间的网络通信并按指定规则转发,从而实现了全链路流量路由,无需对现有代码进行修改。
  2. 基于服务发现组件: 通过支持为服务设置元数据的服务注册中心,如 Nacos,可以标记服务实例的特征,例如灰度版本。每个服务可以通过注册中心获取其他服务实例的版本信息,并通过修改代码逻辑或 Java Agent 实现流量路由。

全链路数据透传

为了实现全链路灰度发布,流量路由规则基于流量染色标记,因此需要将染色标记传递到整个请求链路中,即实现全链路数据透传能力。简单的数据透传可以基于原生的 HTTP Header、Query Parameters 等资源来实现,但在复杂的微服务场景下,应该使用 Tracing Baggage 机制。Tracing Baggage 是分布式链路跟踪工具提供的一种能力,可以携带用户自定义的键值对,主流的跟踪工具如 Skywalking 和 OpenTelemetry 都支持该功能。使用分布式链路追踪框架可以方便地进行日志记录和问题排查,特别适用于灰度发布场景下的需求。

企业发布现状的痛点分析

目前企业在选择和实施发布策略时面临以下困境:

  1. 从传统部署模式转变为云原生模式后,缺乏相关能力的人才进行技术架构改造,使得企业在发布策略方面难以入手。

  2. 已经找到适合产品现状的发布策略,但缺乏自动化平台或工具的支持,仍然依赖手工逐步执行,可能导致流程遗漏或人工操作失误,造成生产事故。

  3. 仅实现了服务级别的灰度能力,逐个发布服务耗时长,导致发布过程缓慢,验证效果不佳。

针对以上问题,ZadigX 提供了灰度发布的解决方案,帮助企业应对这些痛点。

全链路灰度发布的实现方案

主要有 Istio、JavaAgent 等主流方案,基于流量路由的能力,ZadigX 提供了两套通用方案:

阿里云 MSE + ZadigX

阿里云 MSE 为 Java 应用提供了便捷实现全链路灰度的能力。MSE 微服务引擎是基于 Java Agent 实现的无侵入式企业生产级服务治理产品,不需要修改任何一行业务代码,即可拥有不限于全链路灰度的治理能力,并且支持近 5 年内所有的 Spring Boot、Spring Cloud 和 Dubbo。

使用 MSE 进行灰度发布的过程中,ZadigX 可以便捷得创建灰度环境和灰度 K8S 资源、结合发布工作流编排能力,自动为 K8S 资源设置 MSE 所需的资源标记,集成了 MSE API 降低重复工作量。

Istio + Distributed Tracing + ZadigX

Istio 可以无侵入地实现全链路流量路由能力,同时还可以设置基于比例、权重、HTTP Header 等条件的流量路由,但全链路数据透传需要服务本身实现,为此需要服务接入支持 Baggage 的分布式链路追踪框架,若还没接入则会涉及到一定的改造成本。

ZadigX 可以根据指定的灰度任务与灰度标记规则,结合发布工作流编排能力与环境的监测管理能力,自动创建 Istio VirtualService 与 DistinationRule  资源以实现相应的泳道,达到了让开发者轻松进行全链路灰度发布的效果。

标签:服务,解决方案,流量,发布,灰度,链路,路由
From: https://www.cnblogs.com/alisystemsoftware/p/17596072.html

相关文章

  • OpenHarmony系统解决方案 - 接入多个显示设备卡开机Logo
    问题描述问题环境系统版本:OpenHarmony-3.2-Release问题现象接入多个显示设备后,启动系统偶现卡开机Logo。异常效果:系统卡在开机Logo界面,长时间无法显示开机动画,并且无法进入系统。正常效果:系统启动成功,显示开机动画,开机动画结束后显示锁屏界面。问题原因在窗口子系统中Abstra......
  • 国标GB28181视频平台LntonGBS(源码版)国标平台迁移服务器后无法启动的问题解决方案
    国标视频云服务LntonGBS支持设备/平台通过国标GB28181协议注册接入,并能实现视频的实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。平台部署简单、可拓展性强,支持将接入的视频流进行全终端、全平台分发,分发的视频流包括RTSP、RTMP、FLV、HLS、WebRTC等格......
  • 矿山边坡综合在线监测-全方位解决方案
    一、行业背景采矿工业在国民经济中占着相当重要的地位,虽然它在我国工业生产值中占的经例不多,但以矿业为基础的原材料工业和相关加工业的产值占全国工业总产值的60%以上,因此,矿业是我国国民经济的基础和支柱产业,矿业的开发,带动了一些城市的兴起和繁荣,为人民提供大量就业机会矿山边......
  • 链路追踪之选型Zipkin、Pinpoint、SkyWalking、CAT、jaeger
    https://www.pianshen.com/article/51782363885/ https://blog.csdn.net/A123638/article/details/123117142......
  • .Net设置SplashScreen,在高DPI下不居中的解决方案
    .Net设置SplashScreen,在高DPI下不居中的解决方案根据.Net官方文档,设置图片类型的软件的启动屏幕非常简单,只需要将图片放在工程里,并将图片的生成操作设置为SplashScreen后即可。但是这个办法在高DPI屏幕中没有适应,图片显示的位置不居中,对于强迫症来说会非常非常难受。查......
  • RabbitMQ - MQ幂等、去重的解决方案
    1.场景描述消息中间件是分布式系统常用的组件,无论是异步化、解耦、削峰等都有广泛的应用价值。我们通常会认为,消息中间件是一个可靠的组件——这里所谓的可靠是指,只要我把消息成功投递到了消息中间件,消息就不会丢失,即消息肯定会至少保证消息能被消费者成功消费一次,这是消息中间件......
  • python Pycharm出现“can't find '__main__' module”解决方案
    是配置没配对,因为在配置时没有选择.py文件,而只选择了工程名。因此选择EditConfigurations。选择EditConfigurations后,查看Scriptpath只选择了工程名innerfuns,而这里应该要选择工程名里面的.py文件(main函数,如果没有,选择你要执行的.py文件)。最终可运行成功......
  • 关于elementUI中Cascader 级联选择器高度问题:终极解决方案
    在使用elementUi级联选择器时,如果里面的option太多,导致它撑满整个屏幕,网上找了挺久的解决方案,都是说在全局设置它的高度,这个方法有效,但是这种方式我忍不了,因为它会影响到全局Cascader样式,以下设置意味着整个项目中的所有级联选择器都是300px,那如果我在别的页面没那么多option,岂不......
  • 【高并发】SimpleDateFormat类到底为啥不是线程安全的?(附六种解决方案,建议收藏)
    大家好,我是冰河~~首先问下大家:你使用的SimpleDateFormat类还安全吗?为什么说SimpleDateFormat类不是线程安全的?带着问题从本文中寻求答案。提起SimpleDateFormat类,想必做过Java开发的童鞋都不会感到陌生。没错,它就是Java中提供的日期时间的转化类。这里,为什么说SimpleDateFormat......
  • OSPF-LSA链路状态通告信息
    前言:同一区域的OSPF路由器拥有完全相同的LSDB,在区域内部,OSPF采用SPF算法完成路由计算,路由器为了完成路由计算,会消耗内存、CPU的资源,通过区域划分可以在一定程度上缓解路由器的压力,在大规模网络中除了使用OSPF路由协议,还可能存在其他协议。OSPF支持引入外部路由协议,从而使得OSPF知......