一、流量控制规则(Flow Rule)
1.1 核心作用
通过控制请求流量保护系统,防止突发流量导致系统崩溃
1.2 关键参数
参数 | 说明 |
---|---|
resource | 资源名称(@SentinelResource定义的值) |
grade | 阈值类型:QPS(1)或并发线程数(0) |
count | 触发阈值 |
strategy | 流控策略:直接(0)、关联(1)、链路(2) |
controlBehavior | 控制效果:快速失败(0)、Warm Up(1)、排队等待(2) |
1.3 配置示例
// 通过控制台配置或代码注入
FlowRule rule = new FlowRule();
rule.setResource("orderQuery");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(10); // 每秒最大10次请求
rule.setStrategy(RuleConstant.STRATEGY_DIRECT);
rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);
FlowRuleManager.loadRules(Collections.singletonList(rule));
1.4 典型场景
- 秒杀系统:限制商品详情页QPS为1000
- API网关:对高危接口进行并发线程数控制
- 核心服务:当关联资源(如支付服务)达到阈值时,限制当前资源访问
二、熔断降级规则(Degrade Rule)
2.1 熔断策略
策略类型 | 触发条件 | 适用场景 |
---|---|---|
慢调用比例 | 响应时间 > RT阈值 且 比例超过阈值 | 数据库慢查询、外部API调用 |
异常比例 | 异常次数比例超过阈值 | 第三方服务不稳定 |
异常数 | 异常数量超过阈值 | 关键服务异常监控 |
2.2 熔断状态机
2.3 配置示例
DegradeRule rule = new DegradeRule();
rule.setResource("paymentService");
rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO); // 异常比例模式
rule.setCount(0.5); // 异常比例阈值50%
rule.setTimeWindow(10); // 熔断时长10秒
rule.setMinRequestAmount(5); // 最小请求数
rule.setStatIntervalMs(60*1000); // 统计窗口60秒
DegradeRuleManager.loadRules(Collections.singletonList(rule));
2.4 典型场景
- 服务雪崩防护:当订单服务异常比例超过60%时熔断
- 数据库保护:SQL查询平均RT超过500ms且比例超40%时熔断
- 重试风暴防御:支付接口连续5次异常立即熔断
三、热点参数规则(ParamFlow Rule)
3.1 核心能力
针对方法参数值进行细粒度流量控制
3.2 参数说明
参数 | 说明 |
---|---|
paramIdx | 参数索引(从0开始) |
paramFlowItemList | 特殊值限流配置 |
durationInSec | 统计窗口时间(秒) |
3.3 配置示例
ParamFlowRule rule = new ParamFlowRule("searchProduct")
.setParamIdx(0) // 控制第一个参数
.setCount(5); // 全局QPS阈值
// 对特定参数值单独设置
ParamFlowItem item = new ParamFlowItem().setObject("iPhone15")
.setClassType(String.class.getName())
.setCount(1); // iPhone15的QPS限制为1
rule.setParamFlowItemList(Collections.singletonList(item));
ParamFlowRuleManager.loadRules(Collections.singletonList(rule));
3.4 典型场景
- 热点商品限流:限制爆款商品ID的查询频率
- 用户分级控制:对VIP用户ID放宽限制
- 防爬虫机制:针对特定设备ID进行访问频率控制
四、规则组合应用策略
4.1 电商系统防护案例
graph TD
A[商品详情页] -->|流控规则| B(QPS≤1000)
A -->|熔断规则| C(异常比例>40%熔断10秒)
A -->|热点规则| D(商品ID=1001时QPS≤10)
4.2 配置建议
- 分层防护:网关层做全局流控,服务层做细粒度控制
- 动态调整:结合监控数据实时调整阈值
- 白名单机制:对内部系统IP不做限制
五、最佳实践验证方法
流量控制验证:
# 使用wrk压测工具 wrk -t4 -c100 -d30s --latency http://api/product/101
熔断触发验证:
// 单元测试中模拟异常 when(productService.getDetail(any())).thenThrow(new RuntimeException());
热点规则验证:
// 使用不同参数值连续调用 IntStream.range(0,10).forEach(i->{ productService.search("hotItem", ...); });
六、常见配置误区
流控与熔断混淆:
- 流控:预防系统过载
- 熔断:故障发生后的快速恢复
热点参数索引错误:
// 方法签名:search(String keyword, int type) setParamIdx(1) // 对应type参数
统计窗口设置不当:
- 过短:容易误触发
- 过长:响应延迟
通过合理配置这三类规则,可以构建起完整的系统防护体系。建议在开发环境中使用Sentinel的实时监控功能观察规则生效情况,生产环境建议配合Nacos实现规则持久化。