Sentinel FlowSlot 流控管理
sentinel 触发流控的类为FlowSlot,在sentinel中触发流控需要经过以下几个步骤:
- 设置流控规则
- 采集调用信息
- 根据调用信息、流控规则决定是否进行限流
1.FlowSlot
我们先来了解下FlowSlot的类注释,通过注释来认识FlowSlot类有哪些功能,会做一些什么样的处理:
- 合并了从以前的插槽(NodeSelectorSlot,ClusterNodeBuilderSlot和StatisticSlot),FlowSlot收集的运行时统计信息将使用预设规则来决定是否应阻止传入请求。
- 调用SphU.entry(resourceName)方法,如果有任何规则被触发将抛出:CodeFlowException,用户可以通过捕捉CodeFlowException自定义自己的逻辑。
- 一个资源可以有多个流规则。FlowSlot遍历这些规则,直到触发其中一个规则或遍历了所有规则。
- 每个流控规则主要由以下因素组成:grade、strategy、path。我们可以结合这些因素来达到不同的效果。
2.Rule 配置对象
Sentinel Dashboard添加流控规则操作界面:
FlowRule类图:
Resource:资源名称
limitApp:
流控规则中的 limitApp 字段用于根据调用来源进行流量控制。该字段的值有以下三种选项,分别对应不同的场景:
- default:表示不区分调用者,来自任何调用者的请求都将进行限流统计。如果这个资源名的调用总和超过了这条规则定义的阈值,则触发限流。
- {some_origin_name}:表示针对特定的调用者,只有来自这个调用者的请求才会进行流量控制。例如 NodeA 配置了一条针对调用者caller1的规则,那么当且仅当来自 caller1 对 NodeA 的请求才会触发流量控制。
- other:表示针对除 {some_origin_name} 以外的其余调用方的流量进行流量控制。例如,资源NodeA配置了一条针对调用者 caller1 的限流规则,同时又配置了一条调用者为 other 的规则,那么任意来自非 caller1 对 NodeA 的调用,都不能超过 other 这条规则定义的阈值。
同一个资源名可以配置多条规则,规则的生效顺序为:{some_origin_name} > other > default
grade:限流控制的阈值类型(0:线程数,1:QPS)。
count:限流控制阈值计数。
strategy:限流控制策略,默认为STRATEGY_DIRECT
refResource:在具有相关资源或上下文的流控制中引用资源。
controlBehavior:流量控制后的采取的行为,默认为DefaultController
warmUpPeriodSec:预热时间,如果 controlBehavior 设置为预热(warm up)时,可以配置其预热时间,默认值 10s
maxQueueingTimeMs:
最大超时时间,如果 controlBehavior 设置为排队等待时,等待的最大超时时间,默认为500ms
clusterMode:是否是集群限流模式
clusterConfig:集群扩容相关配置
3.FlowSlot 详解
FlowSlot类结构非常简单,就持有一个CheckRule对象和简单的几个方法,我们重点是要关FlowRuleChecker类:
@SpiOrder(-2000)
public class FlowSlot extends AbstractLinkedProcessorSlot