Hystrix架构图
2021-04-24 15:47:17 28 举报
Hystrix架构图
作者其他创作
大纲/内容
Future<R> r
FeignContext中获取
markEmits
FeignClientsRegistrar
Func0#call()
Slf4jLogger
candidateComponents
注册
SpringMvcContract
Future<R> delegate
HystrixObservableTimeoutOperator
将注解参数defaultConfiguration,我们指定的配置类,构建成一个BeanDefinition
是否开启HystrixFeign
应用启动
否
FeignContext
create
HystrixDelegatingContract(解析hystrix的注解)
fallback处理
最终会调用我们Command自己实现的getFallback()方法
doOnSubscribe
reject不会执行
扫描符合注解过滤器条件的组件,然后将组件构建成BeanDefinition
request cache默认不启用
RequestLog默认启用但是不处理
fallbackInstance
Thread
commandisCommandTimedOut状态是NOT_EXECUTED?
将执行线程设置为当前线程,后续如果需要的时候可以中断
methodToHandlermethod实例 -> {SynchronousMethodHandler@8246}
超时检测组件
2、订阅
wrapWithAllOnNextHooks
配置优先级:1、服务相关配置2、default相关配置3、ConfigurationBean中的配置
组件的BeanDefintion
默认1s一次,可配置
线程池调用run方法
command stateNOT_STARTED -> OBSERVABLE_CHAIN_CREATED
HystrixContextSchedulerWorker#schedule(Action0 action)
LoadBalancerFeignClient(Ribbon相关,负载均衡)
被拦截
HystrixCommand#getFallbackObservable如果有异常调用我们实现的getFallback方法
terminateCommandCleanup终止命令后的清理工作
http://localhost:8300/sayHello/1?name=numbpad&age=20
获取注解的参数
是
unsubscribeCommandCleanup取消订阅命令后的清理工作
Observable名称:exetution
isDone?
重要步骤!!!
打了@FeignClient注解的接口
queue()
获取客户端对应的FeignContext(没有就创建)
构造
HystrixObservable
扫描所有打了@FeignClient的接口
Observable名称:userObservable
后台线程
默认配置线程池10个线程不可动态增加线程queue:SynchronousQueue,不支持排队(maxQueueSize = -1)
1、生成
启动
使用打了@EnableFeignClients注解的类的包路径(一般都是启动类的包路径)
handleFallback
method实例->HystrixCommand$Setter{groupKey-> eureka-client-bcommandKey->ServiceAClient#getById(Long)(方法拼接)}span style=\"font-size: inherit;\
AbstractCommand#executeCommandAndObserve
解析接口方法,构建元数据
接口类型ServiceClientA
method instance
applyHystrixSemantics
@FeignClient注解过滤器
threadState stateNOT_USING_THREAD->STARTED
markOnCompleted
HystrixCommand$Setter
SpringEncoder
构造HystrixCommand的时候会初始化线程池
初步拼接请求URLhttp://clientA
ReflectiveFeign#newInstance
扫描
submit
fireOnCompletedHook
用户
Proxy#newProxyInstance最终实现了ServiceAClient接口的动态代理,T proxy,这个代理的调用全部由HystrixInvocationHandler拦截
注册默认配置
HystrixInvocationHandler
HystrixTarget#target()
Thread Pool
setterMethodMap
FeignLoggerFactory
subscribeOnFunc0#call()
state NOT_EXECUTED->TIMED_OUT
抛出HystrixTimeoutException
对Controller中的FeignClient组件进行自动装配
代理delegate,生成具有cannel功能的Future 对象
command
用户请求Controller接口,ServiceAClient调用sayHello方法
返回执行结果
BeanDefinitionRegistry(Bean定义的注册表)
看看@EnableFeignClients中是否配置了包路径
HystrixFeign.Builder
loadBalance()方法创建Ribbon的动态代理
组件扫描器
HardCodedTarget
根据Fallback类型,从服务A独立的FeignContext中获取Fallback实例
request options请求超时时间(连接超时10s,读超时60s)
直接基于服务名,FeignContext(属于一个服务的),target,HystrixFeign.Builder,fallback class去构建
服务名clientA
Feign客户端配置
将注解参数configuration,我们指定的客户端配置类,构建成一个BeanDefintion
AbstractCommand#executeCommandWithSpecifiedIsolation
action->ScheduledAction
TimerListener
拿到BeanDefinition,调用FactoryBean#getObject()
command stateOBSERVABLE_CHAIN_CREATED->USER_CODE_EXECUTED
ServiceClientA接口
HystrixCommand#execute()
SpringDecoder
处理注解的参数
clientA -> FeignContext-clientAclientB -> FiegnContext-clientB
队列是否已满queueSize < rejectThreshold
toObservable().toBlocking().toFuture()
@EnableFeignClients
注册FeignClients
action.call();
包路径com.numbpad.service
InvocationHandlerFactory
application.yml
读取
是否是线程池执行策略
Observable
解析FeignClient注解参数
setRequestContext
0 条评论
下一页