hytrix核心调用链路总结
2021-07-07 16:22:19 11 举报
hystrix 个人源码分析 ,欢迎指正
作者其他创作
大纲/内容
fromCache不是空
返回fallback结果
信号量隔离参考线程池
handleFallbackRejectionByEmittingError()
否
handleFallback
HystrixCircuitBreakerConfiguration
是否允许超时
按服务类
handleSemaphoreRejectionViaFallback信号量拒绝
是证明没整过断路器
toCache
metrics.markCommandStart()收集指标
HystrixCommand#getFallback
是否允许执行
AbstractCommand#executeCommandAndObserve执行目标方法
自动加载机制
hystrixCommand
afterCache = hystrixObservable
当前时间是否超过断路器时间+5s
Observable.error()触发HystrixRuntimeException异常抛出
threadPoolKey = ServiceA
是
afterCache = toCache.toObservable()
用于杜绝fallback还非常耗时的case
1
断路器是否关闭
AbstractCommand#getUserExecutionObservable业务执行方法在这
其他一下信息收集
这里进来先加然后判断是否已经超过10个是则返回false,并减回去,非信号量直接返回true
requestCache
handleShortCircuitViaFallback走个fallback
Observable.defer()获取线程资源执行(非立即)
将断路器置为半打开状态
executionSemaphore.tryAcquire()
断路器记录时间是否未设置
hystrixObservable
wrapWithAllOnNextHooks发射数据时的hook
true
AbstractCommand#applyHystrixSemantics
断路器是否打开
AbstractCommand#toObservable
执行失败
markOnCompleted
circuitBreaker.markSuccess();
HystrixCommandAspect#methodsAnnotatedWithHystrixCommand
feign的创建逻辑
失败
将线程状态置为ThreadState.STARTED
HystrixInvocationHandler#invoke
是否允许缓存
fireOnCompletedHook命令完成时的hook
groupKey = ServiceA
HystrixInvocationHandler#toSetters
isUnrecoverable()不可恢复类型异常
executionHook
properties.fallbackEnabled()是否普通类型异常
commandKey = ServiceAClient#deleteUser(Long)
false
成功
HystrixCommand#getFallbackObservable
fallback成功
AbstractCommand#handleRequestCacheHitAndEmitValues
证明已经开始了断路器
return HystrixInvocationHandler.this.dispatch.get(method).invoke(args);
AbstractCommand.java:804
threadPool
unsubscribeCommandCleanup命令结束后的清了清
.lift(new HystrixObservableTimeoutOperator<R>())
fallback逻辑
corePoolSize=10maximumPoolSize=10
executionHook.onFallbackStart(this);
AbstractCommand#getFallbackOrThrowException
HystrixFeign.Builder#build()
拦截HystrixCommandHystrixCollapser
HystrixCommand#queue
circuitBreaker.markNonSuccess();打开断路器
确保非scalar也能正常关闭
circuitBreaker.attemptExecution()
fromCache是否为空
fallbackSemaphore.tryAcquire()信号量是否足够
按方法
afterCache.doOnTerminate(terminateCommandCleanup).doOnUnsubscribe(unsubscribeCommandCleanup).doOnCompleted(fireOnCompletedHook)
HystrixInvocationHandler
HystrixTargeter#targetWithFallbackFactory
hystrix与feign的整合
HystrixTargeter#target
Observable.just(run());
executionResult.setExecutionOccurred()
setRequestContext
其他参数
circuitBreaker
handleSemaphoreRejectionViaFallback走个fallback
handleTimeoutViaFallback超时
hystrixCommand.execute()
getFallbackSemaphore()获取信号量,如果没有,则默认10个创建
handleThreadPoolRejectionViaFallback线程拒绝
applyHystrixSemantics执行熔断器+目标方法的核心逻辑?
EnableCircuitBreakerImportSelector
markEmits
org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker=\\org.springframework.cloud.netflix.hystrix.HystrixCircuitBreakerConfiguration
获取隔离信号量executionSemaphore这里默认10个
handleShortCircuitViaFallback断路器打开
executionHook.onStart(_cmd);
spring cloud 的整合
里面内容是不会立马执行的,直到有订阅者订阅了就执行 observable.subscribe(xxx)订阅后,才会开始执行
@EnableHystrix
否
配置文件feign.hystrix.enabled = true
观察者被回调前调用证明执行成功了,关闭断路器 关闭->半关闭
executionHook.onRunStart(_cmd)执行目标run方法HystrixCommand#run
toObservable().toBlocking().toFuture()
terminateCommandCleanup命令结束后的情侣装
requestCacheEnabled
handleFailureViaFallback业务内部异常
Observable.defer()
executeCommandWithSpecifiedIsolation()真正的执行方法
用户调用
isFallbackUserDefined()是否已定义
fallback执行出错
线程池隔离
0 条评论
回复 删除
下一页