熔断策略配置实践

除流量控制外,对调用链路中不稳定的资源进行降级熔断是保障系统高可用的重要措施。希望本节的内容能够让读者学会使用 Sentinel 的熔断策略处理各种调用异常。

熔断策略简介

本节主要介绍熔断策略。在做熔断配置时,重要的属性及说明见表 11-3。

image 2025 04 18 13 05 11 437
Figure 1. 表11-3 熔断配置时重要的属性及说明

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 状态),若接下来的一个请求成功完成(没有错误),则结束熔断,否则再次被熔断。

这些知识点并不复杂,与配置限流规则类似。熔断策略的配置过程可以简单地理解为熔断策略针对哪个资源、熔断策略用哪种、熔断策略的生效条件是什么,以及熔断多长时间。

比如,对查询商品详情 “/goods/{goodsId}” 这个资源做熔断,先要配置熔断策略(grade),如异常比例,然后配置异常比例的阈值(count)、最小请求数(minRequestAmount)和统计时长(statIntervalMs),如配置 count=0.1、minRequestAmount=10、statIntervalMs=4000,即若 4 秒的时间区间内请求数量达到 10,并且这 10 个请求中的异常比例达到 0.1,则该资源触发熔断。熔断多长时间?此时就需要配置熔断时长(timeWindow),如 timeWindow=5,表示该资源会被熔断5秒。

熔断策略针对哪个资源?
——对 “/goods/{goodsId}” 资源的请求。
熔断策略用哪种?
——异常比例。
熔断策略的生效条件是什么?
——4秒的时间区间内请求数量达到 10,并且这 10 个请求中的异常比例达到 0.1,则该资源触发熔断。
熔断多长时间?
——5秒。

异常熔断的基础编码

本节代码是在源码 spring-cloud-alibaba-sentinel-circuit-breaking-demo 项目的基础上修改的,具体步骤如下。

  1. 修改项目名称。

    修改项目名称为 spring-cloud-alibaba-sentinel-circuit-breaking-demo,之后把各个模块中 pom.xml 文件的 artifactId 修改为 spring-cloud-alibaba-sentinel-circuit-breaking-demo

  2. 修改源码,模拟超时和异常,代码如下:

    @GetMapping("/goods/{goodsId}")
    public String goodsDetail(@PathVariable("goodsId") int goodsId) {
        // 模拟超时
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    
        // 模拟异常
        // int i = 13 / 0;
    
        // 根据id查询商品并返回给调用端
        if (goodsId < 1 || goodsId > 100000) {
            return "查询商品为空,当前服务的端口号为:" + applicationServerPort;
        }
        String goodsName = "商品" + goodsId;
        // 返回信息给调用端
        return goodsName + ",当前服务的端口号为:" + applicationServerPort;
    }

    慢调用比例、异常比例、异常数这三种熔断策略的判断指标主要是根据资源的响应时长和异常比例/数量来决定的,所以测试代码主要模拟超时和代码中出现异常的情况,用于后续配置和演示 Sentinel 熔断功能。

接下来,启动 goods-service-demo 项目(需保证 Nacos ServerSentinel 控制台已经正常运行)。

启动后,登录 Sentinel 控制台,打开浏览器并在地址栏中输入如下地址:

http://localhost:8191/goods/2025

这会向 goods-service 发起请求,该服务实例的数据都会被 Sentinel 客户端上报。发起请求后,等待几秒就可以在 Sentinel 控制台页面看到 newbee-cloud-goods-service 微服务了,如图 11-24 所示。

image 2025 04 18 13 11 03 118
Figure 2. 图11-24 goods-service 正常连接至 Sentinel 后的呈现效果

熔断策略配置及效果演示

