微服务治理之全链路灰度|学习笔记(二)

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: 快速学习微服务治理之全链路灰度

开发者学堂课程【微服务治理之全链路灰度微服务治理之全链路灰度】学习笔记,与课程紧密联系,让用户快速学习知识。  

课程地址:https://developer.aliyun.com/learning/course/973/detail/14894


微服务治理之全链路灰度


方案二涉及的技术:标签路由

如下图所示:

图片10.png

标签路由是consumer端对provider下所有的节点根据它们所携带的标签信息进行分组因为标签信息在每个节点上面都有分组信息并且很多,所以consumer可以根据这些标签信息来做不限于全链路灰度的一些问题。

标签路由是打多个自定义标来表示不同节点有不同的意义;

金丝雀发布更倾向于一些版本标,例如v1,v2等;

链路流控针对线上的某些流量进行控制流量带有这些标带有队伍,然后链路上的每个服务时进行判断,如果这个流量就会判断这个流量有没有触发对应的流控配置,如果触发,就会进行限流

同AZ优先路由就是节点,有时会带一些地域标机房标这些信息consumer端可以基于这些信息对provider下面限定分组,来就近选择一个离自己比较近的一个节点

全链路压测主要是对线上流量用线上环境进行压测但是数据库需要进行区分,一般会有一个影子消息队列和影子消息库。当流量带有全链路压测标时就会去访问一个影子的数据库进行落盘

场景链路就是跟业务比较耦合的一个场景,例如在购物中现有一个大促针对女装,我们需要进行识别流量来源是否为女装,所以需要保障该流量是可用的,不是女装的其他流量会被转发到其他版本中;

容灾路由基于region标,当最近的机房没有节点时希望将流量转到哪个机房。

方案二涉及的技术:节点打标

图片11.png

链路灰度流量在动态路由首先会判断本次流量的回路标是什么,同时判断需要调用的provider服务有没有对应的标签所以某个服务灰度发布时,需要向注册中心显示这些标签信息这就为节点打标。

这里主要是以容器化的业务运用举例服务发现使用NACOS注册中心。

例如图上现有一个service,左边蓝色是正式版本的Deployment,右边是灰度版本的deployment,们需要在pod启动向注册中心注册一些信息,左侧注册version=base,右侧注册version=gray,那么在真实的业务场景中如何操作?

图右代码为一个使用spring cloud的服务治理框架我们在业务容器的环境变量中添加这样的一个标

-name:spring.cloud.nacos.discovery.metadata.version

value:gray

version是业务的一个自定义的元素性的key值为gray

那么pod在注册到nacos上面节点下面的元素信息就会自动添加一条version等于base或者是gray一条信息。 

以容器化的业务应用举例,服务发现使用k8s Service:

图片12.png

利用业务pod标签来操作。需要额外apiserver去apply一个service资源kps中服务注册跟服务发布是结偶的,服务业务deployment可以独立部署,但是如果其他的组件发现就要通过一个service资源,然后发布,才能真正完成服务发布。

真正的consumer端只需要去订阅service资源对应的endpoint资源,endpoint资源是api自动生成,监听到endpoint资源再进一步监听跟endpoint有关的pod资源,再从pod资源上面读取这些label 

案例:

apiVersion: apps/v1

kind: Service

metadata :

name: httpbin

spec:

ports:

-port: 8080

protocol: TCP

selector:

app: httpbin

template :

metadata :

labels:

app: httpbin

version: v1 ,

spec:

containers :

-image: xxxxx

imagePullPolicy: Always

ports :

-containerPort: 8080

方案二涉及的技术:流量染色

图片13.png

如何给流量打上标识使得这些标识还能被流经各个服务组件的时候被们识别呢?流量染色的作用是什么呢?

流量染色其实就是用来区分不同的流量。此处与刚才例子相同:现要搞一个女装活动的一个大卖活动。这些ABCD对于家电或者女装来说,都提供一样的服务,但要在女装活动大促确保这个流量都是高可用的,不会出现问题因为流量比较,所以额外去进行扩容扩容之后达到若是线上的这些购物的流量是女装的这种场景就去访问扩容后的这些业务节点家电这种非女装流量去访问之前的业务节点通过这样的流量隔离可以确保大促的平稳运行。

方案二涉及的技术:分布式链路追踪

图片14.png

