看了一下Sentinel的一些核心源码,总结了一点原理,CSDN大佬们看看有什么细节问题? 求指点!!!
sentinel是把不同功能的slot通过SPI的方式按照order属性顺序组成一个责任链进行数据的统计和规则的判断.
数据统计的slot有
NodeSelectorSlot: 是创建调用树的 context和EntranceNode 一一对应 一个入口会有多个DefaultNode他跟资源一一对应的 他统计一个资源在一个context中的数据
ClusterBuilderSlot: 是创建ClusterNode, clusterNode是统计一个资源在所有Context中的数据 存储资源统计信息以及调用者信息
StatisticSlot: 通过时间滑动窗口的限流算法来进行数据统计的 跟普通的时间滑动窗口不同的是它用样本窗口的方式解决了重复查询数据的过程,它把一个时间窗口分为了2个样本窗口也就是一个数组,数组中放的是windowWarp,windowWarp中会有一个value它就是metricBucket他里面会有longAddr的一个数组存放的不同维度的数据比如 pass,exception等等 到这他就完成了数据的统计
判断规则部分:
根据rules来进行校验 主要就说两种
Flowslot 流控 它首先会根据资源获取制定的规则,然后会根据你的限流效果也就是直接拒绝还是warp up或者是排队等待去具体的实现类,然后根据你的限流类型去获取数据比如QPS还是线程数,QPS的话呢它会获取到你的当前时间窗口中的pass维度的一个数据然后去除以时间窗口的长度.获取到数据之后会当前的QPS数加上你的获取到的数据来判断是否超出阈值,超出阈值的话抛出FLowException它是继承了BlockException的异常
DegradeSlot 熔断降级,他首先也是根据资源获取制定的规则,然后看熔断器的一个状态如果是close的话就直接通过,如果是Open的话它会判断一下当前时间是否>重试时间还会通过CAS无锁的方式去把状态从Open状态改为HalfOpen状态也就是半开如果都为true的话就通过,否则抛出DegradeException他也是继承了BlockException的异常