Sentinel熔断限流器工作原理

Sentinel控制台页面

Sentinel核心架构图

如图上半部分是做数据统计的
下面部分就是使用统计的数据做规则的校验
整个过程就是一个链

Sentinel核心骨架是ProcessorSlotChain(处理器槽链)
其将不同的Slot按照顺序串在一起(责任链模式) 从而将不通的功能合在一起(限流、降级、系统保护)

系统会为每个资源创建一套SlotChain
复制代码

SPI(服务处理接口)机制

Sentinel槽链中各Slot的执行顺序是固定好的
但并不是绝对不能改变的
Sentinel将ProcessorSlot作为SPI接口进行扩展
使得SlotChain具备了扩展能力
用户可以自定义Slot并编排Slot之间的顺序
复制代码

可以把自定义的slot插入到链的任意位置
复制代码

NodeSelectorSlot

负责收集资源的路径,并将这些资源的调用路径,用树状结构存储起来,用于根据调用路径来限流降级
复制代码

ClusterBuilderSlot

用于存储统计资源信息以及调用者信息 例如该资源的RT、QPS、thread count、Block count、Exception count等 这些信息将用作多维度限流,降级的依据
就是用于构建ClusterNode
复制代码

StatisticSlot

用于记录,统计不同维度的runtime指标监控信息
底层使用的滑动时间窗口算法
复制代码

ParamFlowSlot

对应"热点流控"
复制代码

FlowSlot

对应的是"流控规则"
根据预设的限流规则以及前面slot统计的状态 来进行流量控制
复制代码

AuthoritySlot

根据配置的黑白名单和调用来源信息 来做黑白名单控制 对应"授权规则"
复制代码

DegradeSlot

通过统计信息以及预设的规则 来做熔断降级 对应"熔断规则"
复制代码

SystemSlot

对应"系统规则" 通过系统的状态 例如load等来控制总的入口流量
复制代码

接下来分析架构图

调用树

调用树由NodeSelectorSlot创建的

Root节点:一个应用就属于一个Root节点
复制代码

同一个应用的每个请求都会走SlotChain这个调用链
第一个请求过来之后 看是否有Root节点 如果没有则会创建
再来请求过来就不会新建了
复制代码

查看ClusterNode、DefaultNode、EntranceNode、Node、StatisticNode之间的关系

EntranceNode、DefaultNode、查看ClusterNode都是继承的StatisticNode 说明这些节点都是用于统计的

要想弄明白这些节点之间的区别 先来看下Context这个概念
复制代码

Context

Context是对资源操作的上下文 每个操作必须属于一个Context
如果代码中没有指定Context 则会创建一个name为sentinel_default_context的默认Context
一个Context生命周期可以包含多个资源操作
Context生命周期中的最后一个资源在exit()时会清理该Context 这也意味着这个Context的生命周期结束了
复制代码

一个Context生命周期可以包含多个资源操作

这个就是在一个context里面包含2个资源的操作
复制代码

在一个应用中包含2个Context
每个Context都包含了对2种资源的访问
2个Context访问的2种资源有重合的部分 即都访问了resource2
复制代码

代码了解到这里之后 再来解释下架构图中的调用树了

  • Node
用于完成数据统计
复制代码
  • StatisticNode
统计节点,是Node接口的实现类,用于完成数据统计
复制代码
  • EntranceNode
入口节点,一个Context上下文会有一个入口节点,用于统计当前Context的总体流量数据
复制代码
  • DefaultNode
默认节点 用于统计"一个资源"在"当前Context"中的流量数据
复制代码
  • ClusterNode
集群节点 用于统计一个资源在所有Context中的总体流量

上图中的2个Context中的DefaultNode2 被ClusterNode2汇总

该节点是由ClusterBuilderSlot处理器槽创建
复制代码

猜你喜欢

转载自juejin.im/post/7018944892713992205