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 的对比