Sentinel核心源码解析
承接上文
Sentinel熔断限流器工作原理
Sentinel云原生K8S部署实战
从依靠入手分析
https://p6.toutiaoimg.com/large/pgc-image/1cf1298b80de4300bbdf180af38ed1aa
https://p6.toutiaoimg.com/large/pgc-image/f625bde3ed2b43699e6db965fa5fe2cb
SentinelAutoConfiguration类中有SentinelResourceAspect bean定义
https://p26.toutiaoimg.com/large/pgc-image/5bc602bf9a2e45b6971734f8d0cef719
@ConditionalOnMissingBean 这个注解表示当没有这个bean存在的时候 就创建;AOP切面切入点
https://p26.toutiaoimg.com/large/pgc-image/288f8627454f4f26adb43f059bce998c
围绕通知注解完成目标方法的调用
https://p5.toutiaoimg.com/large/pgc-image/f2509d72e5a14b5b9ceafbb7fa30013b
SphU.entry 获取目标资源
在这之前没有创建Context 所以就会创建默认的Context
https://p26.toutiaoimg.com/large/pgc-image/dfdb3a056ee64253824550dc8165ab5e
https://p6.toutiaoimg.com/large/pgc-image/bceec2551ae442c9a15c81f09eadf350
count参数表示当前请求可以增加多少个计数默认是1 即一个请求过来之后 访问数目增加1注意第五个参数值是false返回一个具有优先级的资源对象
https://p5.toutiaoimg.com/large/pgc-image/3d537879e38f437b8ea7567f4948e94d
优先级参数默以为false获取Context
https://p26.toutiaoimg.com/large/pgc-image/6f956bfa772945b799b071f918cf3c0f
https://p9.toutiaoimg.com/large/pgc-image/696184ead52a41339e95a812660eb7d6
https://p9.toutiaoimg.com/large/pgc-image/32a1c83d6dc74a649d4b31abb45c7b59
从ThreadLocal中获取即Context和当前线程是绑定的
一个请求会占用一个线程,一个线程会绑定一个context
https://p5.toutiaoimg.com/large/pgc-image/df2cf18df4e840f39fc2bd2d02dcc022
https://p26.toutiaoimg.com/large/pgc-image/da5ea24b440a478b8a0a2391b0892d23
创建默认的context
https://p3.toutiaoimg.com/large/pgc-image/49a95e8caa4e45c88db00285077fc929
https://p6.toutiaoimg.com/large/pgc-image/89518d4001cb41f7ad8656c5d2bb1eb3
确认一个contxt 需要2个属性 一个是资源名称一个是来源
https://p26.toutiaoimg.com/large/pgc-image/86128efd720b4da780c2ef3bbab91040
新建node放入缓存map 该写法为了防止迭代稳定性问题
https://p3.toutiaoimg.com/large/pgc-image/c66eca8695be4ebb942bc928b261306a
对于共享聚集的写操纵 要采用这种方式 否则可能会读到脏数据查找SlotChain
https://p26.toutiaoimg.com/large/pgc-image/8f5db79b510b48d687e4c9f486c3e0d5
具体创建SlotChain的过程
https://p5.toutiaoimg.com/large/pgc-image/3d89a7d53d3f47638bcff08d78081320
https://p6.toutiaoimg.com/large/pgc-image/5e2111efc45a464580826e9211df69a3
https://p26.toutiaoimg.com/large/pgc-image/73eed1e0bdad4648bab1188dbff260e1
怎么build一个chain
https://p9.toutiaoimg.com/large/pgc-image/ef66e61da91641a1a907472688a5ce1c
又是通过SPI读取设置文件进行构建
https://p26.toutiaoimg.com/large/pgc-image/077f553888c14e739dda80aa580c141c
https://p9.toutiaoimg.com/large/pgc-image/f39bc30357674f44af17034f12931d5a
https://p26.toutiaoimg.com/large/pgc-image/eae6670092174b60b6f3ef28f40058ae
每个slot都会有一个order标签 越小加载的优先级更高
https://p3.toutiaoimg.com/large/pgc-image/dc1350ead7b14cc09ec4b095a43f5c90
ProcessorSlotChain是一个单向链表 默认包罗一个节点
https://p26.toutiaoimg.com/large/pgc-image/d3eea9f202694ac7b5e135e5ad306811
first和ent这两个指针都指向了一个节点chain.entry 对资源进行操纵
该chain就是DefaultProcessorSlotChain 单向链表转换操纵对象即从first节点转换下一个节点
https://p26.toutiaoimg.com/large/pgc-image/81daf2539bb541a6822002440f5bd9ce
下一个节点才是真正创建的 不是默认创建的进入下一个节点
https://p26.toutiaoimg.com/large/pgc-image/fd2bd21c5f844818af6a15fef84be9a7
下一个节点是谁?
https://p5.toutiaoimg.com/large/pgc-image/714ccb75f12747c396ab0d2dadc6e602
第一个首先走的是NodeSelectorSlot
这个是干嘛的?创建节点调用树的
https://p9.toutiaoimg.com/large/pgc-image/8197b8bd72ca4719b3ca25b8b6227d44
这个调用树中的EntranceNode在Context已经创建了 还差DefaultNode
https://p6.toutiaoimg.com/large/pgc-image/2a68293fecf9411b9e4a0fb9d94a0ab0
先从缓存中获取DefaultNode然后双重检查校验DCL 防止重复创建创建DefaultNode并放入缓存中将新建Node添加到调用树中然后再出发下一个节点ClusterBuilderSlot
https://p3.toutiaoimg.com/large/pgc-image/c75846ba56e4459386b14f48116e2bf8
https://p5.toutiaoimg.com/large/pgc-image/5d99048bfef44db1be34edc5e6e808d8
然后再下个节点就是StaticSlot
https://p5.toutiaoimg.com/large/pgc-image/7c635fd89a904d7aa545e4fef6811f6c
https://p26.toutiaoimg.com/large/pgc-image/705c3ebba5804ad38e54acfee8338bb5
FlowSlot
https://p5.toutiaoimg.com/large/pgc-image/7b4ca20d1be44d39976ef9c5e30adfc4
https://p9.toutiaoimg.com/large/pgc-image/2e84263490fc46be97c5fdfbc446e291
FlowRule
包罗的属性:resource 资源名称limitapp 来源 默认default 全部来源应用grade 阈值类型 0=线程数限流 1=QPS限流count 阈值strategy 流控模式 :直接、关联、链路refResource 假如流控模式是关联,关联资源是什么流控结果 0=快速失败,1=warm up(令牌桶算法),2=列队等候(漏斗算法),3=warm up+列队等候warmUpPeriodSec 预热时长maxQueueingTimeMs 列队等候超时时间clusterMode 是否是集群模式获取指定资源的全部流控规则
https://p3.toutiaoimg.com/large/pgc-image/66e592919d8b44769965ddbee0db101b
检查规则是否可以通过
https://p9.toutiaoimg.com/large/pgc-image/b8c4863c51c34804b3eee5b6d31f9d56
单机流控
https://p3.toutiaoimg.com/large/pgc-image/59cc9943836d4a45aba1078ab541b1ee
根据不同的流控结果选择不同的校验类
https://p3.toutiaoimg.com/large/pgc-image/c44a6a6696274391a3ad23b039527a81
快速失败的流控结果中的通过性判断
https://p5.toutiaoimg.com/large/pgc-image/7cafaee8c38947f8839c83baef3c766d
获取当前时间窗已经统计的数据
https://p26.toutiaoimg.com/large/pgc-image/b36e0da14dd74202a7ef797fd837eedf
计算QPS
https://p5.toutiaoimg.com/large/pgc-image/69c1e70f46404a23ae963c5c862a2c50
熔断降级DegradeSlot
https://p9.toutiaoimg.com/large/pgc-image/c32b1ca29e3946d1ade9b5593dbb383c
熔断逻辑
https://p6.toutiaoimg.com/large/pgc-image/bf6b6b7109e249208d6f84ddabd4d96e
CircuitBreaker
1.8版本将三种熔断策略(慢调用/异常比/异常数) 封装为2中策略 : 响应时间熔断器与异常熔断器
[*]getRule
获取降级规则
[*]tryPass
判断请求是否可以通过返回true 表示通过 则不用降级否则降级
[*]onRequestComplete
回调方法,当请求通过并完成后会触发
[*]currentState
获取当前熔断器的状态State
OPEN: 打开状态,会拒绝全部CLOSED:关闭状态,全部请求可以通过HALF_OPEN:过渡状态,尝试性调用 假如请求不正常(响应很慢)则OPEN即请求拒绝;否则CLOSED 允许请求访问https://p5.toutiaoimg.com/large/pgc-image/90c6ddeeed4a4e54acb953e7e889f8c2
结语
下回分解滑动时间窗口原理及源码~
页:
[1]