sentinel-client
2021-12-21 18:24:38 11 举报
sentinel客户端核心执行逻辑
作者其他创作
大纲/内容
FlowSlot流控规则
继续,不改变断路器状态
是否是集群模式
通过 spi 获取所有ProcessorSlot并排序添加到调用链中
selectNodeByRequesterAndStrategy根据配置的策略选择节点
如果允许优先并且是 qps 类型则抛出PriorityWaitException
DegradeSlot#exit
SystemRuleManager#checkSystem校验系统规则
Constants.ROOT.addChild(node),并添加到全局根节点下
MetricBucket#addPass对当前窗口 LongAdder[] counters 增加成功数量
LeapArray#currentWindow()获取当前窗口
StatisticSlot#exit统计信息
PriorityWaitException需要优先执行
BlockException
tryPass尝试一下
否
LogSlot出现异常是打 log
是
加上请求数量是否大于配置
Node#passQps获取当前滑动窗口内所有请求数量
SlotChainBuilder通过 spi 获取改接口默认为DefaultSlotChainBuilder
node.addRtAndSuccess添加执行时间逻辑与前面添加请求成功数量一致
DefaultNode#increaseBlockQps添加失败次数,和添加成功次数逻辑一致
new CtEntry创建当前节点
StatisticSlot专用于实时统计的处理器插槽
ClusterFlowChecker#acquireClusterToken最后都会调用这个
META-INF/services/com.alibaba.csp.sentinel.slotchain.ProcessorSlot所有默认的 ProcessorSlot
node.decreaseThreadNum()减少线程数量
node.increaseThreadNum()添加线程数量
DefaultProcessorSlotChain创建调用链
lookProcessChain查找调用链
SlotChainProvider#newSlotChain创建调用链
slotChainBuilder.build()
CtSph#entryWithPriority非异步都会到这来处理
DegradeSlot#entry断路器
请求是否通过,即没有异常
chain.entry执行调用链
StatisticSlot 先调用后面调用链,在进行统计
ResponseTimeCircuitBreaker通过响应时间来控制断路器状态
DefaultController默认算法
WarmUpRateLimiterController带预热的流量控制器
ContextUtil#trueEnter
集群分服务端和客户端服务端直接调用改方法,客户端则通过netty 调用
主流程就是这,剩下的实现全在调用链中实现
放行
LeapArray 是 Sentinel中统计指标的基本数据结构,一个滑动时间窗口,默认分成 60 个人格子,一秒一格
ProcessorSlotEntryCallback执行成功调用 onPass否则调用 onBlocked
FlowRuleChecker#checkFlow校验流控规则
RateLimiterController漏桶算法,通过控制两个请求的时间间隔来控制
NodeSelectorSlot构建调用树
SystemSlot校验系统规则
不通过,抛出FlowException
recordCompleteFor统计时间已经成功次数
.StatisticNode#increaseExceptionQps添加异常请求次数
InternalContextUtil#internalEnter创建上下文
SphU#entry
ProcessorSlot执行调用链
TrafficShapingController#canPass进行校验
MetricEvent 统计类型枚举PASS 成功通过BLOCK 没有通过EXCEPTION 业务异常SUCCESS 调用完成,不管是否发生异常RT 所有 success 总时间
.SystemStatusListener每一秒执行一次获取系统信息
AbstractCircuitBreaker#fromOpenToHalfOpen过了配置的时间后尝试一下进入半开状态
CircuitBreaker#onRequestComplete在请求完成后调用
AuthoritySlot资源授权规则
WarmUpController带预热的
处理方式和为发生异常一样,只是通过异常来优先执行
异常
ArrayMetric#addPass
EntranceNode创建入口节点
ClusterBuilderSlot构建一个全局唯一的插槽
node.addPassRequest添加请求成功数量
断路器是否打开
passLocalCheck进行本地校验
MetricBucket 为每一秒统计单元实际上就是一个 LongAdder 数组
ExceptionCircuitBreaker通过异常数量来控制断路器状态
Entry.exit
0 条评论
下一页