Feign + Ribbon + Eureka 结合使用的逻辑

一、图解

Feign + Eureka + Ribbon.png

二、说明

这里将重点分为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响应最终通过解码,将请求结果返回给调用方法,整个流程结束

你可能感兴趣的:(Feign + Ribbon + Eureka 结合使用的逻辑)