Sentinel源码
2021-11-14 16:32:31 3 举报
Sentinel源码
作者其他创作
大纲/内容
通过客户端的流控规则判断检验线程数还是QPS
执行时出现业务异常
计算所属时间窗的idx
State.CLOSED
FlowSlot
canPass
waitTime 0
#SentinelResourceAspect@AroundinvokeResourceWithSentinel
State.OPEN
null
windowStart old.windowStart()
滑动时间窗算法
FlowSlot.entry
rollingCounterInSecond.addPass(count)
chain.exit
if判断
return true
long windowStart = calculateWindowStart(timeMillis)
SlotChainProvider.newSlotChain()
符合条件的实现类添加到流控链中(责任链模式)
DegradeSlot
检查熔断开关
SystemSlot
WindowWrap<T> old = array.get(idx);
tryPass
流控链退出
handleBlockException
lookProcessChain(resourceWrapper)
添加并记录线程数
expectedTime = currentTime
执行时出现BlockException异常
统计数量
NodeSelectorSlot.entry
LogSlot.entry
WindowWrap<MetricBucket> wrap = data.currentWindow();
从时间窗队列获得对应的window对象
@Beannew SentinelWebInterceptor()
for循环
按照不同的流控规则执行检验
#RateLimiterControllercanPass
检查流量
判断是否超过数量
检查黑白名单
avgUsedTokens
entry.exit
timeMillis - timeMillis % windowLengthInMs;
统计流量
增加调用数和执行时间
···
执行流控方法
Spring-cloud-starter-alibaba-sentinel中的spring.factories
#DefaultControllercanPass
执行bolckHandlerMethod方法
node.addRtAndSuccess
false
1.计算2个请求相隔时间2.计算期望时间3.判断时间
wrap.value().addPass(count);
if (curCount + acquireCount > count)
按照后台配置的流控效果走对应的Controller
流控检验
Thread.sleep(waitTime);
Sentinel对@SentinelResource的方法进行流控切面主流程
ClusterBuilderSlot.entry
添加并记录请求数
添加请求数
true
若流控链不存在则进行创建
NodeSelectorSlot
return old;
int idx = calculateTimeIdx(timeMillis);
执行排队等待Controller(漏桶算法)
责任链逐个执行退出逻辑
增加调用数和调用执行时间Rt
计算窗口起始毫秒数
StatisticSlot.entry
通过SPI机制加载ProcessorSlot文件下的实现类
grade == RuleConstant.FLOW_GRADE_THREAD ? node.curThreadNum() : (int)(node.passQps());
执行快速失败Controller(时间窗口算法)
SystemSlot.entry
获得流控链
熔断器检验
retryTimeoutArrived() && fromOpenToHalfOpen(context)
LogSlot
expectedTime currentTime
DegradeRuleManager.getCircuitBreakers(r.getName())
node.increaseThreadNum()
addInterceptors
#DefaultSlotChainBuilderSpiLoader.loadPrototypeInstanceListSorted(ProcessorSlot.class)
StatisticSlot
获得时间窗口
SentinelWebAutoConfiguration
Warm Up预热Controller(令牌桶算法)
AuthoritySlot.entry
对实现类节点进行排序
node.addPassRequest(count);
long oldTime = latestPassedTime.addAndGet(costTime);
SentinelAutoConfiguration
ClusterBuilderSlot
DegradeSlot.entry
first
对@SentinelResource进行切面
AuthoritySlot
通过SPI机制加载ChainBuilder文件下的实现类
chain.addLast((AbstractLinkedProcessorSlot<?>) slot);
windowStart == old.windowStart()
执行流控链
return new WindowWrap
passLocalCheck
old == null
DefaultProcessorSlotChain
chain.entry
@Beannew SentinelResourceAspect()
#FlowRuleCheckercheckFlow
0 条评论
下一页