🧭 为什么 Sentinel 是系统稳定的"守门人"?
在秒杀、抢购、大促等高并发场景中,突发流量如洪水猛兽。若无防护,轻则服务变慢,重则系统雪崩。
Alibaba Sentinel 作为阿里开源的流量治理组件,提供三大核心限流能力:
- ✅ QPS 限流:限制每秒请求数
- ✅ 线程数限流:限制并发线程数
- ✅ 热点参数限流:对特定参数(如 userId、goodsId)精细化限流
本文将通过真实代码 + 控制台配置 + 架构图,手把手教你落地这"三板斧"。
🗺️ 系统架构(图表)

⚠️ Sentinel 是第一道防线,在进入核心逻辑前完成拦截。
⚙️ 环境准备
1. 依赖(pom.xml)
java
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2022.0.0.0</version>
</dependency>
2. 配置(application.yml)
java
spring:
application:
name: seckill-demo
cloud:
sentinel:
transport:
dashboard: losclhost:8858 # Docker Desktop 专用
port: 8719
3. 启动 Sentinel Dashboard(Docker)
bash
docker run -d -p 8858:8858 bladex/sentinel-dashboard:1.8.8

🔥 第一板斧:QPS 限流(每秒请求数)
✅ 适用场景
- 保护系统入口,防止突发流量压垮 Redis/Kafka
- 适合短请求(RT < 50ms)
💻 代码(Service 层)
java
@Service
public class SeckillService {
@SentinelResource(value = "seckill", blockHandler = "handleSeckillBlock")
public String doSeckill(Long goodsId, Long userId) {
// Redis + Lua 扣库存(略)
return "秒杀成功";
}
public String handleSeckillBlock(Long goodsId, Long userId, BlockException ex) {
return "请求过于频繁,请稍后再试";
}
}
🖼️ 控制台配置(文字描述,可配图)
- 进入 簇点链路

- 找到资源
seckill-jk - 点击 流控

- 填写:
- 阈值类型:QPS
- 单机阈值:
1000 - 流控模式:直接
- 流控效果:快速失败

📊 效果验证
- 使用 Python脚本 发请求
- 超出 1000 的请求返回:
"请求过于频繁,请稍后再试"

🔥 第二板斧:线程数限流(并发线程控制)
✅ 适用场景
- 保护耗时操作(如调用第三方支付、短信)
- 防止 Tomcat 线程池打满
💻 代码(模拟耗时操作)
java
@SentinelResource(value = "pay", blockHandler = "handlePayBlock")
public String pay(Long orderId) {
try {
Thread.sleep(500); // 模拟耗时
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
return "支付成功";
}
🖼️ 控制台配置
- 资源名:
pay - 阈值类型:线程数
- 单机阈值:
10(最多同时处理 10 个支付请求)


📊 与 QPS 对比
| 维度 | QPS 限流 | 线程数限流 |
|---|---|---|
| 控制依据 | 时间窗口内请求数 | 当前活跃线程数 |
| 适合 RT | < 100ms | > 100ms |
| 防护目标 | 吞吐量 | 线程资源 |
📌 秒杀用 QPS,支付用线程数
🔥 第三板斧:热点参数限流(精细化防护)
✅ 适用场景
- 防刷单:限制单个
userId每秒只能抢 5 次 - 防打爆:限制热门
goodsId=1001每秒最多 100 次
💻 代码(启用热点参数)
java
@SentinelResource("seckill_hotspot")
public String doSeckillHot(Long goodsId, Long userId) {
return doSeckill(goodsId, userId);
}
⚠️ 必须使用
@SentinelResource显式声明,否则热点规则不生效!
💡 参数索引说明
java
public String doSeckillHot(Long goodsId, Long userId)
// 参数索引 → 0 1
⚠️ 关键限制:
- 参数类型必须是 基本类型(long/int)或 String
- 不支持对象、List、Map(Sentinel 无法提取热点)
🖼️ 控制台配置(热点规则)
- 进入 热点规则
- 点击 + 新增
- 填写:
- 资源名:
seckill_hotspot - 参数索引:
1(对应userId,从 0 开始) - 单机阈值:
5 - 统计窗口:1 秒

- 资源名:

📊 效果
- 用户 A(userId=123)每秒请求 3 次 → ✅ 允许
- 用户 B(userId=999)每秒请求 10 次 → ❌ 被限流
Qwen3-Max
3:24 PM
好的!我们来深入详解 Sentinel 的第三板斧 ------ 热点参数限流(Hotspot Parameter Flow Control) ,这是高并发系统中实现精细化防护的核心能力,尤其适用于秒杀、抢购、防刷等场景。
🔥 什么是热点参数限流?
热点参数限流 :对方法中的某个参数(如
userId、goodsId)的特定值进行独立限流。
🎯 举个真实例子:
- 商品
1001是爆款,1 秒内有 10 万人抢 → 系统可能被打崩 - 用户
999999用脚本刷单,1 秒请求 1000 次 → 挤占正常用户资源
传统 QPS 限流无法解决这类问题,因为:
- 全局 QPS 可能没超(比如总共 500 QPS)
- 但某个商品或用户占比 99%,形成"热点"
👉 热点参数限流就是为了解决"局部打爆"问题。
🧩 完整配置结构对比
| 策略 | 资源定义方式 | 控制台菜单 | 规则类型 | 是否需代码改造 |
|---|---|---|---|---|
| QPS | @SentinelResource("xxx") |
流控 | FlowRule |
否 |
| 线程数 | 同上 | 流控 | FlowRule(类型=THREAD) |
否 |
| 热点参数 | @SentinelResource("xxx") |
热点规则 | ParamFlowRule |
✅ 是 |
🛠 实战建议
- QPS 阈值 = 压测最大稳定值 × 0.8
(如压测 5000 QPS,则设 4000) - 热点参数 + 用户 ID = 防刷单利器
- 生产环境务必持久化规则(如 Nacos)
- 不要滥用
blockHandler,避免逻辑臃肿
📌 总结
| 限流方式 | 何时用 | 如何配 | 效果 |
|---|---|---|---|
| QPS | 入口流量防护 | 流控 → QPS | 防系统被打崩 |
| 线程数 | 耗时操作防护 | 流控 → 线程数 | 防线程池满 |
| 热点参数 | 精细化防刷 | 热点规则 | 防恶意用户/商品 |
🔗 开源项目 & 互动
- GitHub 项目 :https://github.com/songrongzhen/seckill
(含完整 Docker、Lua、Sentinel、Kafka 代码) - 欢迎 Star🌟 & 提 Issue!
💬 互动话题:你在项目中用过 Sentinel 吗?遇到过哪些坑?欢迎评论区交流!