【RuoYi-Cloud-Plus】学习笔记 09 - Sentinel(四)熔断降级知识整理

前言

本文的开篇直接引用 Sentinel 官方 wiki 的描述进行说明:

除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。一个服务常常会调用别的模块,可能是另外的一个远程服务、数据库,或者第三方 API 等。例如,支付的时候,可能需要远程调用银联提供的 API;查询某个商品的价格,可能需要进行数据库查询。然而,这个被依赖服务的稳定性是不能保证的。如果依赖的服务出现了不稳定的情况,请求的响应时间变长,那么调用服务的方法的响应时间也会变长,线程会产生堆积,最终可能耗尽业务自身的线程池,服务本身也变得不可用。
现代微服务架构都是分布式的,由非常多的服务组成。不同服务之间相互调用,组成复杂的调用链路。以上的问题在链路调用中会产生放大的效果。复杂链路上的某一环不稳定,就可能会层层级联,最终导致整个链路都不可用。因此我们需要对不稳定的弱依赖服务调用进行熔断降级,暂时切断不稳定调用,避免局部不稳定因素导致整体的雪崩。熔断降级作为保护自身的手段,通常在客户端(调用端)进行配置。

在这段文字中很好地说明了熔断降级的使用场景以及作用,结合《实战Alibaba Sentinel:深度解析微服务高并发流量治理》第6章的内容,本文做了一些知识整理。

参考目录

版本说明

  • SentinelV1.8.6

学习笔记

1、包结构

Sentinel 关于熔断降级功能的主要包结构如下:

在这里插入图片描述

按照功能我简单整理成了表格:

类名类型说明
DegradeSlotclass熔断插槽
DegradeRuleclass熔断规则对象
DegradeRuleManagerclass熔断规则管理器
DegradeRuleManager.RulePropertyListenerprivate class熔断规则管理器.规则属性监听器
DegradeExceptionexception class熔断异常类
CircuitBreakerinterface断路器接口
CircuitBreaker.Stateenum断路器状态枚举
AbstractCircuitBreakerabstract class抽象断路器
CircuitBreakerStrategyenum断路器策略枚举
ExceptionCircuitBreakerclass异常断路器
ResponseTimeCircuitBreakerclass响应时间断路器(慢请求断路器)
CircuitBreakerStateChangeObserverinterface断路器状态改变观察者
EventObserverRegistryclass断路器事件观察者注册表

下文将按照这个表格的顺序对相关类进行说明。

2、DegradeSlot

这是在 Sentinel 核心调用链路的插槽之一。

这个 slot 主要针对资源的平均响应时间(RT)以及异常比率,来决定资源是否在接下来的时间被自动熔断掉。

跟其他 slot 一样实现了 entry 以及 exit 方法。

DegradeSlot#entry
在这里插入图片描述

slot 入口方法逻辑比较简单:

  1. 根据资源名称从熔断规则管理器中获取所有的断路器。
  2. 如果没有断路器直接返回。
  3. 遍历所有断路器:
    • 根据上下文进行断路器校验,如果校验不通过则抛出降级异常。

DegradeSlot#exit
在这里插入图片描述

在该方法中,如果请求执行没有异常,则再次遍历所有断路器并依次执行完成记录以及改变相关状态。

关于 CircuitBreaker#onRequestComplete 方法会在后文展开说明。

3、DegradeRule

在这里插入图片描述

关于对象属性的说明:

在这里插入图片描述

4、DegradeRuleManager

在这里插入图片描述

构建断路器方法:

DegradeRuleManager.RulePropertyListener#buildCircuitBreakers
在这里插入图片描述

DegradeRuleManager#getExistingSameCbOrNew
在这里插入图片描述

根据不同的降级策略创建不同的断路器。

5、CircuitBreaker

在这里插入图片描述

接口继承关系:

在这里插入图片描述

主要的实现类有三个:

  • 抽象断路器 AbstractCircuitBreaker
  • 响应时间断路器(慢请求断路器)ResponseTimeCircuitBreaker
  • 异常断路器 ExceptionCircuitBreaker

抽象断路器主要实现了方法:getRuletryPasscurrentState;另外两个策略断路器主要实现的是 onRequestComplete

