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

文章目录

    • 前言
    • 参考目录
    • 版本说明
    • 学习笔记
      • 1、包结构
      • 2、`DegradeSlot`
      • 3、`DegradeRule`
      • 4、`DegradeRuleManager`
      • 5、`CircuitBreaker`
      • 5.1 `CircuitBreaker.State`
      • 6、`AbstractCircuitBreaker`
      • 6.1、`AbstractCircuitBreaker#fromCloseToOpen`
      • 6.2、`AbstractCircuitBreaker#fromHalfOpenToOpen`
      • 6.3、`AbstractCircuitBreaker#fromHalfOpenToClose`
      • 6.4、`AbstractCircuitBreaker#fromOpenToHalfOpen`
      • 7、`CircuitBreakerStrategy`
      • 8、`ExceptionCircuitBreaker`
      • 9、`ResponseTimeCircuitBreaker`
      • 10、`CircuitBreakerStateChangeObserver`

前言

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

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

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

参考目录

  • Sentinel 官方文档
  • 熔断降级
  • 《实战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
在这里插入图片描述

(完)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/19768.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Edge浏览器无法展示Stable Diffusion Control Net插件

Edge浏览器无法展示Stable Diffusion Control Net插件 最近在学习Stable Diffusion&#xff0c;需要使用到Control Net插件&#xff0c;结果通过各种方式安装成功插件后&#xff0c;浏览器页面没有展示ControlNet相关页面&#xff0c;最终换到Chorme浏览器后正常&#xff0c;猜…

安全测试方法介绍(上)静态源代码审查

软件开发完成之后&#xff0c;我们需要进行安全验证&#xff0c;验证我们的软件是不是符合安全要求。软件安全测试主要有以下几个方面&#xff1a;确定软件的安全特性实现是否与预期设计一致的过程&#xff1b;有关验证软件安全等级和识别潜在安全缺陷的过程&#xff1b;查找软…

云服务器下WordPress发送邮件的设置

WordPress的邮件功能很强大&#xff0c;可以实现用户密码以往后自助恢复等问题。 WordPress默认是使用php发邮件的&#xff0c;php需要配置好smtp&#xff08;端口25&#xff09;服务器及密码。这种方式不直观&#xff0c;因此一般都用smtp插件&#xff0c;常用的插件是WP Mai…

6.2.6 网络基本服务----电子邮件系统(E-mail)

6.2.6 网络基本服务----电子邮件系统&#xff08;E-mail&#xff09; 电子邮件系统是因特网上使用的最多且最受用户欢迎的一种应用 电子邮件系统包括用户代理和邮件服务器&#xff0c;提供收发邮件、邮件传送服务&#xff0c;邮件被传送到收信人邮件服务器的收信人信箱中&…

使用STM32实现 蓝牙插座

硬件介绍 蓝牙模块HC-01&#xff0c;其实之前就用过&#xff0c;使用起来非常简单 继电器模块&#xff0c; (VCC 3.3V)当左侧IN输入低电平时&#xff0c;右侧的ON 和 COM会导通&#xff0c;左上的绿灯会亮&#xff0c;此处充当插座的角色 项目需求 通过蓝牙的串口发送open打开…

8086变址寄存器和字符串拷贝程序学习

在此文用到了si和di寄存器&#xff1b; 8086汇编语言显示带颜色的字符串程序学习 - 使用emu8086_bcbobo21cn的博客-CSDN博客 下面单独来学习si和di寄存器&#xff1b; SI和DI是8086CPU中和BX功能相近的寄存器&#xff1b; 区别:SI和DI不能够分成两个8位寄存器来使用&#xff…

docker安装的mysql更改全文检索分词配置

这里使用的是mysql8.0&#xff0c;默认使用ngram分词 这里是已经将文件从容器中挂载出来了&#xff0c;没挂载出来要去容器内部更改my.cnf文件并重启mysql容器 步骤 一、查看mysql的分词大小 show variables like %token%;ngram_token_size这里默认是2我已经改为1了 这个值…

本地运行Segment Anything

按原项目GitHub - facebookresearch/segment-anything: The repository provides code for running inference with the SegmentAnything Model (SAM), links for downloading the trained model checkpoints, and example notebooks that show how to use the model.步骤 Ins…

【C++初阶】C++入门——引用

文章目录 一、引用的概念二、共用同一块空间验证三、引用的特性3.1 引用在定义时必须初始化3.2 一个变量可以有多个引用3.3 引用不能改变 四、引用的使用场景4.1 做参数4.2 做返回值 五、传值、传引用效率比较六、常引用6.1 权限放大——不被允许6.2 权限平移6.3 权限缩小6.4 赋…

springboot+mysql财务管理系统

财务管理系统的开发运用java技术、springboot框架&#xff0c;MIS的总体思想&#xff0c;以及Mysql等技术的支持下共同完成了该系统的开发&#xff0c;实现了财务管理的信息化&#xff0c;使员工体验到更优秀的财务管理&#xff0c;管理员管理操作将更加方便&#xff0c;实现目…

Mysql——》数据目录

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

【雕爷学编程】Arduino动手做(138)---64位WS2812点阵屏模块3

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…