从零到实战:Spring Cloud Alibaba 项目集成 Sentinel,教你限流熔断一把过

🌳多平台技术论坛专家博主,全网11W+粉丝

✈️公众号 | 乡下小哥编程 。回复 Java全套视频教程 或 前端全套视频教程 即可获取 300G+ 教程资料及项目实战案例

⭐职场开发经验干货分享、开源项目源码分享

前言

为什么要用 Sentinel?

在微服务中,一个接口流量突增或下游服务异常,可能导致雪崩。Sentinel 提供:限流:按 QPS、线程数、调用关系控制。熔断:下游服务异常时,自动快速失败。降级:服务慢或不稳定时,自动返回默认结果。实时监控:配合 Dashboard 可动态配置规则。

Sentinel主要在微服务中做 限流、熔断、降级、系统保护,一般和Spring Cloud、Dubbo等结合使用。

详细文章地址:https://mp.weixin.qq.com/s/ECUGv6GKkWlcn8H99UfxJA

下载使用

首先下载,地址:https://github.com/alibaba/Sentinel/releases

注意:jdk1.8环境/8080端口不能被占用

启动命令:java -jar sentinel-dashboard-1.8.8.jar

访问地址:http://localhost:8080/

账号密码:sentinel/sentinel

到这里, Sentinel就安装成功了,可能在界面上没有看到任何东西,并没有发现监控的服务,这是因为还没有启动项目,而Sentinel。本身采用的是懒加载模式,所以需要先去访问服务对应的接口,Sentinel才会进行工作。

在启动相关服务后,访问相关接口就可以看到。这里使用Apifox模拟对一个接口的多次请求,查看相关检测情况。

模拟限流

通过 Sentinel Dashboard 配置规则

这是最常用的方式,因为可以动态调整参数。

步骤

  1. 启动 Sentinel Dashboard(假设端口 8080)。

  2. 浏览器访问 http://localhost:8080,找到你的服务。

  3. 点击 新增流控规则:

    • 资源名:getProductPage(必须和       @SentinelResource(value=...) 一致)。

    • 限流模式:QPS

    • 阈值:2(比如 2 QPS,方便测试)。

  4. 保存。

/**
   * 
查询+条件过滤
   */
  
@RequestMapping(value = "/product/getProductPage",   method = RequestMethod.POST)
  @SentinelResource(value = "getProductPage", blockHandler = "handleBlock")
  public Result getProductPage(@RequestBody ProductQueryRequest   productQueryRequest) {
      return productService.getProductPage(productQueryRequest);
  }
 
  /**
   * 
当触发限流或熔断时,会走这里
   */
  
public Result handleBlock(BlockException e)   {
      return Result.error().message(BaseResultCode.INTERNAL_SERVER_ERROR.getMessage());
  }

点击 新增流控规则,这里的资源名称和代码里边的保持一致(开头部分有提及)

同样的方式使用Apifox来模拟多个线程来请求接口,当接口的QPS超过2个后,则会触发限流,走指定的方法 handleBlock()

测试效果

可以查看相关接口请求的结果来查看,当进行限流的时候会走指定的方法。

模拟熔断

1. 熔断的基本概念

  • 限流(FlowRule):控制流量,比如 QPS 超过 10 直接拒绝。

  • 熔断(DegradeRule):当接口响应时间过长,或者异常比例过高,就临时“拉闸”,后续请求直接快速失败(走 handleBlock()),避免拖垮系统。

Sentinel 提供三种熔断策略:

  1. 平均响应时间 (RT):某段时间内平均响应时间超过阈值(比如 1000ms),触发熔断。

  2. 异常比例:错误率超过阈值时熔断。

  3. 异常数:一定时间内错误数超过阈值时熔断。

这里我测试的是 RT(响应时间)熔断。

Sentinel 的三种熔断策略(详细介绍说明)

1. 慢调用比例 (Slow Request Ratio)

适用场景:接口本身不一定报错,但响应太慢(比如超时)也会拖垮系统。逻辑:

  • 在一个统计窗口(比如 10 秒)内,统计请求的平均响应时间(RT)。

  • 如果某次请求耗时 超过阈值(比如 1000ms),就算一次“慢调用”。

  • 计算慢调用占总请求的比例,如果超过配置的阈值(比如 50%),就触发熔断。

例子:

  • 统计窗口:10 秒

  • 响应时间阈值:1000ms

  • 慢调用比例阈值:50%

  • 在 10 秒内请求 10      次,其中 6 次响应时间 > 1000ms(60%),大于 50%,熔断。


2. 异常比例 (Exception Ratio)

适用场景:接口本身可能正常响应,也可能报错,重点看报错率。逻辑:

  • 在统计窗口内统计请求总数与异常数(抛出异常)。

  • 计算异常比例,如果超过配置的阈值(比如 50%),触发熔断。

例子:

  • 统计窗口:60 秒

  • 异常比例阈值:50%

  • 60 秒内调用 100 次,其中 60 次抛出异常(60%),熔断。


3. 异常数 (Exception Count)

适用场景:接口请求量比较小,用比例统计不敏感,用固定异常次数更直接。逻辑:

  • 在统计窗口内统计异常次数总和。

  • 如果超过设定阈值(比如 5 次),直接熔断,不管总请求数多少。

