1、定义一个流控规则
@Component
public class IotManageSentinelConfig {
/**
* 使用代码编写流控规则,(控制台方式暂不支持)
*/
@PostConstruct
public void initFlowRule() {
List<FlowRule> rules = new ArrayList<>();
//登录短信验证码限流
FlowRule rule = new FlowRule();
rule.setResource(IotManageConstant.SENTINEL_NUM_CHECK_BATCH);
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(1);
rules.add(rule);
/* 4.加载限流规则 */
FlowRuleManager.loadRules(rules);
}
}
使用:
@SentinelResource(entryType = EntryType.IN,value = IotManageConstant.SENTINEL_NUM_CHECK_BATCH,blockHandler = "checkNumListHandler")FlowRule参数解释
FlowRule 核心参数详解
基础参数
表
1. grade(限流阈值类型)
java
// 常量定义在 RuleConstant 中
RuleConstant.FLOW_GRADE_QPS // 1 - 基于 QPS 限流(默认)
RuleConstant.FLOW_GRADE_THREAD // 0 - 基于并发线程数限流表格
2. count(限流阈值)
java
rule.setCount(0.5); // 0.5 QPS = 每2秒1个请求
rule.setCount(100); // 100 QPS
rule.setCount(20); // 20个并发线程支持小数,可实现低频限流(如 0.1 = 10秒1个请求)
3. strategy(流控模式)
java
RuleConstant.STRATEGY_DIRECT // 0 - 直接(默认):对当前资源限流
RuleConstant.STRATEGY_RELATE // 1 - 关联:当关联资源达到阈值时限流
RuleConstant.STRATEGY_CHAIN // 2 - 链路:只针对特定调用链路限流表格
关联模式配置:
java
rule.setStrategy(RuleConstant.STRATEGY_RELATE);
rule.setRefResource("anotherResource"); // 关联的资源名4. controlBehavior(流控效果)⭐ 重要
java
RuleConstant.CONTROL_BEHAVIOR_DEFAULT // 0 - 直接拒绝(默认)
RuleConstant.CONTROL_BEHAVIOR_WARM_UP // 1 - 预热/冷启动
RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER // 2 - 匀速排队(漏桶)
RuleConstant.CONTROL_BEHAVIOR_WARM_UP_RATE_LIMITER // 3 - 预热 + 匀速排队表格
5. 各流控效果的额外参数
预热模式(WARM_UP)
java
rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_WARM_UP);
rule.setWarmUpPeriodSec(10); // 预热时间(秒)
rule.setCount(100); // 最终阈值
// 实际效果:从 100/3 开始,10秒内逐渐提升到 100原理:令牌桶算法,初始阈值为 count/3,经过 warmUpPeriodSec 逐渐提升到 count
匀速排队模式(RATE_LIMITER)
java
rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER);
rule.setMaxQueueingTimeMs(500); // 最大排队等待时间(毫秒)
rule.setCount(5); // 每秒5个请求,即每200ms一个原理:漏桶算法,请求以固定间隔(1000/count ms)匀速通过,超出等待时间的请求被拒绝。
6. 其他参数
表格
完整配置示例
示例 1:基础 QPS 限流
java
FlowRule rule = new FlowRule();
rule.setResource("/api/order");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(1000); // 1000 QPS
rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);示例 2:2秒1个请求(匀速排队)
java
FlowRule rule = new FlowRule();
rule.setResource("slowApi");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(0.5); // 0.5 QPS = 2秒1个
rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER);
rule.setMaxQueueingTimeMs(3000); // 最多等3秒示例 3:冷启动保护
java
FlowRule rule = new FlowRule();
rule.setResource("hotApi");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(100);
rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_WARM_UP);
rule.setWarmUpPeriodSec(10); // 10秒内从33逐渐升到100示例 4:关联限流(读写分离保护)
java
FlowRule rule = new FlowRule();
rule.setResource("/api/write"); // 被保护的资源
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(10);
rule.setStrategy(RuleConstant.STRATEGY_RELATE);
rule.setRefResource("/api/read"); // 当读接口繁忙时,限制写接口参数速查表
plain
┌─────────────────────────────────────────────────────────────┐
│ resource 资源名(必填) │
│ grade 阈值类型:QPS(1) / 线程数(0) │
│ count 阈值数值(支持小数) │
│ strategy 模式:直接(0) / 关联(1) / 链路(2) │
│ controlBehavior 效果:拒绝(0) / 预热(1) / 排队(2) / 混合(3)│
│ warmUpPeriodSec 预热时间(秒)- 预热模式用 │
│ maxQueueingTimeMs 最大排队时间(毫秒)- 排队模式用 │
│ refResource 关联资源名 - 关联模式用 │
│ limitApp 限制来源,默认 default │
└─────────────────────────────────────────────────────────────┘这些参数可以灵活组合,满足从简单限流到复杂流量控制的各种需求。