Feign

一、加载

@EnableFeignClients 里面有个@Import(FeignClientsRegistrar.class)
FeignClientsRegistrarFeignClientsRegistrar方法,里面调用registerFeignClients方法注册FeignClients,它扫描包下面所有被@FeignClient所注解的Interface,将FeignClientFactoryBean的BD注册到BeanDefinitionRegistry(也就是BeanFactory)里。
FeignClientFactoryBean通过getObject方法注入FeignClientgetObject方法调用getTarget方法,如果没配置url的话,就返回LoadBalancerFeignClient,否则就用LoadBalancerFeignClient的delegate,即原始的FeignClient,像OkHttpClient
LoadBalancerFeignClient是对原始FeignClient的装饰,集成了Ribbon,execute方法通过ribbon实现负载均衡。

二、请求流程

Feign请求流程.png
  1. 将请求委托到动态代理的实现类,具体是在ReflectiveFeign里实现。
  2. Contract将方法上的注解信息解析成List,一个方法对应一个MethodMetadata,这步实际上是在springboot启动的时候执行的。
  3. 根据method找到MethodHandler,并执行invoke方法。
  4. encoder生成响应的请求头和请求体,拼接url等
  5. 根据RequestTemplate生成request,有请求拦截器的话就执行拦截器方法。
  6. 基于重试器来执行Client的请求方法。Client的默认是实现类用的Client.Default,基于HttpURLConnection实现HTTP请求。可以使用apache的http client以及OkHttp。OkHttp的优点:
  • 内置连接池,支持连接复用
  • 支持gzip压缩响应体
  • 通过缓存避免重复的请求
  • 支持http2,对一台机器的所有请求共享同一个socket

参考资料

Spring Cloud Feign设计原理

你可能感兴趣的:(Feign)