bigywater.tech
Spring · 128

Sentinel:规则、统计窗口与降级

Sentinel 的 QPS 是按每个整秒清零吗?线程数限流和 QPS 限流差在哪?为什么我的异常比例熔断永远不触发?请求间隔大了为什么也不熔断?被拦的接口返回什么?这篇用 sentinel-core 1.8.9 和 Spring Cloud Alibaba Sentinel 逐项实测。

0 通过
QPS=5 的规则下,第一批 5 个通过后 0.6 秒再发 5 次,全部被拦——窗口是滑动的
不 trace 不熔断
10 次抛异常,没有调用 Tracer.trace,异常比例熔断器一次都没打开
200
@SentinelResource 配了 blockHandler,被限流的请求对调用方仍是 HTTP 200

QPS 限流

实测 · 本机执行输出
  t=0 瞬间连发 20 次:5 通过 / 15 被拦
  过了 0.6 秒再发 5 次:0 通过 / 5 被拦(第一批 5 个还在最近 1 秒的窗口里)
  再过 0.6 秒(距第一批 1.2 秒)再发 5 次:5 通过 / 0 被拦

最近 1 秒的滑动窗口。

线程数限流

实测 · 本机执行输出
  6 个线程同时进入、每个占用 300 ms:3 通过 / 3 被拦

限制并发而不是每秒请求数。

匀速排队

实测 · 本机执行输出
  6 个并发请求的结果(时间从放行开始算起):[7 ms 通过, 9 ms 被拦, 9 ms 被拦, 23 ms 被拦, 212 ms 通过, 408 ms 通过]

每 1000/count 毫秒放行一个,排队超过上限被拦。

预热

实测 · 本机执行输出
  第 1~5 秒各通过:[21, 14, 20, 30, 30]

冷启动时阈值逐渐升到 count。

熔断降级

实测 · 本机执行输出
  慢调用比例(RT>100 ms 算慢,阈值 0.5,最少 5 个请求,窗口 1 秒,熔断 2 秒):连续 10 次每次睡 150 ms → 慢慢慢慢慢慢拦拦拦拦,真正执行了 6 次
  等 2.2 秒后连续 3 次快调用(第 1 个是探测):通过(快)通过(快)通过(快)
  异常比例 0.5、最少 5 个请求:10 次抛异常,没有调用 Tracer.trace → 错错错错错错错错错错,真正执行了 10 次
  同样 10 次抛异常(换一个新资源),catch 里调用 Tracer.trace(x) → 错错错错错拦拦拦拦拦,真正执行了 5 次
  6 次抛异常(调用了 Tracer.trace)但每次间隔 400 ms(共 2.4 秒,每个 1 秒窗口里不到 5 个请求)→ 错错错错错错,真正执行了 6 次

慢调用比例、异常比例(要 Tracer.trace)、统计窗口与最少请求数。

Spring 集成

实测 · 本机执行输出
  瞬间连发 5 次 GET /hello → [200, 200, 429, 429, 429];被拦的响应体 = 'Blocked by Sentinel (flow limiting)'
  瞬间连发 5 次 GET /ann(@SentinelResource + blockHandler)→ [200, 200, 200, 200, 200];其中响应体是 blockHandler 返回的有 3 个:'blockHandler 收到 FlowException'

Web 默认 429;blockHandler 返回 200。

分步演示

Sentinel
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / OpenJDK 21.0.12(Homebrew) / Spring Boot 4.0.8(Spring Framework 7.0.9、Tomcat 11.0.24) / Spring Cloud 2025.1.3;用 javac 编译、java 直接运行,依赖由 Maven 从 Maven Central 解析;数字每次运行会有小幅抖动。前五节直接用 sentinel-core 1.8.9 的 SphU.entry / FlowRuleManager / DegradeRuleManager;第六节用 spring-cloud-starter-alibaba-sentinel 2025.1.0.0(不连 Dashboard);计时是 JVM 里的毫秒,多线程场景的通过时刻会有几毫秒到几十毫秒的抖动
    • 没有验证:Dashboard 与规则持久化(Nacos 数据源);热点参数限流;集群流控;关联 / 链路限流模式;系统自适应保护;Sentinel 与 Spring Cloud CircuitBreaker 的集成(spring-cloud-circuitbreaker-sentinel);预热曲线的数学公式(coldFactor 的含义)与第 1 秒为什么是 21;半开状态下探测请求失败的行为;统计窗口的采样数(sampleCount)配置
    京ICP备2026067502号-1京公网安备11010502063487号