SpringCloud Sentinel流控规则如何设置处理?
摘要:1 流控规则 基本介绍 ======= 🌟 青柠来相伴,代码更简单。🌟 ======= 📚 本
1 流控规则
基本介绍
======= 🌟 青柠来相伴,代码更简单。🌟 =======
📚 本文所有内容,我都整理在了 青柠合集 里。👇
🎯 搜索关注【青柠代码录】,即可查看所有合集文章 ~
======= 🌟 ================ 🌟 =======
阈值类型
类型
适用场景
核心思想
示例
QPS
高频短请求(API网关、登录接口)
每秒最多允许 N 次请求
设置 QPS=5,超过则拒绝
并发线程数
耗时操作(数据库查询、远程调用)
同时最多 N 个线程处理该资源
防止线程池耗尽
🔍 判断标准:
若接口平均响应时间 < 50ms → 优先选 QPS
若接口涉及 IO 操作、远程调用 → 优先选并发线程数
示例:设置 QPS=5 的流控规则(编程式)
private void initFlowRules() {
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource("create-order"); // 资源名
rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // QPS 模式
rule.setCount(5); // 每秒最多 5 次
rule.setLimitApp("default"); // 对所有来源生效
rules.add(rule);
FlowRuleManager.loadRules(rules);
}
⚙️ 在 @PostConstruct 中调用即可生效。
流控模式
1. 直接模式(Direct)
直接(默认):最常见模式,直接对当前资源进行限流。
✅ 配置简单,适用于独立接口保护。
直接->快速失败
表示1秒钟内查询1次就是OK,若超过次数1,就直接-快速失败,报默认错误
2. 关联模式(Associated)
当关联资源达到阈值时,限流当前资源。
当关联的资源达到阈值时,就限流自己。当与A关联的资源B达到阀值后,就限流A自己。
📌 典型场景:“读写分离”下的写操作保护
例如:商品详情页(GET /product/{id})访问量大,但库存扣减(POST /seckill)非常关键。我们可以设置:
当 /seckill 接口 QPS > 10 时,限流 /product/{id},防止大量读请求压垮数据库。
FlowRule rule = new FlowRule();
rule.setResource("product-detail"); // 当前资源
rule.setRefResource("seckill-action"); // 关联资源
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(20);
rule.setLimitApp("default");
rule.setStrategy(RuleConstant.STRATEGY_RELATE); // 关联模式
3. 链路模式(Chain)
仅针对特定调用链路上的请求生效。
⚠️ 注意:需要关闭 Web 上下文合并:
spring:
cloud:
sentinel:
web-context-unify: false
假设存在两个入口调用同一个服务方法:
@GetMapping("/fromA")
public String fromA() {
return businessService.commonResource(); // 资源名:common-resource
}
@GetMapping("/fromB")
public String fromB() {
return businessService.commonResource(); // 资源名:common-resource
}
此时可在 Dashboard 中分别看到两条链路:
/fromA -> common-resource
/fromB -> common-resource
可单独对 /fromA 的路径进行限流,不影响 /fromB。
