您的位置:首页 > 编程语言 > Java开发

SpringCloud | Feign如何整合Ribbon进行负载均衡的?

2017-12-19 19:40 1466 查看
Ribbon是SpringCloud框架进行负载均衡的脚手架,贯穿springCloud项目中所有的http服务调用。

Ribbon针对RestTemplate负载均衡已经提供了完整实现,网上很多的ribbon demo也是分析restTemplate如何负载均衡的。

而我们都知道,feignClient已经默认使用了ribbon,feign是如何利用ribbon的负载均衡的呢?带着疑惑看了一遍代码。

首先先看一下spring-cloud-netflix-core包:



    细心观察,上面的包结构中有两个ribbon包目录,为什么会有两个模块呢?上面已经提到,ribbon的完整实现是基于restTemplate的,有兴趣的可以浏览源码,也就是上图第二个的ribbon包。

而上图中第一个ribbon包是在feign包下,就是feign整合ribbon的逻辑。具体来看一下。



   这是feign执行逻辑的入口,跟进executeAndDecode 方法到LoadBalancerFeignClient类中的execute方法:



注意上图中标红的关键代码。可以看到,每个请求都会获取对应的IClientConfig对象。

继续进行getClientConfig方法会发现一个重要对象:SpringClientFactory



SpringClientFactory是一个bean容器,来获取每个feign对应的properties和loadBalancer。

仔细查看获取LB(LoadBalance)实例和获取properties的方法,发现LB实例最终从父类NamedContextFactory获取Bean。

Bean来源AnnotationConfigApplicationContext context上下文:



至此,一个关键的配置类被发现了:RibbonClientConfiguration,整个逻辑也就清晰了:RibbonClientConfiguration类是ribbon包的配置类,在feign请求的时候动态配置的。

在每个服务第一次请求的时候,会到抽象工厂类NamedContextFactory中获取当前服务对被调用服务配置,

通过getContext方法获取,该方法会先从map中获取:

[code=java;toolbar:false">private Map contexts = new ConcurrentHashMap<>();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: