【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.mzph.cn/news/185.shtml

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

相关文章

支付宝接入

支付宝接入 python-alipay-sdk pycryptodome一、电脑网站支付 1.1 获取支付宝密钥 沙箱网址 1.APPID 2.应用私钥 3.支付宝公钥1.2 存放密钥 在与 settings.py 的同级目录下创建 pem 文件夹pem 文件夹下创建 app_private_key.pem 和 alipay_public_key.pem app_private_key…

神经网络初谈

文章目录 简介神经网络的发展历程神经网络的初生神经网络的第一次折戟神经网络的新生&#xff0c;Hinton携BP算法登上历史舞台命途多舛&#xff0c;神经网络的第二次寒冬神经网络的重生&#xff0c;黄袍加身&#xff0c;一步封神神经网络的未来&#xff0c;众说纷纭其他时间点 …

STM32 Proteus仿真LCD12864俄罗斯方块-FZ0063

STM32 Proteus仿真LCD12864俄罗斯方块-FZ0063 Proteus仿真小实验&#xff1a; STM32 Proteus仿真LCD12864俄罗斯方块-FZ0063 功能&#xff1a; 硬件组成&#xff1a;STM32F103R6单片机 LCD12864显示器多个按键 1.标准俄罗斯方块经典游戏玩法&#xff0c;带计时&#xff0c…

Kong 服务和路由的添加

管理服务 这里参考DB-less-Mode&#xff0c;因为使用的是yaml配置文件的形式&#xff0c;所以所有的相关配置只需要往初始化的kong.yml文件中添加就可以了&#xff0c;就像nginx的配置文件 DB-less-Mode 创建服务 vim /etc/kong/kong.yml services: - name: my-service #…

MySQL---表数据高效率查询(简述)

目录 前言 一、聚合查询 &#x1f496;聚合函数 &#x1f496;GROUP BY子句 &#x1f496;HAVING 二、联合查询 &#x1f496;内连接 &#x1f496;外连接 &#x1f496;自连接 &#x1f496;子查询 &#x1f496;合并查询 &#x1f381;博主介绍&#xff1a;博客名…

Idea 修改默认 Maven 为自己的

每次我们打开新项目时,都要去配置一遍 maven,很麻烦,其实可以去修改 idea 里面默认的 maven 配置,这样后面不管是打开新项目还是老项目,就都是用的自己的 maven 了. 1.文件->新项目设置->新项目的设置 File->Other Settings -> Settings for New Project 2.然后和…

git下载源码及环境搭建之数据库(二)

学习目标&#xff1a; 数据库 新项目使用 数据库文件 的配置 及相关属性的设置 步骤&#xff1a; 数据库 下图所示为开发时所用数据库 第一步&#xff1a;新建一个数据库 注意&#xff1a; 字符集与排序规则我们应该选择utf-8 相关 选中新创建的表&#xff0c;点击备份—还…

MySQL单表查询练习题

目录 第一题 第二题 第三题 第一题 1.创建数据表pet&#xff0c;并对表进行插入、更新与删除操作&#xff0c;pet表结构如表8.3所示。 (1&#xff09;首先创建数据表pet&#xff0c;使用不同的方法将表8.4中的记录插入到pet表中。 mysql> create table pet( name varchar(…

centos7.9php8swoole5swoft2环境安装遇到确实redis扩展的解决办法

1、环境介绍 运行系统&#xff1a;centos7.9 php版本&#xff1a;php8.0.29 swoole版本&#xff1a;swoole5 swoft版本&#xff1a;swoft2.02、遇到的问题 The requested PHP extension ext-redis * is missing from your system. Install or enable PHPs redis extension。这…

python爬虫哪个库用的最多

目录 常用的python爬虫库有哪些 1. Requests&#xff1a; 2. BeautifulSoup&#xff1a; 3. Scrapy&#xff1a; 4. Selenium&#xff1a; 5. Scrapy-Redis&#xff1a; 哪个爬虫库用的最多 Scrapy示例代码 总结 常用的python爬虫库有哪些 Python拥有许多常用的爬虫库…

Java反射与“整活--(IOC容器)”

文章目录 前言反射什么是反射基本操作获取类对象获取类属性获取类方法方法的执行对构造方法的操作 注解定义获取注解 整活&#xff08;IOC容器&#xff09;项目结构IOC/DI流程ApplicationContextBeanDefinitionReaderBeanDefinitionBeanWrappergetBean&#xff08;&#xff09;…

Django_admin数据管理后台

目录 一、基础操作 二、自定义后台操作数据行为 源码等资料获取方法 admin数据管理后台是django内置的一个后台管理界面&#xff0c;能查看已注册模型类的数据结构&#xff0c;以及对数据的增删改。 一、基础操作 1.1 检查项目目录下的urls.py有没有如下配置 1.2 创建djan…

技术讨论:我心中TOP1的编程语言

欢迎关注博主 六月暴雪飞梨花 或加入【六月暴雪飞梨花】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术…

Flutter——最详细(NavigationBar)使用教程

NavigationBar简介 Material 3 导航栏组件! 导航栏提供了一种持久且便捷的方式来在应用程序的主要目的地之间进行切换。 使用场景&#xff1a; 底部菜单栏模块 属性作用onDestinationSelected选择索引回调监听器selectedIndex目前选定目的地的索引destinations存放菜单按钮back…

七大排序算法——冒泡排序,通俗易懂的思路讲解与图解(完整Java代码)

文章目录 一、排序的概念排序的概念排序的稳定性七大排序算法 二、冒泡排序核心思想代码实现 三、性能分析四、七大排序算法 一、排序的概念 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或…

C++之工厂模式

目录 一、为什么要使用工厂模式 优点 缺点 二、简单工厂&#xff08;Simple Factory&#xff09; 好处&#xff1a; 不足&#xff1a; 三、工厂方法&#xff1a; 好处&#xff1a; 不足&#xff1a; 四、抽象工厂&#xff08;Abstract Factory&#xff09; 一、为什…

【HCIA】10.VLAN间通信

VLAN间通信的解决方法 使用路由器的物理接口 路由器三层接口作为网关&#xff0c;转发本网段前往其它网段的流量。路由器三层接口无法处理携带VLAN Tag的数据帧&#xff0c;因此交换机上联路由器的接口需配置为Access。路由器的一个物理接口作为一个VLAN的网关&#xff0c;因此…

Django_re_path_使用正则匹配url

与path定义的路由相比&#xff0c;re_path 定义的路由可以使用正则表达式匹配url。 需要注意的是&#xff1a; 如果未定义匹配结果的变量名&#xff0c;匹配的结果默认传入视图的第2个形参。如果定义了匹配结果的变量名&#xff0c;匹配的结果会传给视图的同名字段&#xff0…

【GitOps系列】从零上手GitOps

文章目录 GitOps 介绍如何将业务代码构建为容器镜像&#xff1f;如何将容器镜像部署到K8s&#xff1f;K8s如何实现自动扩容和自愈&#xff1f;1.传统的扩容和自愈2.k8s自愈机制3.k8s弹性扩容 如何借助GitOps实现应用秒级自动发布和回滚&#xff1f;1.传统 K8s 应用发布流程2.从…

【Arduino小车实践】陀螺仪的使用

一、MPU6050简介 MPU6050是一款陀螺仪模块&#xff0c;可以测量X、Y、Z三轴的角速度和加速度&#xff0c;还带有温度传感器和数字运动处理器(DMP)。 二、学习步骤 1. I2C协议 MPU6050是通过I2C协议进行驱动的&#xff0c;配置寄存器和获取数据都需要通过I2C协议去实现开发板与…