sentinel限流、熔断、降级源码解析
2021-10-28 10:25:25 28 举报
流程图
作者其他创作
大纲/内容
counter.totalCount.add(1)
avgUsedTokens(node)
增加校验规则通过的调用数
chain.exit
逐个调用slot链条里的每个校验规则的Entry逻辑
urrentState.get() == State.CLOSED
next
DegradeSlot.exit
fromHalfOpenToOpen
onRequestComplete
currentRatio > maxSlowRequestRatio
fireEntry
ResponseTimeCircuitBreaker
(curCount + acquireCount) > this.count
rollingCounterInSecond.pass() / this.rollingCounterInSecond.getWindowIntervalInSec()
快速失败
checkFlow
node.increaseThreadNum()
漏桶算法
ExceptionCircuitBreaker
retryTimeoutArrived() && this.fromOpenToHalfOpen(context)
半开时不通过
slidingCounter.currentWindow().value()
node.increaseBlockQps(count)
DegradeSlot.entry
当前qps大于count阈值返回false,校验不通过
fireExit
从当前时间窗口取统计指标数据
对降级规则逐个进行校验
WarmUpController
获取所有断路器
超过了一定时间,尝试
用于存储资源的统计信息以及调用者信息,例如资源的RT、QPS、thread count等,这些信息将作为多维度限流、降级的依据
FlowSlot.entry()
StatisticSlot.entry
正常情况,增加当前调用线程数
transformToOpen
context.getCurEntry().setError
基于@SpiOrder进行排序
令牌桶算法
StatisticNode.rollingCounterInSecond.addPass(count)
SentinelResourceAspect
ruleProvider.apply(resource.getName())
等待队列
canPassCheck
@SentinelResource注解
lookProcessChain(resourceWrapper)
DefaultController
performChecking
抛Throwable
预热
first
slotChainBuilder.build()
StatisticNode.curThreadNum.increment()
SlotChainProvider.newSlotChain()
chain.entry
DegradeRuleManager.getCircuitBreakers
对资源逐条校验规则
CtSph.entryWithPriority
触发后面的规则校验
handleStateChangeWhenThresholdExceeded
SpiLoader.loadPrototypeInstanceListSorted
RateLimiterController
rt > maxAllowedRt
抛BlockException
校验不通过,抛出DegradeException,即BlockException
关闭时通过
半开且rt > maxAllowedRt
currentState.get() != State.OPEN
校验不通过,抛FlowException,即BlockException
fromHalfOpenToClose
构建资源的slot校验链条,每个资源都有自己独立的校验链条
end
node.passQps()
rule.getRater().canPass
node.addPassRequest(count)
CircuitBreaker.tryPass
获取资源相关的校验规则
半开且rt <= maxAllowedRt
counter.slowCount.add(1)
entry.exit
增加被规则限流的调用数
0 条评论
下一页