我们需要确保请求流量标识是怎么在整个链路上面传递的。如果是在请求源头染色那么请求经过网关网关作为代理,会将请求原封不动的转发给入口服务。即若对流量打上了一个自定义的一个灰度标识那么经过网关会自动带上请求的灰度标识那么当网关访问入口服务A,服务A在调服务B需要去创建一个新的请求。在创建一个新的请求同时不会携带灰度图标。所以需要通过某种方案来确保灰度标识可以从头带到尾。此处使用到分布式链追踪技术。

分布式链路追踪解决的是分布式应用中请求链路的一个可视化。因为在单体架构中,服务之间的调用是方法调用,在同一个线程再来回调动。

但是在微服务架构中因为服务都是独立部署,所以之前同一进程,同一线程内的方法调用变为了不同节点,不同进程之间的调用,还涉及到网络通信,并且每个服务实力数也是不一样的ip是固定的。所以整个调用链路是不可预见,不可知的

所以需要请求经过网关,生成一个全局的TraceID,它是唯一标识的一条请求链。然后创建一个SpanID,这些信息会被发送到请求头部或者是上下文中,然后到达服服务A服务A就会通过Extract组件,去请求中TraceID,SpanID取出来,然后存到Treadlocal存储该存储是线程相关的存储

当服务A到服务B,会从本地线程存储取出这两个信息,并且在服务A即将向服务B发起请时将这两个信息注入TraceID保持不变,SpanID会自动往后增一个数字,1.1就代表这个请求经过了两跳。

当服务A调用服务C时,服务A涉及到两个调用先调服务B再服务C那么spanID的第二个值就会自动增加一,可以看到请求是先访问服务B然后再访问服务C。 

方案二实现的方式:基于SDK   图片15.png

第一种方式是基于sdk的方式需要去修改业务架构,现在使用的开发框架spring cloud或者dubbo能够使得们在流量流经各个组件和各个服务做一些动态路由。对于spring cloud跟dubbo来说需要去实现一个自定义的filter来实现以上逻辑。例如标签路由分布式链路要在filter逻辑同时还要做一些容灾机制,确保服务

例如服务A访服务B时,灰度环境1,但是服务B去访问服务C时会发现服务环境1没有节点,此时需要回到服务C的正式环境。们都需要去引入一个分布式链路追踪技术,确保一些灰标识的传递dubboe现在已经支持了一部分这样的能力,但是dubbo各个版本实现不一致。

总结sdk主要的逻辑:

1. 每个服务都需要订阅一些流量规则,这些流量规则需要在sdk filter里动态更新,而且是实时生效

2. sdk需要对每个服务的所有的出口流量应用这些流量治理规则,确保服务A访问服务B可以根据一些标签进行一些路由;

3. filter中需要依托分布式链路追踪技术,然后透传一些自定义标签;

4. 高可用,需要做一些自动容灾机制确保流转在灰度环境1或灰度环境2对应版本的服务可以回退到正式环境

优点是业务代码逻辑比较熟悉改造比较灵活

缺点是开发者需要去维护sdk,在微服务架构中,每个服务使用的版本不一致需要对每个版本的框架去维护sdk的逻辑。如果出现了bug需要对全网的sdk进行升级代价很高。 

方案二涉及的技术:基于Java Agent图片16.png

基于java agent的方式主要是通过一种无侵入方式为服务开发框架来增添一些功能,是一种基于字解码增强的技术实现的。同时也需要开发人员去维护agent代码企业中微服务架构可能采用的框架版本不一致,所以需要对不同的版本去维护agent的代码逻辑。当出现bug,也需要全网升级。

需要与基于sdk一样,额外再去部署一个流量规则Opsops方便开发者去发布一些流量治理规则,agent跟流量规则ops进行联动如果自建,开发代价比较大。

阿里云MSE服务治理,是一款基于java agent实现的无侵入企业级服务治理产品可以做到不需要修改任何一行业务代码即可拥有不限于全度的服务治理能力。并且支持五年内所有版本SpringBoot spring cloud和dubbo。

优点是它是一种无侵入的方式所以业务无感知

缺点是比较局限于java技术的微服务框架对于一些多语言的环境例如在一些大的企业因为微服务采用的框架可能是不一致的。业务团队可能用spring cloud,业务团队二可能用dubbo所以在多语言场景下进行全链路灰度需要另一种技术Service Mesh

