Sentinel 限流的核心原理 + 实践配置 + 源码理解 + 场景落地
摘要: Sentinel是阿里开源的流量防控组件,支持QPS限流、并发线程控制、热点参数限流等多种策略,通过滑动窗口统计和令牌桶等算法实现精准控制。其核心流程基于责任链(SlotChain),由FlowSlot执行限流检查,FlowRuleChecker对比阈值后拦截或放行请求。支持来源应用、集群等维度限流,可通过控制台或代码配置规则。高并发场景推荐结合WarmUp预热、RateLimiter匀速
✅ 一、Sentinel 是什么?
Sentinel 是阿里开源的流量防控组件,用于 流量控制(限流)、熔断降级、系统负载保护 等。
核心目标是:
在高并发场景下,保护服务稳定性、避免雪崩、削峰填谷
✅ 二、Sentinel 是如何限流的?(核心原理)
🧠 1. 总体原理
Sentinel 基于 滑动窗口 + 令牌桶 等限流算法,构建了灵活的流控机制,限流粒度精细,支持:
-
QPS(每秒请求数)
-
并发线程数
-
来源应用维度
-
客户端 IP、参数等维度的控制
🧪 2. 执行机制(源码流程简化版)
当请求进入时,Sentinel 会执行:
Entry entry = SphU.entry("resourceName");
底层流程:
-
Slot Chain 调用链执行:
-
每个请求会进入一条责任链(
ProcessorSlot
),包括:限流、熔断、系统规则等。 -
限流规则由
FlowSlot
执行。
-
-
FlowSlot -> FlowRuleChecker:
-
会从缓存中获取当前资源的限流规则。
-
比如:
resourceName
设置了 QPS=100。
-
-
调用 QPSController(或其他控制器):
-
通过
StatisticNode
获取最近的请求数。 -
比较当前请求数是否超过阈值。
-
-
如果超过:
-
抛出
FlowException
拦截请求; -
否则允许通过。
-
👉 核心类:
-
FlowRule
:限流规则 -
FlowRuleChecker
:检查器 -
StatisticNode
:统计实时流量 -
TokenBucketController
/RateLimiterController
/WarmUpController
✅ 三、限流方式有哪些?
类型 | 说明 | 示例 |
---|---|---|
QPS 限流 | 每秒最多通过 N 次 | 服务 A 的 QPS 上限为 200 |
并发线程数 | 控制某资源同时处理的线程数 | 某方法最多支持 10 个线程同时执行 |
关联限流 | 控制下游依赖的访问频率 | 下游服务 C 太慢,限制访问它的 QPS |
链路限流 | 按调用路径限流 | 如果是 userService → orderService,则限流;其他路径不限制 |
热点参数限流 | 对特定参数限流 | 商品 ID 为 123 的请求过多,就限流它 |
集群限流 | 多节点统一限流 | 多实例统一控制总 QPS,比如分布式限流 5000 QPS |
✅ 四、如何给某台服务限流(指定 QPS)?
如果你想让 Sentinel 只对某台服务的某个实例限流:
✅ 方法一:通过 Sentinel 控制台 + 接入端配置
-
每个实例都会上报资源信息到控制台。
-
在控制台上对指定资源设置规则:
-
设置“来源应用”字段,比如:
来源为 app-a
-
设置限流 QPS 为 100
-
-
实际效果:只有从 app-a 发起的请求触发限流。
✅ 方法二:代码指定来源限流
ContextUtil.enter("app-a"); // 手动设置来源
Entry entry = SphU.entry("myService");
然后在 FlowRule 中写:
rule.setLimitApp("app-a");
rule.setCount(100); // 每秒 100 个
这样就能控制指定调用来源 QPS。
✅ 五、高并发场景如何限流?(策略答题)
答题策略(通用模板):
在高并发场景下,我们主要使用 Sentinel 实现 QPS 限流,通过 WarmUp(预热)、RateLimiter(匀速器)等限流控制器削峰,防止系统瞬间过载。配合 fallback 策略或队列削峰,保证核心功能稳定。同时可利用热点参数限流防止特定资源打满系统。
具体做法:
-
WarmUp 限流器:预热型限流,适合突发流量避免冷启动压垮系统。
-
RateLimiter 限流器:漏桶方式,匀速处理流量。
-
热点参数限流:防止攻击型、倾斜型访问打垮某接口。
-
隔离非核心接口:对非核心接口设低阈值限流。
-
降级 + 异步队列(削峰):应对高并发压力。
✅ 六、Spring Cloud 中哪些组件可以限流?
组件 | 是否支持限流 | 说明 |
---|---|---|
✅ Sentinel | ✅ 强 | 接口级、参数级、调用链级 |
✅ Gateway + Sentinel | ✅ 强 | 网关层限流,适合 BFF 网关或微前端 |
✅ Spring Cloud Gateway + Resilience4j | ✅ 支持 | 更偏向容错(熔断、限流) |
✅ Nginx + Lua 限流插件 | ✅ 支持 | 靠近入口层限流,高性能,但粒度粗 |
✅ Redis + Lua 限流 | ✅ 可自定义 | 适合集群统一限流场景 |
✅ 七、如果面试官问“你看过源码吗?”
推荐答法:
是的,Sentinel 的限流机制是通过 Slot 链的 FlowSlot 模块完成的,规则由 FlowRuleChecker 校验是否触发限流,底层统计使用了滑动窗口结构来记录每个资源的请求数。控制器使用不同的限流算法如 QPS、WarmUp、RateLimiter 控制是否通过请求,核心源码包括 FlowRule、FlowRuleManager、StatisticNode 等。
✅ 面试一段答题模板(参考):
Sentinel 是一款功能强大的流控组件,支持多种限流方式,包括 QPS、并发、热点参数等。它内部通过 Slot 链执行限流逻辑,限流规则由 FlowRuleChecker 执行,使用滑动窗口统计请求数。我们可以通过 Sentinel 控制台或代码配置限流规则,在高并发下通过 WarmUp 或 RateLimiter 限流器控制系统压力,保障稳定性。在我项目中,我们对核心接口设置了 QPS 限流,并用限流回调做容错处理,效果明显。
更多推荐
所有评论(0)