AuthoritySlot
作用
权限控制,根据 origin 做黑白名单的控制:
在 dashboard 中,是这么配置的:
这里的调用方就是 origin。
SystemSlot
作用
实现自适应限流。
- 规则校验都在 SystemRuleManager#checkSystem
- 我们先说说上面的代码中的 RT、线程数、入口 QPS 这三项系统保护规则。
- dashboard 配置界面
- StatisticSlot 类有下面一段
- Sentinel 针对所有入口流量,使用了一个全局的 ENTRY_NODE 统计,系统保护规则是全局的,和具体某个资源没有关系。
由于系统的平均 RT、当前线程数、QPS 都可以从 ENTRY_NODE 中获得,所以限制代码非常简单,比较一下大小即可。超过阈值抛 SystemBlockException。
ENTRY_NODE 是 ClusterNode 类型,而 ClusterNode 对于 rt、qps 都是统计秒维度。
系统负载和 CPU 资源
Sentinel 通过调用 MBean 中的方法获取当前的系统负载和 CPU 使用率,Sentinel 起了一个后台线程,每秒查询一次。
dashboard 中对于 CPU 使用率的规则配置
FlowSlot
Sentinel 本身定位就是个流控工具,所以 FlowSlot 非常重要。
这部分代码涉及到限流算法,稍复杂。
案例
设 QPS 为 10,那么每 100ms 允许通过一个,通过计算当前时间是否已经过了上一个请求的通过时间 latestPassedTime 之后的 100 毫秒,来判断是否可以通过。假设才过了 50ms,那么需要当前线程再 sleep 50ms,然后才可以通过。如果同时有另一个请求呢?那需要 sleep 150ms。
DegradeSlot
它有三个策略,我们首先说说根据 RT 降级:
原理
若按照上面截图所示配置:对 getUserInfo 资源,正常情况下只需 50ms,若它的 RT 超过 100ms,则进入半降级状态,接下来的 5 次访问,如果都超过了 100ms,那么在接下来的 10 秒内,所有的请求都会被拒绝。
DegradeRule#passCheck
Sentinel 使用了 cut 作为开关,开启这个开关以后,会启动一个定时任务,过了 10秒 以后关闭这个开关。
达到阈值,开启断路器,之后由定时任务关闭。