方案二涉及的技术:基于Service Mesh

图片17.png

Service Mesh号称下一代微服务架构,是将分布式服务的通信程抽象为单独的一程,然后在这一层中实现负载均衡需要全面度灰度的能力也可以在流量治理基础设施层来实现。

如果用开源的产品对于存在新的度版本要发布需要更新配置

配置的路由需要感知到环境标是什么?如果服务B有多个版本在发布,服务C也有版本在并行发布那么就会导致service的数量指数级增长变得不可控制。

并且Service Mesh没有容灾的机制,指定服务A访问服务B灰度环境v1的版本,如果服务B没有,就不会自动去容到服务B的正式环境,它会仍然访问不可用节点就会导致404这些错误。

阿里云服务网格ASM产品针对全链灰度了很优化。引入了TrafficLabel对于全路灰度的整个使用体验有了很大提升,不需要再配配置通过占位符实现一个配置动态它会随着灰度环境的数量,进行自动的扩展。并且引入了一个函数,可以去实现一些复杂场景的达标诉求

ASM总体是一个统一管理微服务应用的流量平台,并且兼容lstio是托管式的。

总结:

1. 引入TrafficLabel资源,优化全链路使用体验

2. 引入占位符,实现配置动态

3. 引入函数,应对复杂场景的打标诉求

4. 自动容灭,自动降级

方案二的3种实现方式对比

方案

客户体验

稳定性

支持成本

客户白盒程度

性能

多语言

SDK

差:客户需要理解SDK里的代码并修改业务代码

低:重新编写新的路由逻辑

低:编写代码提供SDK即可

高:代码透明,自主可控

高:SPI覆盖原有逻辑

差:只支持Java

Java Agent

好:客户0感知,只需要在控制台上配置规则

低:重新编写新的路由逻辑

中:发布系统or  Pilot挂载Java Agent

低3:代码对客户不透明,黑盒

高:Java AOP切面拦截用户代码

差:只支持Java

Mesh/Sidecar

好:客户0感知,只需要在控制台上配置规则

高:基于开源lstio做部分改造

高:sidecar是一个单独的container,需要资源,也需要发布系统or  Pilot管控Sidecar

低:代码对客户不透明,黑盒

低:流量劫持多了2跳

好:语言无关



