目录
[一、 流量控制规则(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 |
受保护的资源名(与 @SentinelResource 的 value 对应) |
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. 实操示例(控制台配置)
- 进入 Sentinel 控制台 → 「流量控制规则」→ 「新增流控规则」。
- 配置:
资源名=helloResource、阈值类型=QPS、阈值=1、流控策略=直接、控制效果=直接拒绝。 - 快速访问接口,触发限流,返回兜底信息。
二、 熔断降级规则(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=RT、count=500、timeWindow=10、minRequestAmount=10。含义:1 秒内,helloResource的请求数≥10,且平均响应时间≥500ms,触发熔断,10 秒内不再调用该资源。 - 场景:针对耗时接口(如调用第三方支付接口),避免慢请求拖垮系统。
(2) 异常比例熔断
- 逻辑:统计时间内,资源的异常请求比例 ≥
count(0~1 之间),且请求数 ≥minRequestAmount,触发熔断。 - 示例:配置
grade=EXCEPTION_RATIO、count=0.5、timeWindow=10、minRequestAmount=10。含义:1 秒内,helloResource的请求数≥10,且异常率≥50%,触发熔断,10 秒内不再调用该资源。 - 场景:针对接口报错率高的场景(如数据库连接失败、第三方接口返回异常)。
(3) 异常数熔断
- 逻辑:统计时间内,资源的异常请求数 ≥
count,且请求数 ≥minRequestAmount,触发熔断。 - 示例:配置
grade=EXCEPTION_COUNT、count=10、timeWindow=10、minRequestAmount=20。含义:1 秒内,helloResource的请求数≥20,且异常数≥10,触发熔断,10 秒内不再调用该资源。 - 场景:针对异常数容易统计的场景(如批量处理接口,允许最多 10 次异常)。
4. 熔断状态流转
Sentinel 熔断遵循「闭合→打开→半开」的状态机:
- 闭合状态(默认):正常调用资源,统计异常数据。
- 打开状态 :触发熔断,
timeWindow时间内拒绝所有对该资源的调用。 - 半开状态 :
timeWindow结束后,进入半开状态,允许少量请求尝试调用资源。- 若尝试请求成功(无异常、响应时间正常),则恢复为闭合状态。
- 若尝试请求失败,重新进入打开状态,重置
timeWindow。
5. 实操场景
配置一个异常比例熔断规则:
- 控制台 → 「熔断降级规则」→ 「新增降级规则」。
- 配置:
资源名=advancedHelloResource、降级策略=异常比例、阈值=0.5、熔断窗口=10、最小请求数=10。 - 快速访问
http://localhost:8080/advanced/hello(不传递 name 参数,触发业务异常),1 秒内请求≥10 次,异常率≥50%,触发熔断。 - 熔断后,即使传递 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. 核心特性
- 参数索引:只支持「基本类型」和「String 类型」参数,不支持复杂对象。
- 例外项:针对热点参数的特定值,配置更高 / 更低的阈值,实现精细化控制。
- 注解依赖 :需配合
@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) 配置热点规则
- 控制台 → 「热点规则」→ 「新增热点规则」。
- 配置:
资源名=helloResource、参数索引=0、阈值类型=QPS、阈值=5。 - 新增例外项:
参数值=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 / 内存使用率过高 | 针对「整个应用」,全局控制 |
| 授权规则 | 控制资源的调用来源 | 内部接口保护、白名单访问 | 针对「调用方」,身份验证 |
总结
- 流控 管「正常流量」,熔断 管「异常资源」,热点参数管「精细参数」,三者是 Sentinel 最核心的规则。
- 流控的核心是「限流阈值 + 控制效果」,熔断的核心是「异常策略 + 熔断窗口」,热点参数的核心是「参数索引 + 例外项」。
- 实际开发中,通常组合使用多种规则(如流控 + 熔断 + 热点),构建多层次的系统防护体系,既防住瞬时高流量,又能处理异常场景,还能精细化控制热点数据。