下面结合实际的配置页面详细讲解这三种熔断策略的配置和最终呈现的效果。

  1. 慢调用比例策略配置及演示

    进入 Sentinel 控制台,在左侧导航栏中能够看到所有已经接入 Sentinel 的应用。单击 newbee-cloud-goods-service 下的 “簇点链路” 就能够看到当前应用下的所有资源,如图 11-25 所示。

    image 2025 04 18 13 11 52 324
    Figure 3. 图11-25 查看当前应用下的所有资源

    可以在每个资源的列表栏中直接单击 “熔断” 按钮来给资源添加熔断。

    另一种常用的方式是在熔断规则页面进行操作。单击左侧菜单栏中的 “熔断规则”,打开熔断规则页面,单击右上角的 “新增熔断规则” 按钮,之后会弹出 “新增熔断规则” 对话框,把相关的属性添加进去,单击 “新增” 按钮就能够完成熔断规则的添加,过程如图 11-26 所示。

    在这里给 “/goods/{goodsId}” 这个资源添加了一条熔断规则。熔断策略为慢调用比例,最大的响应时间为 900 毫秒,慢调用比例的阈值为 0.1,最小请求数为 10,统计时长为 5 秒、熔断时长为 5 秒,即若 5 秒的时间区间内请求数量达到 10,并且这 10 个请求中最大响应时间超过了 900 毫秒的请求占比达到 0.1,则该资源会触发熔断,熔断时长为 5 秒。

    image 2025 04 18 13 12 56 772
    Figure 4. 图11-26 在熔断规则页面单击 “新增熔断规则” 按钮新增慢调用比例的熔断策略

    规则添加成功后,就可以打开浏览器或其他工具发起请求,对 Sentinel 的熔断功能进行测试。在浏览器地址栏中输入如下地址:

    http://localhost:8191/goods/2025

    由于代码里增加了休眠 1 秒的代码,因此所有请求都是超时请求。一旦达到熔断条件,接口响应页面效果如图 11-27 所示。

    image 2025 04 18 13 14 45 817
    Figure 5. 图11-27 达到慢调用比例熔断条件后的接口被限流

    此时的资源实时监控图如图 11-28 所示。

    前面几个请求虽然是慢请求,但是由于没达到最小请求数量,因此未触发熔断,而一旦达到最小请求数量 10 之后,就正式进入熔断状态了,熔断状态下的请求都会被拒绝。

    当然,细心的读者可能会发现,在熔断期内也有1~2条请求被通过了,是因为熔断器有一个探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用RT,则结束熔断;若大于设置的慢调用 RT,则再次被熔断。Sentinel 会尝试放开熔断,让部分请求顺利通过,如果该请求一切正常未达到慢调用的条件,就说明可以放开了,而如果这个请求依然是慢请求,就会继续熔断,不会再去判断最小请求数量和统计时间区间了。

    image 2025 04 18 13 16 09 042
    Figure 6. 图11-28 达到慢调用比例熔断条件后的资源实时监控图
  2. 异常比例策略配置及演示

    接下来演示异常比例策略。这时需要修改一下代码,先把模拟超时的代码注释掉,然后把模拟异常的代码注释放开,再重启 goods-service-demo 项目,在 Sentinel 控制台中接收到上报信息后,重新添加一条熔断规则,规则细节如图 11-29 所示。

    image 2025 04 18 13 17 14 781
    Figure 7. 图11-29 新增异常比例的熔断策略示例

    在这里给 “/goods/{goodsId}” 这个资源添加了一条熔断规则。熔断策略为异常比例,异常的比例阈值为 0.2,最小请求数为 10,统计时长为 5000ms,熔断时长为 5s,即若 5000ms 的时间区间内请求数量达到10,并且这 10 个请求中的异常比例达到 0.2,则该资源会触发熔断,熔断时长为 5s。

    规则添加成功后,就可以打开浏览器或其他工具发起请求,对 Sentinel 的熔断功能进行测试。在浏览器地址栏中输入如下地址:

    http://localhost:8191/goods/2025

    由于代码里增加了发生异常的代码,因此所有请求都是异常请求。一旦达到熔断条件,就会看到 “Blocked by Sentinel(flow limiting)” 的提示信息。

    此时的资源实时监控图如图 11-30 所示。

    image 2025 04 18 13 18 29 346
    Figure 8. 图11-30 达到异常比例熔断条件后的资源实时监控图

    前面几个请求虽然是异常请求,但是由于没达到最小请求数量,因此未触发熔断,而一旦达到最小请求数量 10 且异常比例超过 0.2 之后,就正式进入熔断状态了,熔断状态下的请求都会被拒绝。

  3. 异常数策略配置及演示

    接下来演示异常数策略。在 Sentinel 控制台页面中重新添加一条熔断规则,规则细节如图 11-31 所示。

    在这里给 “/goods/{goodsId}” 这个资源添加了一条熔断规则。熔断策略为异常数,允许出现的最大异常数是1,最小请求数为4,统计时长为 3000ms,熔断时长为 5s,即若 3000ms 的时间区间内请求数量达到 4,并且这 4 个请求中有 1 个请求是异常请求,则该资源会触发熔断,熔断时长为 5s。该策略与异常比例策略非常类似,就不再赘述了。

    image 2025 04 18 13 19 16 314
    Figure 9. 图11-31 新增异常数的熔断策略示例