相关实践学习
基于OpenTelemetry构建全链路追踪与监控
本实验将带领您快速上手可观测链路OpenTelemetry版,包括部署并接入多语言应用、体验TraceId自动注入至日志以实现调用链与日志的关联查询、以及切换调用链透传协议以满足全链路打通的需求。
分布式链路追踪Skywalking
Skywalking是一个基于分布式跟踪的应用程序性能监控系统,用于从服务和云原生等基础设施中收集、分析、聚合以及可视化数据,提供了一种简便的方式来清晰地观测分布式系统,具有分布式追踪、性能指标分析、应用和服务依赖分析等功能。 分布式追踪系统发展很快,种类繁多,给我们带来很大的方便。但在数据采集过程中,有时需要侵入用户代码,并且不同系统的 API 并不兼容,这就导致了如果希望切换追踪系统,往往会带来较大改动。OpenTracing为了解决不同的分布式追踪系统 API 不兼容的问题,诞生了 OpenTracing 规范。OpenTracing 是一个轻量级的标准化层,它位于应用程序/类库和追踪或日志分析程序之间。Skywalking基于OpenTracing规范开发,具有性能好,支持多语言探针,无侵入性等优势,可以帮助我们准确快速的定位到线上故障和性能瓶颈。 在本套课程中,我们将全面的讲解Skywalking相关的知识。从APM系统、分布式调用链等基础概念的学习加深对Skywalking的理解,从0开始搭建一套完整的Skywalking环境,学会对各类应用进行监控,学习Skywalking常用插件。Skywalking原理章节中,将会对Skywalking使用的agent探针技术进行深度剖析,除此之外还会对OpenTracing规范作整体上的介绍。通过对本套课程的学习,不止能学会如何使用Skywalking,还将对其底层原理和分布式架构有更深的理解。本课程由黑马程序员提供。
相关文章
|
3月前
|
Kubernetes 测试技术 数据库
详解微服务应用灰度发布最佳实践
相对于传统软件研发,微服务架构下典型的需求交付最大的区别在于有了能够小范围真实验证的机制,且交付单位较小,风险可控,灰度发布可以弥补线下测试的不足。本文从 DevOps 视角概述灰度发布实践,介绍如何将灰度发布与 DevOps 工作融合,快来了解吧~
30754 18
|
3月前
|
监控 Kubernetes Cloud Native
云原生架构下的微服务治理之道
【7月更文挑战第30天】在数字化转型的浪潮中,企业级应用正迅速向云原生架构迁移。本文将深入探讨云原生环境下微服务治理的最佳实践,包括服务发现、配置管理、流量控制等关键策略,并结合实例分析如何在保障系统弹性、可维护性的同时,优化资源利用效率和加快业务创新速度。
44 2
|
3月前
|
运维 Kubernetes Cloud Native
云原生架构下的微服务治理之道
【7月更文挑战第20天】在数字化转型的浪潮中,企业纷纷拥抱云原生,以期实现更高效的资源利用、更快的业务迭代和更强的系统稳定性。本文将深入探讨如何通过云原生架构优化微服务的治理,确保系统的高可用性和可维护性,同时提升开发效率和运维灵活性。我们将从微服务治理的核心原则出发,结合具体案例,分析在云环境中实施微服务治理的策略与挑战。
44 2
|
3月前
|
监控 Cloud Native 安全
云原生架构下的微服务治理实践
在数字化转型的浪潮中,云原生技术以其灵活性和可扩展性成为现代软件工程的基石。本文将深入探讨云原生架构下微服务治理的实践路径,从微服务的拆分、容器化部署、服务网格的应用到最终的监控与故障排除,提供一套全面的方法论。文章旨在为读者呈现一个清晰的云原生环境下,如何高效管理和维护微服务系统的全景图。
48 2
|
3月前
|
负载均衡 Cloud Native 云计算
云原生架构下的微服务治理与挑战
随着云计算技术的不断演进,云原生架构已成为现代应用开发的首选模式。本文将深入探讨在云原生环境下,微服务治理的重要性、实现方法及所面临的挑战。通过分析微服务治理的关键要素如服务发现、配置管理、负载均衡和故障转移等,揭示如何在高度动态的云环境中保持服务的高可用性和灵活性。同时,本文也将指出在实施微服务治理过程中可能遇到的技术难题和应对策略,为构建健壮的云原生应用提供指导。
|
3月前
|
监控 负载均衡 Java
Spring Boot与微服务治理框架的集成
Spring Boot与微服务治理框架的集成
|
3月前
|
负载均衡 Java Nacos
Spring Boot与微服务治理框架的集成策略
Spring Boot与微服务治理框架的集成策略
|
4月前
|
负载均衡 Java 开发者
细解微服务架构实践:如何使用Spring Cloud进行Java微服务治理
【6月更文挑战第30天】Spring Cloud是Java微服务治理明星框架,整合Eureka(服务发现)、Ribbon(客户端负载均衡)、Hystrix(断路器)、Zuul(API网关)和Config Server(配置中心),提供完整服务治理解决方案。通过Eureka实现服务注册与发现,Ribbon进行负载均衡,Hystrix确保服务容错,Config Server集中管理配置,Zuul则作为API入口统一处理请求。理解和使用Spring Cloud是现代Java开发者的关键技能。
125 2
|
4月前
|
Kubernetes 监控 Cloud Native
云原生架构下的微服务治理实践
【6月更文挑战第23天】在云计算的浪潮中,云原生架构以其弹性、可扩展性和高效性成为企业数字化转型的重要推手。本文将深入探讨如何利用云原生技术实现微服务的治理与优化,确保系统的稳定性和高可用性。我们将从微服务的基本概念出发,通过具体案例分析,揭示云原生环境下微服务治理的关键策略,并分享实践经验,旨在为读者提供一套完整的微服务治理解决方案。
|
4月前
|
运维 负载均衡 Cloud Native
云原生架构下的微服务治理实践
【6月更文挑战第24天】在云原生的浪潮下,微服务治理成为确保系统弹性、可维护性和可观测性的关键。本文通过深入分析微服务治理的核心要素与挑战,结合前沿技术和工具,提出一套实用的微服务治理策略,旨在帮助开发者和架构师构建更加稳定、高效且易于管理的分布式系统。