在Sentinel 官网中,对基本原理这样写到

在 Sentinel 里面,所有的资源都对应一个资源名称以及一个 Entry。Entry 可以通过对主流框架的适配自动创建,也可以通过注解的方式或调用 API 显式创建;每一个 Entry 创建的时候,同时也会创建一系列功能插槽(slot chain)。这些插槽有不同的职责,例如:

NodeSelectorSlot :负责收集资源的路径,并将这些资源的调用路径,以树状结构存储起来,用于根据调用路径来限流降级;
ClusterBuilderSlot :则用于存储资源的统计信息以及调用者信息,例如该资源的 RT, QPS, thread count 等等,这些信息将用作为多维度限流,降级的依据;
StatisticSlot :则用于记录、统计不同纬度的 runtime 指标监控信息;
FlowSlot :则用于根据预设的限流规则以及前面 slot 统计的状态,来进行流量控制;
AuthoritySlot :则根据配置的黑白名单和调用来源信息,来做黑白名单控制;
DegradeSlot :则通过统计信息以及预设的规则,来做熔断降级;
SystemSlot :则通过系统的状态,例如 load1 等,来控制总的入口流量;

通过这些生硬的文字,初学者并不能理解这些是什么
以及抽象的总体框架图
在这里插入图片描述
从上图,初学者基本只能看懂 外部请求进来,然后经过一系列的链式调用
这一部分,如果结合源码分析,原理就很浅显易懂了
上图显示,Slot 槽的第一个是 NodeSelectorSlot,那么我们将断点打到 NodeSelectorSlot 这个类,会发现所有的槽是一个链表结构,每一个槽包含了下一个槽
在这里插入图片描述
接下来我们在看,这个链表是如何构建的
在CtSph这个类中,第一次出现了 chain 这个链表,由 lookProcessChain 方法构建

在这里插入图片描述
可以看到 chain 的构建使用了一个双检锁,实际是由 SlotChainProvider.newSlotChain(); 构建
在这里插入图片描述
在以下源码中,使用了SPI机制,先获取 SlotChainBuilder 插槽链构建器,默认使用DefaultSlotChainBuilder
在这里插入图片描述
接下来我们在看 DefaultSlotChainBuilder 是如何构建链表的,通过SPI机制获取 ProcessorSlot,说明我们不但可以自定义构建责任链,还可以扩展Slot,这里获取了 所有ProcessorSlot ,并遍历每个 slot,并添加到链表最后
在这里插入图片描述
添加到链表末尾也是很基础的写法了
在这里插入图片描述
看完了责任链的构建,我们再看是如何进入责任链的工作的,通过堆栈分析,是在DispatcherServlet 执行 applyPreHandle 的时候,执行了springmvc的请求拦截器,如图中可以看到一个 SentinelWebInterceptor
在这里插入图片描述
StatisticSlot :则用于记录、统计不同纬度的 runtime 指标监控信息;
通过代码可以看到,统计槽是要先等子槽执行完再进行统计,也会对失败进行统计
在这里插入图片描述
AuthoritySlot :则根据配置的黑白名单和调用来源信息,来做黑白名单控制;
对应的则是授权规则,
在这里插入图片描述
对应 sentinel-dashboard 则是如下页面,对调用方配置黑白名单,流控应用则是调用方,应该是在context中会带有调用方的信息
在这里插入图片描述
SystemSlot :则通过系统的状态,例如 load1 等,来控制总的入口流量;
下一个对应的系统规则,对应系统规则的判断则是写在 SystemRuleManager 中,可以看出和上一个的代码风格不太一致
在这里插入图片描述
也是通过 qps,thread,rt,load,cpu 系统状态来判断
在这里插入图片描述
对应的控制台页面则是
在这里插入图片描述
下一个 热点规则,对应的槽是 ParamFlowSlot ,
在这里插入图片描述
如果没有规则则不会走以下校验
在这里插入图片描述
对应的管控页面是
在这里插入图片描述
流控规则

在这里插入图片描述
对应的管控也面则是
在这里插入图片描述
最后一个是熔断规则
在这里插入图片描述
对应的管控页面是,如果对应的某个资源,在一定时间内,慢调用比例,异常比例,异常数,达到一个阈值,后面再进来的请求,就会触发熔断,可以配置熔断时长
在这里插入图片描述
本文章仅梳理Sentinel基本原理的执行流程,对于其中的slot的实现算法并未进行深入了解,让我们知道,管控页面的配置,是在代码中哪一个位置生效,以及基本作用。

以下是我对一些关键类的梳理
在这里插入图片描述

sentinel中还提供了一定的扩展点,可供用户自定义一些需求

总体来说,sentinel 的功能并不是很完善,基本功能可以仅用熔断限流来描述,限流功能的高级功能恐怕仅有集群限流了,但是集群限流就意为着会降低整个集群的性能,一般来说,系统级的本地限流已经够用了。对应黑白名单的的规则可以说是可有可无了,因为仅是支持对调用方进行控制

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