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