sentinel
2022-09-05 14:13:22 17 举报
sentinel源码
作者其他创作
大纲/内容
circuitBreakers = DegradeRuleManager.getCircuitBreakers(r.getName());
更新/构建缓存1.放入之前所有资源对应缓存2.放入当前资源的责任链3.新缓存替换旧缓存
SentinelResourceAspect.java
aop切注解
true
调用责任链每个节点退出
计算阈值
后面再补先看主线
error == null
catch (Throwable ex) {...}
currentState.get() == State.OPEN
return false
如果当前资源名无对应责任链就构造一个(chainMap)
总数小于最小请求数直接退出
封装关系并放入上下文
slotChainBuilder.build()
半开开启判断
责任链调用
RateLimiterController.canPass
例如其中一个规则slot:@Spi(order = Constants.ORDER_FLOW_SLOT) //-2000public class FlowSlot extends AbstractLinkedProcessorSlot<DefaultNode>
检测是qps还是thread并获取当前节点通过的请求数
ruleProvide会去拿到所有流控的规则缓存并通过当前资源的名称拿到自己的
currentState.get() == State.CLOSED
处理调用结果
totalCount < minRequestAmount
排队等待策略
return true
默认是false
检测是否到达设置阈值
curCount > threshold
fireEntry
通过spi类加载slot
如果超过设置阈值+1
chain = SlotChainProvider.newSlotChain();
entry.getBlockError() != null
DefaultController.canPass
fromHalfOpenToOpen(1.0d);
sentinel与spring整合
counter.totalCount.add(1);
this.exitHandlers.add(handler);
ResponseTimeCircuitBreaker.onRequestComplete
大于阈值开启断路器
checker.checkFlow(font color=\"#4caf50\
counter.slowCount.add(1);
chain.addLast
抓取异常,熔断、流控异常等继承于BlockException
callExitHandlersAndCleanUp(context);
快速失败策略
最后比较设置的阈值大于就开启
ExceptionCircuitBreaker.onRequestComplete
finally
prioritized默认为false
currentRatio > maxSlowRequestRatio
根据order进行链表
WarmUpController.canPass
获取当前资源的所有熔断策略
fromHalfOpenToClose();
如果策略是异常比例就计算
cas 修改状态
FlowSlot.entry
异常数与异常比例策略
counter.getTotalCount().add(1);
其他
handleStateChangeWhenThresholdExceeded(rt)
调用下一个slot
fromOpenToHalfOpen()
rt > maxAllowedRt
遍历处理器然后执行
ProcessorSlot<Object> chain = lookProcessChain(resourceWrapper);
业务有错误发生重新打开
if (!cb.tryPass(context))
检测流控配置是否符合
循环调用不成功排除异常DegradeException
return pjp.proceed();
其他异常处理
获取责任链
失败
counter.getErrorCount().add(1);
断路器开启,异常
strategy == DEGRADE_GRADE_EXCEPTION_RATIO
StatisticNode.passQps
业务正常运行一次关闭断路器
SpiLoader.java
构造
returnretryTimeoutArrived() && fromOpenToHalfOpen(context)
int curCount = avgUsedTokens(node);
callExitHandlersAndCleanUp有处理
断路器关闭,正常
总数+1
如果是半开状态这里检测是否符合阈值
这里根据流控方式与应用选择对应节点检测规则直接检测自己,链路检测配置的资源等
最后调用到这里
fireExit
超出返回时间超时策略
prioritized && grade == RuleConstant.FLOW_GRADE_QPS
retryTimeoutArrived()
clearEntryContext();
处理断路器状态
SphU.entry
打开断路器与通知
处理状态
符合阈值关闭断路器
FlowRuleManager.getFlowRuleMap()
如果有block异常就直接打开断路器
下一个slot
跳过集群直接看单机
执行业务
调用ruleProvider拿到当前资源的所有流控规则然后检测是否通过不通过就抛出FlowException
@Pointcut(\"@annotation(com.alibaba.csp.sentinel.annotation.SentinelResource)\")
超出阈值重新打开断路器
如果有异常,异常+1
DegradeSlot.entry
invokeResourceWithSentinel
sentinel主要责任链
看一下这里的qps滑动窗口算法
return false;
rollingCounterInSecond.pass() / rollingCounterInSecond.getWindowIntervalInSec()
责任链构造器(链表)
检测是否大于等于设置的半开时间
预热策略
curCount + acquireCount > count
long rt = completeTime - entry.getCreateTimestamp()
catch (BlockException ex)
circuitBreaker.onRequestComplete(context);
。。。
checkFlow
entry.whenTerminate(new font color=\"#b71c1c\
DegradeSlot.exit(...)
返回时间计算
如果是半开状态这里检测是否执行异常
CtEntry.exitForContext(...)
检测checker定义了检测的方法
handleStateChangeWhenThresholdExceeded(error);
到达半开时间点尝试
@Around
先看重要的两个后续再更新其他的slot
slotChainBuilder = SpiLoader.of(SlotChainBuilder.class).loadFirstInstanceOrDefault();
调用下一个
0 条评论
下一页