Spring中的Sentinel熔断降级详解

 更新时间:2023年09月12日 10:13:50   作者:小钟要学习!!!  
这篇文章主要介绍了Spring中的Sentinel熔断降级详解,熔断降级是一种保护系统稳定性和可用性的机制,旨在防止故障的扩散和蔓延,提高用户体验和信任度,需要的朋友可以参考下

1、介绍

Sentinel 提供以下几种熔断策略:

  • 慢调用比例 (SLOW_REQUEST_RATIO):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。
  • 异常比例 (ERROR_RATIO):当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
  • 异常数 (ERROR_COUNT):当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。

注意异常降级仅针对业务异常,对 Sentinel 限流降级本身的异常( BlockException )不生效。为了统计异常比例或异常数,需要通过 Tracer.trace(ex) 记录业务异常。示例:

进一步说明

Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。

当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出 DegradeException)。

熔断有三种状态,分别为OPEN、HALF_OPEN、CLOSED Hystrix复习

半开的状态系统自动去检测是否请求有异常,没有异常就关闭断路器恢复使用,有异常则继续打开断路器不可用。具体可以参考Hystrix

2、降级策略实战

2.1、慢调用比例策列

业务的响应时长(RT)大于指定时长的请求认定为慢调用。在指定时间内,如果请求数量超过了设定的最小数量,慢调用比例大于设定的阈值,则触发熔断

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6G6COi5L-1669331553551)(image/197、新增熔断规则.png)]

属性描述

属性描述
最大RT需要设置的阈值,超过该值则为慢调用
比例阈值慢调用所占有的调用比例,范围[0.0,10.]
熔断时长在这段时间内发生熔断、拒绝所有请求,经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态)
最小请求数即允许通过的最小请求数,在该数量内不发生熔断

执行逻辑

上面慢调用的执行流程解读:

一个接口请求响应的速度大于【最大RT(200ms),业务代码设置1秒】,统计最近10000毫秒内的所有请求,如果请求数量超过10次,并且慢调用比例不低于0.4,则触发熔断,熔断时长为【自定义5秒】,然后进入half-open状态,放行一次请求做测试

  • 熔断(OPEN):请求数大于最小请求数并且慢调用的比率大于比例阈值则发生熔断,熔断时长为用户自定义设置。
  • 探测(HALFOPEN):当熔断过了定义的熔断时长,状态由熔断(OPEN)变为探测(HALFOPEN)。

注意Sentinel默认统计的RT上限是4900ms,超出此阈值的都会算作4900ms,若需要变更此上限可以通过启动配置项-Dcsp.sentinel.statistic.max.rt=xxx来配置

添加控制器

请求线程睡眠一秒方便后面的压测测试

@GetMapping("/testD")
public String testD()
{
    //暂停几秒钟线程
    try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }
    log.info("testD 测试RT");
    return "------testD";
}

JMeter压测

  • 先创建一个组(1秒发生10个请求,并且循环进行,只有点击停止的时候才会停止)
  • 再创建一个请求

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z986ir0f-1669331553552)(image/198、启动测试.png)]

在上面的测试中在通过访问://localhost:8401/testD发现会出现如下错误,因为被熔断了,当停止压测再请求又可以了

Blocked by Sentinel (flow limiting)

2.2、异常比例

统计指定时间内的调用,如果调用次数超过指定请求数,并且出现异常的比例达到设定的比例阈值(或超过指定异常数),则触发熔断

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ytpvB6bZ-1669331553552)(image/199、异常比例.png)]

解读

统计最近1000ms内的所有请求,如果请求量超过5次,并且异常比例不低于0.4,则触发熔断,熔断时长为5秒。然后进入half-open状态,放行异常请求做测试

修改业务代码报错

@GetMapping("/testD")
public String testD()
{
    //暂停几秒钟线程
    //try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }
    // log.info("testD 测试RT");
    int a = 1/0;
    log.info("testD 异常比例数触发熔断");
    return "------testD";
}

启动测试刷新后台报出异常,然后进入熔断输出内容

Blocked by Sentinel (flow limiting)

2.3、异常数

异常数与异常比例是一样的,只是将异常比例阈值指定为具体的异常数就会触发熔断

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bhcWofrX-1669331553553)(image/200、异常数.png)]

在1秒中内的请求数,有2次都是异常的就会触发5秒熔断

到此这篇关于Spring中的Sentinel熔断降级详解的文章就介绍到这了,更多相关Sentinel熔断降级内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Boot 调用外部接口的几种方式

    Spring Boot 调用外部接口的几种方式

    在微服务架构中,服务间的调用是不可或缺的环节,本文主要介绍了Spring Boot调用外部接口的几种方式,具有一定的参考价值,感兴趣的可以了解一下
    2024-05-05
  • Java生成CSV文件实例详解

    Java生成CSV文件实例详解

    这篇文章主要介绍了Java生成CSV文件的方法,很实用的功能,需要的朋友可以参考下
    2014-07-07
  • SpringBoot底层注解超详细介绍

    SpringBoot底层注解超详细介绍

    这篇文章主要介绍了SpringBoot底层注解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-09-09
  • 原生java代码实现码云第三方验证登录的示例代码

    原生java代码实现码云第三方验证登录的示例代码

    这篇文章主要介绍了原生java代码实现码云第三方验证登录的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Maven项目如何在pom文件中引入lib下的第三方jar包并打包进去

    Maven项目如何在pom文件中引入lib下的第三方jar包并打包进去

    在使用Maven进行项目开发时,引入第三方私有的Jar包可能会遇到问题,一种常见的解决方案是将Jar包添加到项目的lib目录,并通过IDE进行配置,但这需要每个开发者单独操作,效率低下,更好的方法是通过Maven的pom.xml文件管理这些Jar包
    2024-09-09
  • Spring中DAO被循环调用的时候数据不实时更新的解决方法

    Spring中DAO被循环调用的时候数据不实时更新的解决方法

    这篇文章主要介绍了Spring中DAO被循环调用的时候数据不实时更新的解决方法,需要的朋友可以参考下
    2014-08-08
  • Spring Boot之内嵌tomcat版本升级操作示例

    Spring Boot之内嵌tomcat版本升级操作示例

    这篇文章主要为大家介绍了Spring Boot之内嵌tomcat版本升级操作示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • springboot项目打docker镜像实例(入门级)

    springboot项目打docker镜像实例(入门级)

    最近做个项目,我们想把自己的程序打包成镜像,并运行在docker容器中,本文主要介绍了springboot项目打docker镜像实例,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • Nacos配合SpringBoot实现动态线程池的基本步骤

    Nacos配合SpringBoot实现动态线程池的基本步骤

    使用Nacos配合Spring Boot实现动态线程池,可以让你的应用动态地调整线程池参数而无需重启,这对于需要高度可配置且需要适应不同负载情况的应用来说非常有用,本文给大家介绍实现动态线程池的基本步骤,需要的朋友可以参考下
    2024-02-02
  • Java Springboot之Spring家族的技术体系

    Java Springboot之Spring家族的技术体系

    今天带大家来学习Spring家族的技术体系,文中有非常详细的图文介绍及代码示例,对正在学习java的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05

最新评论