13 Jun 2017
Spring Cloud Feign - Ribbon
Feign Ribbon Configuration
- FeignAutoConfiguration
- initialize
feignContext
- initialize
feignFeature
- FeignRibbonClientAutoConfiguration
- initialize CachingSpringLoadBalancerFactory
cachingLBClientFactory
which holds springClientFactory
- initialize LoadBalancerFeignClient
feignClient
which holds Client.Default
which holds cachingLBClientFactory
and springClientFactory
构建FeignClient注解代理对象
- FeignClientsRegistrar.registerFeignClient
- FeignClientFactoryBean.getObject
- FeignClientFactoryBean.feign
- context.getInstances(this.name, RequestInterceptor.class) (context is
FeignContext
) - BeanFactoryUtils.beansOfTypeIncludingAncestors
- FeignClientFactoryBean.loadBalance
- FeignClientFactoryBean.getOptional
- FeignContext.getInstance(Client.class) (context from
FeignAutoConfiguration
) - Feign.Builder.getClient (object from
FeignRibbonClientAutoConfiguration.feignClient
)
- Feign.target
- ReflectiveFeign.newInstance
- proxy Target.HardCodedTarget(type:
@FeignClient
annotation.getClassName) - bind proxy handler to InvocationHandlerFactory.Default() -> ReflectiveFeign.FeignInvocationHandler -> SynchronousMethodHandler(client: step 5)
调用Feign接口
- call proxy: SynchronousMethodHandler.invoke
- SynchronousMethodHandler.targetRequest apply requestInterceptors
- LoadBalancerFeignClient.execute (client: LoadBalancerFeignClient -> FeignAutoConfiguration.feignContext && FeignRibbonClientAutoConfiguration.feignClient -> above step 5)
cachingLBClientFactory
creates FeignLoadBalancer
object which holds FeignLoadBalancer
under specific namespace configs
- FeignLoadBalancer.executeWithLoadBalancer
- LoadBalancerCommand.submit
- LoadBalancerCommand.selectServer
- FeignLoadBalancer.reconstructURIWithServer
- FeignLoadBalancer.execute
- Client.Default.execute