在这里插入图片描述

5.1 CircuitBreaker.State

CircuitBreaker.State 枚举可知,断路器共有三种状态:

  • OPEN 开启状态
  • HALF_OPEN 半开启状态
  • CLOSED 关闭状态

根据书中的描述,我重新整理绘制了一下关于状态转换的图片:

在这里插入图片描述

断路器状态转换的具体方法都在抽象断路器 AbstractCircuitBreaker 中实现。

6、AbstractCircuitBreaker

关于抽象断路器的概述:

虽然不同熔断降级策略的熔断器实现逻辑不同,但差异只是阈值的判断不同或需要统计的指标数据不同,而是否放行请求只需要根据当前熔断器的状态判断,因此,Sentinel为不同熔断降级策略的熔断器提供了一个统一的抽象类——AbstractCircuitBreaker。

除了实现接口中的方法,抽象断路器定义了断路器状态转换的方法。

在这里插入图片描述

需要注意的是,断路器状态无法直接从开启状态到关闭状态,因此有四个状态转换方法:

  • fromCloseToOpen 从关闭到开启
  • fromHalfOpenToOpen 从半开启到开启
  • fromHalfOpenToClose 从半开启到关闭
  • fromOpenToHalfOpen 从开启到半开启

6.1、AbstractCircuitBreaker#fromCloseToOpen

在这里插入图片描述

• 方法参数为触发值,即达到阈值时触发熔断器开启的当前值。
• 方法可实现开启熔断器,更新下一次允许将熔断器关闭的时间,并通知状态改变观察者。

6.2、AbstractCircuitBreaker#fromHalfOpenToOpen

在这里插入图片描述

• 方法参数为触发值,即达到阈值时触发熔断器开启的当前值。
• 方法可实现开启熔断器,更新下一次允许将熔断器关闭的时间,并通知状态改变观察者。

6.3、AbstractCircuitBreaker#fromHalfOpenToClose

在这里插入图片描述

该方法可实现关闭熔断器并重置滑动窗口,重新统计熔断指标数据,最后通知状态改变观察者。其中调用的resetStat方法是一个抽象方法,由子类实现,用于重置滑动窗口。

6.4、AbstractCircuitBreaker#fromOpenToHalfOpen

在这里插入图片描述

• 方法参数为调用链上下文。
• 方法可实现将熔断器从 OPEN 状态变为 HALF_OPEN 状态,先通知状态改变观察者,再从 Context 实例中获取当前资源的 Entry 实例,向 Entry 实例注册一个 exit 回调处理器。该处理器在 Entry 实例的 exit 方法被调用时回调。
• exit 回调处理器实现:如果当前请求被拒绝(不仅包括熔断器拒绝的,也包括限流、系统自适应等拒绝的),将熔断器从 HALF_OPEN 状态变为 OPEN 状态。

在该方法中,提出并解答了这个问题:

思考:为什么要在fromOpenToHalfOpen方法中注册exit回调处理器?

在这里插入图片描述

在这里插入图片描述

7、CircuitBreakerStrategy

在讲具体的断路器前,先来看看熔断策略。

在这里插入图片描述

在这里插入图片描述

三种熔断策略,对应两种不同的断路器,下面来看看具体的实现。

8、ExceptionCircuitBreaker

异常熔断器用于实现ERROR_RATIO、ERROR_COUNT这两种熔断降级策略,因此异常熔断器关心的是异常指标数据。

ExceptionCircuitBreaker#onRequestComplete
在这里插入图片描述

ExceptionCircuitBreaker#handleStateChangeWhenThresholdExceeded
在这里插入图片描述

该方法的主要逻辑(对应图中的说明):

  1. 断路器开启状态,直接返回
  2. 断路器半开启状态:
    • 如果执行没有异常,关闭断路器
    • 如果执行有异常,打开断路器
  3. 计算请求异常数以及请求总数
  4. 如果总数 < 最小请求数,直接返回
  5. 如果降级策略为异常比例,则计算当前异常比例值
  6. 判断是否超过设定阈值,如果是则打开断路器

达到阈值后打开断路器的方法也是在抽象断路器中定义的:

