1 什么是 Sentinel
- Sentinel 是 2018 年, 阿里开源的一个轻量级流量控制组件
- 它以流量为切入点,从限流、熔断降级、系统负载等多个维度来保证服务端的稳定性
- 限流(flowslot):指定某个接口最大 QPS 或 最大并发线程数,当超过指定值时,会采用几种限流策略
- 通过 FlowRule.controlBehavior 字段指定
- 直接拒绝(0)
- 预热(1):当突然有大流量来时,会逐渐提高流量限制的阈值,最终才达到指定值。用来应对服务端初始化资源时和初始化资源后,它的流量负载能力不一样的场景
- 流量规整(2):使得流量按规定的 QPS 进入资源,其余的等待(有最大等待时间)
- 预热 + 流量规整(3)
- 熔断降级(degradeslot):当某个资源的平均响应时间或异常比例超过指定值时拒绝请求
- 系统负载:当应用的 QPS、并发线程数、CPU 使用率、平均响应时间等达到指定值时拒绝请求
- 限流(flowslot):指定某个接口最大 QPS 或 最大并发线程数,当超过指定值时,会采用几种限流策略
2 Sentinel 核心概念简介
2.1 resource
- 资源是对受保护的某一方法或代码块的唯一标识,用 resourceName 来表示
2.2 context
- 用 context 来构成资源调用的链路
2.3 slot
- 它是 Sentinel 功能实现的核心,通过不同的 slot 来做不同维度的保护,如 flowSlot 做限流保护、degradeSlot 做熔断降级保护、paramSlot 做热点参数限流保护、systemSlot 做系统负载保护、statisticSlot 收集 Metrics 数据等
2.4 slotChain
- 由多个 slot 串联成的一个调用链,这样使得所有定义的 slot 按一定的顺序执行
2.5 slotChainBuilder
- 通过不同的 slotChainBuilder 来创建不同的 slotChain,默认为 DefaultSlotChainBuilder,可以通过 SPI 接口扩展自定义的 slotChainBuilder
2.6 Node
- 通过不同的 Node 收集 Metrics 数据,各个 Slot 就是使用 Node 中的数据来做保护判断的,如 QPS、并发线程数都被实时的收集在不同的 Node 中
3 Sentinel 扩展点
3.1 InitFunc
- 通过实现 InitFunc 接口,并且在 META-INF/services 目录下的 com.alibaba.csp.sentinel.init.InitFunc 文件中指定该实现类全名
- 当第一次资源调用的时候,就会通过 Env 类中的 static 块加载到,并且运行 init 方法
- 所以我们可以在项目中创建 InitFunc 实例,并指定
- 如通过 InitFunc 实例来初始化配置数据源
- 如 sentinel-parameter-flow-control 包中就通过此扩展点注册了 ParamFlowStatisticEntryCallback 和 ParamFlowStatisticExitCallback
3.2 StatisticSlotCallbackRegistry
- StatisticSlot 中会调用此类来获取所有的 SlotEntryCallback、SlotExitCallback 实例 的 onPass、onBlocked 、onExit 来处理其他的一些成功或阻塞后的一些逻辑
- 如 ParamFlowStatisticCallback 来处理热点参数的线程数信息
- 注册动作可以通过 InitFunc 方式来添加 Callback 实例
3.3 SlotChainBuilder
- 通过实现 SlotChainBuilder 接口,并且在 META-INF/services 目录下的 com.alibaba.csp.sentinel.slotchain.SlotChainBuilder 文件中指定该实现类全名
- 当第一次资源调用的时候,就会通过 SlotChainProvider 类加载此文件中指定的类,如果有多个实例,就会选取一个最为唯一的 SlotChainBuilder 类
- 所以我们可以在项目中创建 SlotChainBuilder 实例,并指定
- 如我们需要自定义某种 slot,那就需要通过自定义 SlotChainBuilder 来将我们定义的 slot 加入到 slotChain 中
- 如 sentinel-parameter-flow-control 包中就通过此扩展点实现了 HotParamSlotChainBuilder,将 ParmaFlowSlot 加入到 slotChain 中
3.4 MetricExtension
- 通过实现 MetricExtension 接口,并且在 META-INF/services 目录下的 com.alibaba.csp.sentinel.metric.extension.MetricExtension 文件中指定该实现类全名
- 当第一次资源调用的时候,就会通过 MetricExtensionProvider 类加载此文件中指定的类,并放入 metricExtensions 列表中
- 目前 在 MetricEntryCallback、MetricExitCallback 中就会调用所有的 MetricExtension 实例
- 作用:可以通过它对 statistic 做扩展
4 Slot 简介
4.1 NodeSelectorSlot
- 生成 contextName 对应的 resource 属性,并存入 map 中
- 此 map 为 实例属性,又因为 一个 slot 实例对应一个 resourceName
- 所以这个 map 存储的是