ribbon-feign-hystix的启动流程
2020-02-20 10:19:24 4 举报
spring cloud ribbon-feign底层调用
作者其他创作
大纲/内容
InterceptingClientHttpRequest.InterceptingRequestExecution#execute
允许请求通过
DynamicServerListLoadBalancer#updateListOfServers
SimpleClientHttpRequestFactory#createRequest
BaseContract#parseAndValidatateMetadata
RibbonClientConfiguration
ReflectiveFeign#newInstance
RoundRobinRule#choose
更新服务列表,去掉停止服务的
(ZoneAwareLoadBalancer)ILoadBalancer#chooseServer
DynamicServerListLoadBalancer#enableAndInitLearnNewServersFeature
1.关闭短路起。
RestTemplate#execute()
FallbackFactory#create
InterceptingHttpAccessor#getRequestFactory
HystrixCommand#run
ServerList
FeignClientFactoryBean
ServerListUpdater.UpdateAction#doUpdate
判断短路器是否代开
SynchronousMethodHandler
ILoadBalancer#chooseServer
否
if分支
InternalHttpClient#doExecute
InterceptingClientHttpRequest
请求
负载均衡
调用成功
Hystrix执行流程
SynchronousMethodHandler#invoke
FeignContext这是一个很关键的类,很多的配置好的bean都在这里面
普通请求
RibbonLoadBalancerClient#execute
else分支
ParseHandlersByName#apply
RibbonLoadBalancerClient#reconstructURI
LoadBalancerRequestFactory#createRequest
DynamicServerListLoadBalancer#setServersList
FeignClientFactoryBean#loadBalance
等等
FeignClientsRegistrar#registerBeanDefinitions
request.apply(serviceInstance);
AbstractLoadBalancerAwareClient#customizeLoadBalancerCommandBuilder
DefaultListableBeanFactory#preInstantiateSingletons
可插拔的自定义feign组件。sentinel和feign集成就是通过重写SentinelTargeter从而把sentilen限流工具集成到feigin中,替换掉了Hystrix
SimpleClientHttpRequestFactory
HystrixFeign.Builder#build(FallbackFactory<?>)
LoadBalancerCommand#submit
AbstractLoadBalancerAwareClient.this.execute
delegate.execute()
请求结果
拒接请求通过,直接调用fallback方法
springframework/cloud/spring-cloud-netflix-ribbon/2.1.2.RELEASE/spring-cloud-netflix-ribbon-2.1.2.RELEASE.jar!/META-INF/spring.factories
选择服务
没有fallback
HystrixInvocationHandler
BaseLoadBalancer#setServersList
HystrixCommand#getFallback
LoadBalancerInterceptor#intercept
RibbonAutoConfiguration
RestTemplate#doExecute
ClientHttpRequestInterceptor#intercept
InvocationHandlerFactory#create
LoadBalancerCommand#selectServer
SmartInitializingSingleton
FeignClientFactoryBean#getTarget
hytrix
重构url
FeignClientFactoryBean#configureUsingConfiguration
LoadBalancerContext(RibbonLoadBalancerContext)#reconstructURIWithServer
在这个方法中执行RequestInterceptor
InterceptingClientHttpRequestFactory#createRequest
调用失败
HystrixFeign.Builder#build()
ServerListFilter#getFilteredListOfServers
HystrixCircuitBreaker#allowRequest
实例@FeignClient(value = \"order\
DynamicServerListLoadBalancer#updateAllServerList
LoadBalancerInterceptor
AbstractApplicationContext#finishBeanFactoryInitialization
调用feign借口中的方法,如果有异常就走fallback
((MethodHandler)HystrixInvocationHandler.this.dispatch.get(method)).invoke(args)
ReflectiveFeign
续约保护窗口时间
EnableFeignClients
HttpAccessor#createRequest
BaseLoadBalancer#getReachableServers
是否过了保护窗口一半时间默认为5秒钟
IClientConfig
RestTemplate
HystrixTargeter#target
AbstractLoadBalancerAwareClient#executeWithLoadBalancer
CloseableHttpClient#execute
FeignClientFactoryBean#getObject
AbstractBufferingClientHttpRequest#executeInternal
Builder#build
是否熔断的逻辑
应为是负载均衡所以第一次进来肯定有拦截器,所有会先执行拦截器
SynchronousMethodHandler.Factory#create
AbstractClientHttpRequest#execute
SynchronousMethodHandler#targetRequest
ServerListUpdater
HystrixInvocationHandler#invoke
ServiceRequestWrapper#getURI
InterceptingHttpAccessor#setInterceptors
Default#continueOrPropagate(重试)
PollingServerListUpdater#start
InterceptingClientHttpRequest#executeInternal
FeignClientFactoryBean#feign
FeignClientsRegistrar#registerFeignClient
RoundRobinRule
AbstractLoadBalancerAwareClient#buildLoadBalancerCommand
IRule
断路器打开的条件:1.一个时间窗口内,错误率大于50%2.断路器半开状态,测试请求一次,失败以后续约短路起保护时间
feign在调用中有可能会丢掉异常信息,这个做容错处理的,如果需要获得异常信息,就实现FallbackFactory
是
springframework/cloud/spring-cloud-commons/2.1.2.RELEASE/spring-cloud-commons-2.1.2.RELEASE.jar!/META-INF/spring.factories
AbstractApplicationContext#refresh
DynamicServerListLoadBalancer#restOfInit
Hystrix
允许发起一次调用
在这个方法中定制,请求到底是负载均衡的还是普通的请求,如果获得了拦截器就是附加均衡的请求,否则就是普通请求
AbstractClientHttpRequestFactoryWrapper#createRequest()
RandomRule
IRule#choose
BaseLoadBalancer#chooseServer
是否需要错误处理
ServerList#getUpdatedListOfServers
这里默认没做任何是,但是可以通过覆写customizeLoadBalancerCommandBuilder来定制命令行
LoadBalancerAutoConfiguration
LoadBalancerContext#getServerFromLoadBalancer
通过ribbon的配置,开启springcloud的负载均衡功能
IPing
Builder#target
通过rule的不同实现来实现负载均衡算法,这可以自定义实现自己的算法
需要注意的是,这个类的初始化时机,实在spring的bean的getBean的生命周期之调用,所以如果我们需要在服务启动的时候通过InitializingBean方法,在实现中ribbon调用其他服务,这个时候不能够通过restTemplate进行调用,应为这个时候获得restTemplate中是没有拦截器的所以这个时候只能够普通的调用
到了这里就进入了ribbon框架中了
LoadBalancerFeignClient#execute
FeignClientFactoryBean#getFallback
upServerList
FeignClientsRegistrar
RibbonLoadBalancerClient#getServer
ServiceRequestWrapper
RestTemplateCustomizer#customize
LoadBalancerClient#execute
RibbonLoadBalancingHttpClient#execute
收藏
收藏
0 条评论
回复 删除
下一页