1、Feign入口分析
// Scans for interfaces that declare they are feign clients
@Import(FeignClientsRegistrar.class)
public @interface EnableFeignClients {
}
2、初始化流程分析
2.1 FeignClientsRegistrar.registerBeanDefinitions FeignClient注册到spring容器
2.1.1 registerDefaultConfiguration
2.1.2 registerFeignClients
2.1.2.1 registerFeignClient
BeanDefinitionBuilder definition = BeanDefinitionBuilder
.genericBeanDefinition(FeignClientFactoryBean.class);
关注重点,FeignClientFactoryBean
2.2 FeignClientFactoryBean.getObject 对FeignClient动态代理
2.2.1 feign
2.2.2 getOptional
2.2.3 get
2.2.4 Targeter.target
2.3 Feign.Builder.target
2.3.1 build
2.4 ReflectiveFeign.newInstance
2.5 ParseHandlersByName.apply
2.6 SpringMvcContract.parseAndValidatateMetadata
2.7 SynchronousMethodHandler.Factory.create
2.8 InvocationHandlerFactory.create
3、请求流程分析
3.1 ReflectiveFeign.FeignInvocationHandler.invoke
3.2 SynchronousMethodHandler.invoke
3.3 SynchronousMethodHandler.executeAndDecode
3.4 Target.HardCodedTarget.apply
3.5 LoadBalancerFeignClient.execute
3.6 FeignLoadBalancer.RibbonRequest
3.6.1 FeignLoadBalancer.lbClient -> FeignLoadBalancer .DynamicServerListLoadBalancer
3.6.2 AbstractLoadBalancerAwareClient.executeWithLoadBalancer
3.7 AbstractLoadBalancerAwareClient.buildLoadBalancerCommand
3.7.1 FeignLoadBalancer.getRequestSpecificRetryHandler
3.8 LoadBalancerCommand.submit
3.8.1 LoadBalancerCommand.selectServer
roundRobind
3.9 FeignLoadBalancer.execute
3.10 Client.Defaul.execute