Sentinel 限流降级源码分析
Sentinel 是阿里开源的流量治理组件,滑动窗口的 QPS 统计算法和令牌桶的限流实现是它的核心。本文深入源码一探究竟。
一、Sentinel 的核心概念
- 1.1 资源(Resource)——需要保护的代码片段
- 1.2 规则(Rule)——限流/熔断/降级规则
- 1.3 入口(Entry)——
SphU.entry()获取资源访问许可 - 1.4 核心架构——责任链模式(Slot Chain)
二、滑动窗口统计
- 2.1 固定窗口的缺陷——窗口切换时的”突刺”现象
- 2.2 滑动窗口算法——窗口细分 + 滑动
- 2.3 Sentinel 的
LeapArray——环形数组 + 时间窗口 - 2.4
WindowWrap——每个窗口的数据存储 - 2.5
currentWindow()——窗口获取与滑动逻辑 - 2.6
MetricBucket——统计指标(pass/block/success/exception/rt)
三、限流算法实现
- 3.1
FlowRuleChecker.canPassCheck() - 3.2 快速失败——
DefaultController - 3.3 预热/冷启动——
WarmUpController,令牌桶算法 - 3.4 排队等待——
RateLimiterController,漏桶算法 - 3.5
WarmUpController的预热曲线——warningToken/maxToken
四、熔断降级实现
- 4.1 三种熔断策略——慢调用比例、异常比例、异常数
- 4.2
DegradeRule——熔断器状态机 - 4.3 半开状态——探测恢复
- 4.4
CircuitBreaker的核心逻辑
五、@SentinelResource 注解的使用
- 5.1
value——资源名 - 5.2
blockHandler——限流后的降级处理 - 5.3
fallback——业务异常的处理 - 5.4 blockHandler 和 fallback 的区别
六、规则持久化与动态配置
- 6.1 默认规则的丢失问题——存在内存中
- 6.2 推模式 vs 拉模式
- 6.3 Datasource 扩展——Nacos / Apollo
- 6.4 规则的动态下发
七、总结
- Sentinel 的设计精华——Slot Chain + 滑动窗口 + 自适应算法
- 与 Hystrix / Resilience4j 的对比
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 谜思录!