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<>();
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<>();
相关文章推荐
- springcloud ribbon搭建服务负载均衡
- 【SpringCloud】Netflix源码解析之Ribbon:负载均衡策略的定义和实现
- Spring Cloud Ribbon实现客户端负载均衡的示例
- Spring Cloud Ribbon实现客户端负载均衡的方法
- spring cloud中Ribbon自定义负载均衡策略
- SpringCloud客户端负载均衡Ribbon
- 客户端负载均衡 Spring Cloud Ribbon
- Spring Cloud 客户端负载均衡之Ribbon(三)
- 客户端负载均衡Ribbon之一:Spring Cloud Netflix负载均衡组件Ribbon介绍
- Spring Cloud微服务开发笔记5——Ribbon负载均衡策略规则定制
- Spring Cloud中,如何解决Feign/Ribbon第一次请求失败的问题?
- spring Cloud中,解决Feign/Ribbon整合Hystrix第一次请求失败的问题?
- 客户端实现负载均衡:springCloud Ribbon的使用
- SpringCloud 查找调用REST服务使用RestTemplate(ribbon负载)或feign模式 教程源码 火推
- spring cloud 之 客户端负载均衡Ribbon深入理解
- 详解spring cloud中使用Ribbon实现客户端的软负载均衡
- Spring Cloud中,如何解决Feign/Ribbon第一次请求失败的问题?
- springcloud ribbon实现负载均衡的时候,提示Request URI does not contain a valid hostname: http://PRODUCT_SERVICE/
- Spring Cloud+Eureka+Ribbon实现客户端负载均衡
- 负载均衡之Spring Cloud Ribbon