AbstractCircuitBreaker#transformToOpen
在这里插入图片描述

9、ResponseTimeCircuitBreaker

慢请求熔断器用于实现SLOW_REQUEST_RATIO熔断策略,因此慢请求熔断器关心的是耗时指标数据。

ResponseTimeCircuitBreaker#onRequestComplete
在这里插入图片描述

ResponseTimeCircuitBreaker#handleStateChangeWhenThresholdExceeded
在这里插入图片描述

该方法的主要逻辑(对应图中的说明):

  1. 断路器开启状态,直接返回
  2. 断路器半开启状态:
    • 如果当前请求是慢请求(RT 大于最大允许值),打开断路器
    • 如果当前请求不是慢请求,关闭断路器
  3. 计算慢请求数以及请求总数
  4. 如果总数 < 最小请求数,直接返回
  5. 计算当前慢请求比例值
  6. 判断当前慢请求比例值是否超过设定阈值,如果是则打开断路器
  7. 判断当前慢请求比例是否等于设定阈值且设定阈值等于慢请求比例最大值,如果是则打开断路器

10、CircuitBreakerStateChangeObserver

在这里插入图片描述

AbstractCircuitBreaker#notifyObservers
在这里插入图片描述

(完)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
RuoYi-plus是一个基于RuoYi升级的springcloud版本管理系统。软件由SMP多商户后台管理系统+API后端接口组成,项目支持cms内容管理和商城业务,提供单机版服务、微服务体系双向选择,微服务集成分布式事务解决方案seata,框架基于SpringBoot2.x,springcloudG版本。 RuoYi-plus项目介绍 项目核心: 多商户权限系统+商城平台+CMS内容管理+微服务API系统 架构技术: 基于SpringBoot2.x, springcloud G版本eureka、hystrix、feign、config、gateway微服务架构体系的全新版本,集成分布式事务解决方案seata,集成redis、quartz、tk.mybatis、lombok、各种设计模式等。 项目优势: 架构更清晰、技术更前沿、代码更整洁、页面更美观、学习商用均可。可用于OA系统、 CRM系统、 PDM系统等二次开发,微服务架构学习,非常适用于公司管理平台旧版本升级、新平台搭建快速整合、同时提供API接口服务(供APP、微端、h5等使用)。 RuoYi-plus内置功能 管理平台基础功能 1、用户管理:用户是系统操作者,该功能主要完成系统用户配置。 2、部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。 3、岗位管理:配置系统用户所属担任职务。 4、菜单管理:配置系统菜单,操作权限,按钮权限标识等。 5、角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。 6、字典管理:对系统中经常使用的一些较为固定的数据进行维护。 7、参数管理:对系统动态配置常用参数。 8、通知公告:系统通知公告信息发布维护。 9、操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。 10、登录日志:系统登录日志记录查询包含登录异常。 11、在线用户:当前系统中活跃用户状态监控。 12、定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。 13、代码生成:前后端代码的生成(java、html、xml、sql)支持CRUD下载 。 14、系统接口:根据业务代码自动生成相关的api接口文档。 15、服务监控:监视当前系统CPU、内存、磁盘、堆栈等相关信息。 16、在线构建器:拖动表单元素生成相应的HTML代码。 17、连接池监视:监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。 商城业务基础功能 1、商户管理:多商户系统核心业务,商户管理对应权限数据。 2、类别管理:商品类别配置,为商品区分类别。 3、商品管理:每个商户下的商品信息。 CMS内容基础功能 1、文章类别管理:文章列表信息,为文章区分不同类别。 2、文章信息管理:文章具体信息,直接生成文章html页面。 3、素材类别管理:为素材提供类别以区分不同业务的素材图片/视频。 4、素材信息管理:文章信息的素材图片管理。 API接口基础功能 1、业务模块:接收网关gateWay转发请求,api微服务结构处理具体业务,解决分布式事务。 2、订单模块:订单相关业务处理。 3、商品模块:商品相关业务处理。 商用须知 本项目遵循MIT协议,无需授权,留言备注公司信息即可。 演示地址账号:tecom  密码:123456

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

MichelleChung

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

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

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

打赏作者

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

抵扣说明:

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

余额充值