创意电子

标题: Sentinel核心源码解析 [打印本页]

作者: 平凡人笔记    时间: 2021-10-16 23:53
标题: Sentinel核心源码解析


承接上文

Sentinel熔断限流器工作原理

Sentinel云原生K8S部署实战
从依靠入手分析


                               
登录/注册后可看大图


                               
登录/注册后可看大图

SentinelAutoConfiguration类中有SentinelResourceAspect bean定义


                               
登录/注册后可看大图

@ConditionalOnMissingBean 这个注解表示当没有这个bean存在的时候 就创建;AOP切面
切入点


                               
登录/注册后可看大图

围绕通知注解完成目标方法的调用


                               
登录/注册后可看大图

SphU.entry 获取目标资源
在这之前没有创建Context 所以就会创建默认的Context


                               
登录/注册后可看大图


                               
登录/注册后可看大图

count参数表示当前请求可以增加多少个计数默认是1 即一个请求过来之后 访问数目增加1注意第五个参数值是false
返回一个具有优先级的资源对象


                               
登录/注册后可看大图

优先级参数默以为false
获取Context


                               
登录/注册后可看大图


                               
登录/注册后可看大图


                               
登录/注册后可看大图

从ThreadLocal中获取即Context和当前线程是绑定的
一个请求会占用一个线程,一个线程会绑定一个context


                               
登录/注册后可看大图


                               
登录/注册后可看大图

创建默认的context


                               
登录/注册后可看大图


                               
登录/注册后可看大图

确认一个contxt 需要2个属性 一个是资源名称一个是来源


                               
登录/注册后可看大图

新建node放入缓存map 该写法为了防止迭代稳定性问题


                               
登录/注册后可看大图

对于共享聚集的写操纵 要采用这种方式 否则可能会读到脏数据
查找SlotChain


                               
登录/注册后可看大图

具体创建SlotChain的过程


                               
登录/注册后可看大图


                               
登录/注册后可看大图


                               
登录/注册后可看大图

怎么build一个chain


                               
登录/注册后可看大图

又是通过SPI读取设置文件进行构建


                               
登录/注册后可看大图


                               
登录/注册后可看大图


                               
登录/注册后可看大图

每个slot都会有一个order标签 越小加载的优先级更高


                               
登录/注册后可看大图

ProcessorSlotChain是一个单向链表 默认包罗一个节点


                               
登录/注册后可看大图

first和ent这两个指针都指向了一个节点
chain.entry 对资源进行操纵

该chain就是DefaultProcessorSlotChain 单向链表
转换操纵对象即从first节点转换下一个节点


                               
登录/注册后可看大图

下一个节点才是真正创建的 不是默认创建的
进入下一个节点


                               
登录/注册后可看大图

下一个节点是谁?


                               
登录/注册后可看大图

第一个首先走的是NodeSelectorSlot
这个是干嘛的?创建节点调用树的


                               
登录/注册后可看大图

这个调用树中的EntranceNode在Context已经创建了 还差DefaultNode


                               
登录/注册后可看大图

先从缓存中获取DefaultNode然后双重检查校验DCL 防止重复创建创建DefaultNode并放入缓存中将新建Node添加到调用树中
然后再出发下一个节点ClusterBuilderSlot


                               
登录/注册后可看大图


                               
登录/注册后可看大图

然后再下个节点就是StaticSlot


                               
登录/注册后可看大图


                               
登录/注册后可看大图

FlowSlot


                               
登录/注册后可看大图


                               
登录/注册后可看大图

FlowRule

包罗的属性:resource 资源名称limitapp 来源 默认default 全部来源应用grade 阈值类型 0=线程数限流 1=QPS限流count 阈值strategy 流控模式 :直接、关联、链路refResource 假如流控模式是关联,关联资源是什么流控结果 0=快速失败,1=warm up(令牌桶算法),2=列队等候(漏斗算法),3=warm up+列队等候warmUpPeriodSec 预热时长maxQueueingTimeMs 列队等候超时时间clusterMode 是否是集群模式
获取指定资源的全部流控规则


                               
登录/注册后可看大图

检查规则是否可以通过


                               
登录/注册后可看大图

单机流控


                               
登录/注册后可看大图

根据不同的流控结果选择不同的校验类


                               
登录/注册后可看大图

快速失败的流控结果中的通过性判断


                               
登录/注册后可看大图

获取当前时间窗已经统计的数据


                               
登录/注册后可看大图

计算QPS


                               
登录/注册后可看大图

熔断降级DegradeSlot


                               
登录/注册后可看大图

熔断逻辑


                               
登录/注册后可看大图

CircuitBreaker

1.8版本将三种熔断策略(慢调用/异常比/异常数) 封装为2中策略 : 响应时间熔断器与异常熔断器
获取降级规则
判断请求是否可以通过返回true 表示通过 则不用降级否则降级
回调方法,当请求通过并完成后会触发
获取当前熔断器的状态
State

OPEN: 打开状态,会拒绝全部CLOSED:关闭状态,全部请求可以通过HALF_OPEN:过渡状态,尝试性调用 假如请求不正常(响应很慢)则OPEN即请求拒绝;否则CLOSED 允许请求访问

                               
登录/注册后可看大图

结语

下回分解滑动时间窗口原理及源码~




欢迎光临 创意电子 (https://wxcydz.cc/) Powered by Discuz! X3.4