一、加载
@EnableFeignClients
里面有个@Import(FeignClientsRegistrar.class)
,
FeignClientsRegistrar
的FeignClientsRegistrar
方法,里面调用registerFeignClients
方法注册FeignClients
,它扫描包下面所有被@FeignClient
所注解的Interface
,将FeignClientFactoryBean
的BD注册到BeanDefinitionRegistry
(也就是BeanFactory
)里。
FeignClientFactoryBean
通过getObject
方法注入FeignClient
。getObject
方法调用getTarget方法,如果没配置url
的话,就返回LoadBalancerFeignClient
,否则就用LoadBalancerFeignClient
的delegate,即原始的FeignClient,像OkHttpClient
。
LoadBalancerFeignClient
是对原始FeignClient
的装饰,集成了Ribbon
,execute方法通过ribbon
实现负载均衡。
二、请求流程
Feign请求流程.png
- 将请求委托到动态代理的实现类,具体是在ReflectiveFeign里实现。
- Contract将方法上的注解信息解析成
List<MethodMetadata>
,一个方法对应一个MethodMetadata
,这步实际上是在springboot启动的时候执行的。 - 根据
method
找到MethodHandler
,并执行invoke
方法。 -
encoder
生成响应的请求头和请求体,拼接url等 - 根据
RequestTemplate
生成request
,有请求拦截器的话就执行拦截器方法。 - 基于重试器来执行Client的请求方法。Client的默认是实现类用的Client.Default,基于
HttpURLConnection
实现HTTP请求。可以使用apache的http client以及OkHttp。OkHttp的优点:
- 内置连接池,支持连接复用
- 支持gzip压缩响应体
- 通过缓存避免重复的请求
- 支持http2,对一台机器的所有请求共享同一个socket