一、图解
二、说明
这里将重点分为5点,具体如下:
1. 注册FeignClient工厂Bean
为注释了FeignClient的接口注册一个FeignClientFactoryBean,之后便可以被注入到其他的Bean中;
2. 生产动态代理对象
FeignClientFactoryBean利用Feign.builder生产出动态代理对象;
3. Eureka客户端获取实例
Eureka客户端会定期从Eureka服务端拉取最新的服务列表,Eureka客户端是由Spring注入;
4. Eureka服务端维护列表
Eureka服务端的实例列表是由一个二级缓存ResponseCache和一个注册表ConcurrentHashMap构成,通过各种由Resource类映射的Rest接口维护,Eureka服务端是由Spring注入并在容器的生命周期方法中初始化和启动;
5. 调用动态代理对象接口
5.1 提交Feign请求
动态代理对象调用接口方法,方法被封装成一个Feign请求提交给Feign客户端,Spring整合了Feign和 Ribbon的代码后,LoadBalancerFeignClient作为一个Feign客户端接受请求。
5.2 提交负载均衡请求
LoadBalancerFeignClient客户端将请求封装为Ribbon的负载均衡请求并提交给负载均衡客户端,Spring 整合了Ribbon 和 Feign的代码,FeignLoadBalancer 作为一个负载均衡客户端接受请求
5.3 负载均衡器选择服务实例
负载均衡客户端使用负载均衡器ILoadBalancer选择服务实例,整合了Eureka的代码后,DiscoveryEnabledNIWSServerList为负载均衡器提供服务实例列表,DiscoveryEnabledNIWSServerList 持有Eureka客户端实例
5.4 执行Feign请求
延续第5点,负载均衡客户端选出服务实例后,将请求封装为Feign提交给Feign客户端,这里的Feign客户端不再是LoadBalancerFeignClient,而是实际执行远程访问的feign客户端,如Client.Default/ApacheHttpClient/OkHttpClient
5.5 获取Feign请求结果并解码
feign客户端执行请求后返回feign响应,feign响应最终通过解码,将请求结果返回给调用方法,整个流程结束