【SpringCloud】Sentinel 组件:流控规则


1 流控规则

基本介绍

复制代码
======= 🌟 青柠来相伴,代码更简单。🌟 =======
📚 本文所有内容,我都整理在了 青柠合集 里。👇
🎯 搜索关注【青柠代码录】,即可查看所有合集文章 ~
======= 🌟 ================ 🌟 =======

img img

阈值类型

类型 适用场景 核心思想 示例
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,就直接-快速失败,报默认错误
img

2. 关联模式(Associated)

当关联资源达到阈值时,限流当前资源。

当关联的资源达到阈值时,就限流自己。当与A关联的资源B达到阀值后,就限流A自己。
img

📌 典型场景:"读写分离"下的写操作保护

例如:商品详情页(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


流控效果

效果 算法模型 适用场景 图解
快速失败 固定窗口 明确容量边界
Warm Up(预热) 梯度升温 冷启动保护(缓存预热、JVM JIT) 初始阈值 = 设定值 / 3,逐渐上升
排队等待 漏桶算法 匀速处理突发流量 请求排队,超时则拒绝

快速失败

直接->快速失败(默认的流控处理)

直接失败,抛出异常

Warm Up :

说明

公式:阈值除以coldFactor(默认值为3),经过预热时长后才会达到阈值

默认coldFactor为3,即请求 QPS 从 threshold / 3 开始,经预热时长逐渐升至设定的 QPS 阈值。

WarmUp配置

默认 coldFactor 为 3,即请求QPS从(threshold / 3) 开始,经多少预热时长才逐渐升至设定的 QPS 阈值。

案例,阀值为10+预热时长设置5秒。系统初始化的阀值为10 / 3 约等于3,即阀值刚开始为3;然后过了5秒后阀值才慢慢升高恢复到10
img

复制代码
rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_WARM_UP);
rule.setWarmUpPeriodSec(10); // 10秒内从 1/3 阈值升至全量

如 QPS=30,则初始允许 10 QPS,10 秒后提升至 30。

排队等待:

匀速排队,让请求以均匀的速度通过,阀值类型必须设成QPS,否则无效。

设置含义:/testA每秒1次请求,超过的话就排队等待,等待的超时时间为20000毫秒。
img

复制代码
rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_QUEUEING);
rule.setMaxQueueingTimeMs(500); // 最大等待时间 500ms

结合漏桶算法,保证请求匀速通过,适合订单创建类接口。
img

本文由mdnice多平台发布

相关推荐
Oneslide4 小时前
机械革命 单系统纯净重装Ubuntu(全盘覆盖,清空原有Windows)
后端
GetcharZp4 小时前
告别OOM!用Go+libvips实现30000×50000超大图片的流式瓦片服务
后端·go
IT_陈寒5 小时前
JavaScript项目实战经验分享
前端·人工智能·后端
用户47949283569156 小时前
6w star,GitHub 趋势第一的 Ponytail,这个agent插件到底在火什么
前端·后端
神奇小汤圆7 小时前
2026一线大厂Java八股文精选(附答案,高质量整理)
后端
Warson_L7 小时前
LangGraph入门学习资料
后端
神奇小汤圆8 小时前
Spring Boot → Solon 注解迁移实战指南:一张对照表说清楚
后端
kfaino8 小时前
码农的AI翻身(四)你好,我叫 Attention
人工智能·后端
lwx572808 小时前
探秘InnoDB:搞懂它的内存、线程、磁盘与日志刷盘策略
java·后端
云技纵横9 小时前
Spring Boot Actuator 被打穿:线上开了这些端点,等于裸奔
后端