例子:

  • 统计窗口:60 秒

  • 异常数阈值:5

  • 60 秒内接口被调用 6 次,全部抛异常,熔断。

1. 最大 RT(响应时间阈值)

  • 英文名:maxRT,对应      Sentinel Dashboard 的“慢调用      RT 阈值”或“RT 阈值”。

  • 含义:判断一次请求是不是“慢调用”的标准。     当接口的响应时间 超过这个值(单位毫秒),这次请求就算作一次慢调用,用于慢调用比例策略。

  • 使用场景:

    • 只用于 慢调用比例策略。

    • 如果接口很快(比如几十毫秒),就调大;如果接口本身慢,就调小,避免一直判为慢调用。

例子:

  • 设置 maxRT=1000(1秒)。

  • 在 10 秒内请求 10      次,其中 6 次响应时间 > 1 秒。

  • 如果慢调用比例阈值是 50%,就会触发熔断。


2. 比例阈值 (Threshold / RatioThreshold)

这个是 异常比例触发熔断 的核心参数。

  • 含义:在某个统计窗口(统计时长)内,接口总请求数里有多少比例是异常的(抛异常),超过这个比例就触发熔断。

  • 取值:0.0 ~ 1.0(比如 0.2 就是 20%)。

例子:

  • 设置比例阈值:0.5(50%)

  • 统计时长:60秒

  • 在 60 秒内,接口被调用了 100 次,其中 60 次抛异常,异常比例 = 60% > 50%,就触发熔断。


3. 熔断时长(TimeWindow / 熔断持续时间)

  • 英文名:timeWindow。

  • 含义:接口触发熔断后,维持熔断状态的时间(单位秒)。

  • 效果:在这个时间内,接口的所有请求不会执行真实逻辑,而是直接走 handleBlock(),快速返回。

  • 结束后行为:进入 半开状态,Sentinel 会允许少量请求测试健康度:

    • 如果这些请求成功率/RT 正常,熔断恢复(Closed)。

    • 如果还是异常,再次熔断一轮。

例子:

  • 设置 timeWindow=10 秒。

  • 触发熔断后,10 秒内所有请求直接失败(快速返回)。

  • 10 秒后自动尝试恢复。


4. 最小请求数(MinRequestAmount / 请求阈值)

  • 英文名:minRequestAmount。

  • 含义:统计窗口期内,至少要有多少请求才进行熔断判断。

  • 作用:避免低流量时因为一两次慢调用或异常就误触发熔断。

例子:

  • 设置 minRequestAmount=5。

  • 统计窗口是 10 秒。

  • 只有当 10 秒内总请求数 ≥ 5 时,Sentinel 才会计算比例或异常数,才能触发熔断。


5. 统计时长 (StatIntervalMs / TimeWindow)

这个是 Sentinel 统计的滑动时间窗口。

  • 单位:毫秒(ms),通常配置成 1000(1秒)、60000(1分钟)等。

  • Sentinel 会在这个时间段内统计请求总数、成功数、异常数、响应时间等指标,来判断是否满足熔断条件。

作用:

  • 配合比例阈值、异常数阈值等条件使用。

  • 避免因为某一两个请求异常就立刻熔断,需要在这个统计周期内达到阈值才会触发。

6. 这几个参数怎么一起配合?

一个典型的慢调用比例策略:

  • 统计窗口:10 秒

  • 最小请求数:5

  • 最大 RT:1000 毫秒

  • 慢调用比例阈值:50%

  • 熔断时长:10 秒

流程:

  1. 每个请求统计响应时间。

  2. 超过 1 秒的记为“慢调用”。

  3. 每 10 秒统计一次:

    • 请求总数 ≥ 5,并且慢调用占比 ≥ 50%,触发熔断。

  4. 熔断 10 秒 → 所有请求直接走      handleBlock()。

  5. 10 秒后,进入半开状态,放行 1~2 个请求探测。

代码案例

/**
   * 
小程序随机获取民宿
   */
  
@RequestMapping(value = "/product/getProductRandomApp",   method = RequestMethod.POST)
  @SentinelResource(value = "getProductRandomApp", blockHandler = "handleBlock")
  public Result getProductRandomApp() {
      try{
          //
模拟超时
          Thread.sleep(2000);
      }catch (Exception e){
          log.info("模拟休眠 3s 异常 : {}",e.getMessage());
      }
      return productService.getProductRandomApp();
  }

/**
   * 
当触发限流或熔断时,会走这里
   */
  
public Result handleBlock(BlockException e)   {
      log.info("
【getProductPage】服务限流 或 熔断 走这里:{}",   e.getMessage());
      return Result.error().message(BaseResultCode.INTERNAL_SERVER_ERROR.getMessage());
  }

20个线程组、每个线程请求6次。查看执行效果:

查看实时监控

服务熔断后,就会走指定的方法。不至于服务阻塞

我这里将梳理的相关资料都放在GitHub了,可以看看。从选题->项目分析->开发->文档编等都有详细说明

https://github.com/zhengyuzh/GraduationDesignMaterials
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

乡下小哥编程

整理不易、多谢支持

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

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

打赏作者

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

抵扣说明:

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

余额充值