Sentinel 的核心规则体系

目录

[一、 流量控制规则(Flow Rule)](#一、 流量控制规则(Flow Rule))

[1. 核心作用](#1. 核心作用)

[2. 核心配置项(关键)](#2. 核心配置项(关键))

[3. 常见使用场景](#3. 常见使用场景)

[4. 实操示例(控制台配置)](#4. 实操示例(控制台配置))

[二、 熔断降级规则(Degrade Rule)](#二、 熔断降级规则(Degrade Rule))

[1. 核心作用](#1. 核心作用)

[2. 核心配置项(关键)](#2. 核心配置项(关键))

[3. 三种熔断策略详解](#3. 三种熔断策略详解)

[(1) 平均响应时间(RT)熔断](#(1) 平均响应时间(RT)熔断)

[(2) 异常比例熔断](#(2) 异常比例熔断)

[(3) 异常数熔断](#(3) 异常数熔断)

[4. 熔断状态流转](#4. 熔断状态流转)

[5. 实操场景](#5. 实操场景)

[三、 热点参数规则(Param Flow Rule)](#三、 热点参数规则(Param Flow Rule))

[1. 核心作用](#1. 核心作用)

[2. 核心配置项(关键)](#2. 核心配置项(关键))

[3. 核心特性](#3. 核心特性)

[4. 实操示例](#4. 实操示例)

[(1) 改造方法](#(1) 改造方法)

[(2) 配置热点规则](#(2) 配置热点规则)

[(3) 测试](#(3) 测试)

[5. 适用场景](#5. 适用场景)

[四、 其他补充规则](#四、 其他补充规则)

[1. 系统规则(System Rule)](#1. 系统规则(System Rule))

[2. 授权规则(Authority Rule)](#2. 授权规则(Authority Rule))

[五、 各类规则核心差异与适用场景总结](#五、 各类规则核心差异与适用场景总结)

总结

Sentinel 的所有规则都遵循「按需配置、动态生效」的原则,支持通过代码、配置文件、Sentinel 控制台三种方式配置,且控制台配置可实时推送无需重启应用。

一、 流量控制规则(Flow Rule)

1. 核心作用

限制资源的访问流量 ,避免瞬时高流量压垮系统,保障系统的吞吐量和稳定性。核心思想是「削峰填谷」,比如限制接口每秒最多接收 100 次请求。

2. 核心配置项(关键)

配置项 说明 可选值 / 示例
resource 受保护的资源名(与 @SentinelResourcevalue 对应) helloResource
grade 限流阈值类型 FLOW_GRADE_QPS(默认):按 QPS 限流(每秒请求数)② FLOW_GRADE_THREAD:按线程数限流(同时处理该资源的线程数)
count 限流阈值 如 QPS 阈值 = 10,线程数阈值 = 20
strategy 流控策略(针对资源本身 / 关联资源 / 链路) DIRECT(默认):直接限流当前资源② ASSOCIATE:关联限流(关联资源触发阈值,限流当前资源)③ CHAIN:链路限流(只限制指定链路进入该资源的流量)
controlBehavior 流量控制效果(超出阈值后的处理方式) DIRECT_REJECT(默认):直接拒绝(返回 BlockException)② WARM_UP:预热模式(阈值从低到高渐变,适用于突发流量)③ RATE_LIMITER:匀速排队(请求按固定速率通过,适用于秒杀等场景)④ WARM_UP_RATE_LIMITER:预热 + 匀速排队
limitApp 限制调用来源(默认不限制) default(所有来源)、具体服务名(如 service-a

3. 常见使用场景

  • QPS 限流:普通接口防刷,比如用户注册接口限制 QPS=50,避免恶意批量注册。
  • 线程数限流:针对耗时较长的接口(如查询数据库报表),限制同时处理的线程数 = 10,避免线程池耗尽。
  • 预热模式:针对缓存重建、服务启动场景,比如限流阈值 = 100,预热时间 = 5 秒,阈值会从 50(100/2)渐变到 100,避免瞬间打满资源。
  • 匀速排队:秒杀接口,限制 QPS=10,排队超时时间 = 500ms,让请求按 100ms / 个的速率通过,避免系统被突发流量冲垮。

4. 实操示例(控制台配置)

  1. 进入 Sentinel 控制台 → 「流量控制规则」→ 「新增流控规则」。
  2. 配置:资源名=helloResource阈值类型=QPS阈值=1流控策略=直接控制效果=直接拒绝
  3. 快速访问接口,触发限流,返回兜底信息。

二、 熔断降级规则(Degrade Rule)

1. 核心作用

当资源出现异常(如调用超时、报错率高)时,暂时切断该资源的调用链路,避免异常扩散导致整个系统雪崩,同时给资源留出恢复时间。

区别于流控:流控是「防患于未然」,限制正常流量;熔断是「亡羊补牢」,处理已出现异常的资源。

2. 核心配置项(关键)

配置项 说明 可选值 / 示例
resource 受保护的资源名 helloResource
grade 熔断降级策略(判断资源是否异常的依据) DEGRADE_GRADE_RT(平均响应时间)② DEGRADE_GRADE_EXCEPTION_RATIO(异常比例)③ DEGRADE_GRADE_EXCEPTION_COUNT(异常数)
count 熔断阈值 ① 平均响应时间:如 500(ms)② 异常比例:如 0.5(50%)③ 异常数:如 10(次)
timeWindow 熔断窗口时间(单位:秒) 10(熔断后,10 秒内不再调用该资源,10 秒后尝试半开状态)
minRequestAmount 最小请求数(触发熔断的前提:统计时间内请求数≥该值,默认 5) 10(每秒至少 10 次请求,才会判断是否熔断)
statIntervalMs 统计时间窗口(单位:毫秒,默认 1000ms=1 秒) 2000(每 2 秒统计一次异常数据)

3. 三种熔断策略详解

(1) 平均响应时间(RT)熔断
  • 逻辑:统计时间内,资源的平均响应时间 ≥ count,且请求数 ≥ minRequestAmount,触发熔断。
  • 示例:配置 grade=RTcount=500timeWindow=10minRequestAmount=10。含义:1 秒内,helloResource 的请求数≥10,且平均响应时间≥500ms,触发熔断,10 秒内不再调用该资源。
  • 场景:针对耗时接口(如调用第三方支付接口),避免慢请求拖垮系统。
(2) 异常比例熔断
  • 逻辑:统计时间内,资源的异常请求比例 ≥ count(0~1 之间),且请求数 ≥ minRequestAmount,触发熔断。
  • 示例:配置 grade=EXCEPTION_RATIOcount=0.5timeWindow=10minRequestAmount=10。含义:1 秒内,helloResource 的请求数≥10,且异常率≥50%,触发熔断,10 秒内不再调用该资源。
  • 场景:针对接口报错率高的场景(如数据库连接失败、第三方接口返回异常)。
(3) 异常数熔断
  • 逻辑:统计时间内,资源的异常请求数 ≥ count,且请求数 ≥ minRequestAmount,触发熔断。
  • 示例:配置 grade=EXCEPTION_COUNTcount=10timeWindow=10minRequestAmount=20。含义:1 秒内,helloResource 的请求数≥20,且异常数≥10,触发熔断,10 秒内不再调用该资源。
  • 场景:针对异常数容易统计的场景(如批量处理接口,允许最多 10 次异常)。

4. 熔断状态流转

Sentinel 熔断遵循「闭合→打开→半开」的状态机:

  1. 闭合状态(默认):正常调用资源,统计异常数据。
  2. 打开状态 :触发熔断,timeWindow 时间内拒绝所有对该资源的调用。
  3. 半开状态timeWindow 结束后,进入半开状态,允许少量请求尝试调用资源。
    • 若尝试请求成功(无异常、响应时间正常),则恢复为闭合状态。
    • 若尝试请求失败,重新进入打开状态,重置 timeWindow

5. 实操场景

配置一个异常比例熔断规则:

  1. 控制台 → 「熔断降级规则」→ 「新增降级规则」。
  2. 配置:资源名=advancedHelloResource降级策略=异常比例阈值=0.5熔断窗口=10最小请求数=10
  3. 快速访问 http://localhost:8080/advanced/hello(不传递 name 参数,触发业务异常),1 秒内请求≥10 次,异常率≥50%,触发熔断。
  4. 熔断后,即使传递 name 参数,也会返回 blockHandler 兜底信息,10 秒后尝试恢复。

三、 热点参数规则(Param Flow Rule)

1. 核心作用

针对资源的「热点参数」进行精细化限流,即对资源中某个频繁使用的参数(如用户 ID、商品 ID)进行单独限流,而不是对整个资源限流。

热点:指访问频率高的参数,比如秒杀接口的 goodsId,大部分请求都集中在少数几个商品 ID 上。

2. 核心配置项(关键)

配置项 说明 示例
resource 受保护的资源名 helloResource
paramIdx 热点参数索引(方法参数列表的下标,从 0 开始) 如方法 hello(String name, Integer age)name 是索引 0,age 是索引 1
grade 限流阈值类型(同流控) FLOW_GRADE_QPS(默认)、FLOW_GRADE_THREAD
count 默认限流阈值(该参数的所有值都适用的基础阈值) 如 QPS 阈值 = 10
paramFlowItemList 参数例外项(针对特定参数值单独配置阈值,优先级高于默认阈值) 如商品 ID=1001,阈值 = 100;其他商品 ID,阈值 = 10
durationInSec 统计时间窗口(单位:秒,默认 1) 1(每秒统计一次)
controlBehavior 流控效果(同流控,仅支持直接拒绝和匀速排队) DIRECT_REJECT(默认)

3. 核心特性

  1. 参数索引:只支持「基本类型」和「String 类型」参数,不支持复杂对象。
  2. 例外项:针对热点参数的特定值,配置更高 / 更低的阈值,实现精细化控制。
  3. 注解依赖 :需配合 @SentinelResource 使用,且资源方法必须有参数。

4. 实操示例

hello 方法的 name 参数(索引 0)配置热点规则:

(1) 改造方法
复制代码
@GetMapping("/hello")
@SentinelResource(value = "helloResource", blockHandler = "helloBlockHandler")
public String hello(@RequestParam(required = false, defaultValue = "guest") String name) {
    return "Hello, " + name + "!";
}

// 注意:blockHandler 方法需保留热点参数,且添加 BlockException
public String helloBlockHandler(String name, BlockException e) {
    System.err.println("热点参数限流触发,参数:" + name);
    return "抱歉,该参数访问过于频繁,请稍后再试!";
}
(2) 配置热点规则
  1. 控制台 → 「热点规则」→ 「新增热点规则」。
  2. 配置:资源名=helloResource参数索引=0阈值类型=QPS阈值=5
  3. 新增例外项:参数值=test阈值=20(表示 name=test 时,QPS 阈值 = 20,其他 name 值阈值 = 5)。
(3) 测试
  • 访问 http://localhost:8080/hello?name=guest,快速访问≥5 次 / 秒,触发限流。
  • 访问 http://localhost:8080/hello?name=test,快速访问≤20 次 / 秒,不会触发限流,超过 20 次才会限流。

5. 适用场景

  • 秒杀接口:对热门商品 ID 配置更高的限流阈值,普通商品 ID 配置较低阈值。
  • 用户中心:对 VIP 用户 ID 配置更高的接口访问阈值,普通用户配置较低阈值。

四、 其他补充规则

1. 系统规则(System Rule)

  • 核心作用:针对整个应用的系统级指标进行限流,而非单个资源,保障应用整体稳定性。
  • 监控指标:① load:系统负载(仅支持 Linux/Unix 系统)。② cpuUsage:CPU 使用率。③ memoryUsage:内存使用率。④ qps:应用整体 QPS。⑤ threadCount:应用整体线程数。
  • 场景:当应用 CPU 使用率≥80% 时,触发系统限流,拒绝所有新请求,避免应用宕机。

2. 授权规则(Authority Rule)

  • 核心作用:对资源的调用来源进行黑白名单控制,即允许 / 拒绝某个服务 / 应用调用该资源。
  • 配置项:resource(资源名)、strategy(授权策略:黑白名单)、limitApp(允许 / 拒绝的应用名列表,多个用逗号分隔)。
  • 场景:保护内部接口,只允许内部服务 service-admin 调用,拒绝外部服务调用。

五、 各类规则核心差异与适用场景总结

规则类型 核心目标 适用场景 关键特点
流量控制 限制资源的整体访问流量 普通接口防刷、避免瞬时高流量 针对「资源整体」,粗粒度控制
熔断降级 处理异常资源,避免雪崩 耗时接口、第三方接口、报错率高的接口 针对「异常资源」,有状态流转
热点参数 精细化控制资源的热点参数 秒杀接口、商品查询接口(针对特定参数值) 针对「资源参数」,细粒度控制
系统规则 保障应用整体稳定性 应用负载过高、CPU / 内存使用率过高 针对「整个应用」,全局控制
授权规则 控制资源的调用来源 内部接口保护、白名单访问 针对「调用方」,身份验证

总结

  1. 流控 管「正常流量」,熔断 管「异常资源」,热点参数管「精细参数」,三者是 Sentinel 最核心的规则。
  2. 流控的核心是「限流阈值 + 控制效果」,熔断的核心是「异常策略 + 熔断窗口」,热点参数的核心是「参数索引 + 例外项」。
  3. 实际开发中,通常组合使用多种规则(如流控 + 熔断 + 热点),构建多层次的系统防护体系,既防住瞬时高流量,又能处理异常场景,还能精细化控制热点数据。
相关推荐
小马爱打代码1 天前
Sentinel:入门到实战详细教程
sentinel
小马爱打代码2 天前
Spring Boot:Sentinel 企业级熔断、降级与限流实战
spring boot·后端·sentinel
没有bug.的程序员2 天前
Spring Cloud Sentinel:熔断降级规则配置与分布式流量防线实战终极指南
java·分布式·后端·spring cloud·sentinel·熔断规则·分布式流量防线
u0104058365 天前
Java中的服务熔断机制:Hystrix与Sentinel的比较
java·hystrix·sentinel
what丶k5 天前
微服务稳定性守护者:Sentinel 全面使用指南(从入门到企业级落地)
微服务·架构·sentinel
鸽鸽程序猿5 天前
【JavaEE】【SpringCloud】 熔断和限流 Alibaba Sentinel
spring cloud·java-ee·sentinel
小楼v6 天前
如何使用Sentinel进行流量控制和熔断
java·后端·sentinel
MediaTea9 天前
Python:_sentinel 命名约定
开发语言·python·sentinel
短剑重铸之日9 天前
《SpringCloud实用版》Feign + LoadBalancer + Sentinel 微服务调用链路
spring cloud·微服务·sentinel·feign·loadbalancer