SpringCloud之Ribbon(一)
2017-11-01 19:53
330 查看
在SpringCloud中Feign作为restful客户端,Eureka作为服务注册中心。Ribbon在Feign与Eureka之间充当中介,为客户端提供软件负载均衡算法。在Ribbon这一层中可以实现一个所谓的智能路由。
Ribbon是在Eureka之后初始化,Configuration类为RibbonAutoConfiguration。里面有如SpringClientFactory、LoadBalancerClient、PropertiesFactory等重要Bean定义。上述创建FeignLoadBalancer中依赖的很多类都是从SpringClientFactory中获取。
RibbonAutoConfiguration中第一个重要的Bean为SpringClientFactory,该类继承自NamedContextFactory和FeignContext作用很类似,也是一个Spring ApplicationContext实现。SpringClientFactory默认的Configuration为RibbonClientConfiguration,各Ribbon以RibbonClientSpecification向SpringClientFactory中注册配置。使用注解@RibbonClients即可注册Ribbon应用,@RibbonClients有两个地方有用到,一个是RibbonAutoConfiguration,另一个是RibbonEurekaAutoConfiguration,也就是说默认有两个Ribbon应用。
RibbonEurekaAutoConfiguration是在RibbonAutoConfiguration之后初始化的,但SpringClientFactory又是在RibbonAutoConfiguration中定义,刚开始我还纠结于RibbonEurekaAutoConfiguration中的@RibbonClients在SpringClientFactory实例化完了是怎么再向SpringClientFactory中添加Configuration的,后来一想Spring是延迟实例化,RibbonAutoConfiguration中的@Bean注解只是先向Spring中注册了SpringClientFactory的Bean定义而已,真正的实例化(@Bean标注的方法体调用)是在后面进行,等到SpringClientFactory实例化的时候项目中所有@RibbonClients定义的RibbonClientSpecification都已经注册齐全。
SpringClientFactory在实例化时,首先以RibbonClientConfiguration为配置类进行初始化,其中有IClientConfig、IRule、IPing、ServerList、ILoadBalancer、ServerListFilter、RibbonLoadBalancerContext、RetryHandler、ServerIntrospector、RestClient(AbstractLoadBalancerAwareClient)等的默认定义。在RibbonEurekaAutoConfiguration中的@RibbonClients使用了EurekaRibbonClientConfiguration重写了IPing、ServerList、ServerIntrospector的实现。
来看看Ribbon的应用,在上篇Feign里有说到LoadBalancerFeignClient,里面有使用到Ribbon做软负载。在LoadBalancerFeignClient的execute方法中会创建FeignLoadBalancer并调用其executeWithLoadBalancer方法执行请求。FeignLoadBalancer由CachingSpringLoadBalancerFactory下create方法创建,CachingSpringLoadBalancerFactory是在FeignRibbonClientAutoConfiguration中定义,在其create创建方法中主要的逻辑就是通过SpringClientFactory获取IClientConfig、ILoadBalancer、ServerIntrospector实例并组装成FeignLoadBalancer对象。在FeignLoadBalancer的executeWithLoadBalancer方法中会构建一个LoadBalancerCommand对象,负载相关功能主要由它来实现,通过LoadBalancerCommand的submit方法提交请求,然后会选择出一个Server并在reconstructURIWithServer中把请求Url里的Host替换成选择出来的ServerHost。
选择Server的逻辑在LoadBalancerCommand.selectServer中,其中会调用LoadBalancerContext.getServerFromLoadBalancer,其中决定选择的逻辑执行是ILoadBalancer.chooseServer。查看RibbonClientConfiguration可知ILoadBalancer默认实现为ZoneAwareLoadBalancer。ZoneAwareLoadBalancer基于IRule.choose,IRule默认实现是ZoneAvoidanceRule,智能路由实现的中心思想就是自定义IRule。
Ribbon是在Eureka之后初始化,Configuration类为RibbonAutoConfiguration。里面有如SpringClientFactory、LoadBalancerClient、PropertiesFactory等重要Bean定义。上述创建FeignLoadBalancer中依赖的很多类都是从SpringClientFactory中获取。
RibbonAutoConfiguration中第一个重要的Bean为SpringClientFactory,该类继承自NamedContextFactory和FeignContext作用很类似,也是一个Spring ApplicationContext实现。SpringClientFactory默认的Configuration为RibbonClientConfiguration,各Ribbon以RibbonClientSpecification向SpringClientFactory中注册配置。使用注解@RibbonClients即可注册Ribbon应用,@RibbonClients有两个地方有用到,一个是RibbonAutoConfiguration,另一个是RibbonEurekaAutoConfiguration,也就是说默认有两个Ribbon应用。
RibbonEurekaAutoConfiguration是在RibbonAutoConfiguration之后初始化的,但SpringClientFactory又是在RibbonAutoConfiguration中定义,刚开始我还纠结于RibbonEurekaAutoConfiguration中的@RibbonClients在SpringClientFactory实例化完了是怎么再向SpringClientFactory中添加Configuration的,后来一想Spring是延迟实例化,RibbonAutoConfiguration中的@Bean注解只是先向Spring中注册了SpringClientFactory的Bean定义而已,真正的实例化(@Bean标注的方法体调用)是在后面进行,等到SpringClientFactory实例化的时候项目中所有@RibbonClients定义的RibbonClientSpecification都已经注册齐全。
SpringClientFactory在实例化时,首先以RibbonClientConfiguration为配置类进行初始化,其中有IClientConfig、IRule、IPing、ServerList、ILoadBalancer、ServerListFilter、RibbonLoadBalancerContext、RetryHandler、ServerIntrospector、RestClient(AbstractLoadBalancerAwareClient)等的默认定义。在RibbonEurekaAutoConfiguration中的@RibbonClients使用了EurekaRibbonClientConfiguration重写了IPing、ServerList、ServerIntrospector的实现。
来看看Ribbon的应用,在上篇Feign里有说到LoadBalancerFeignClient,里面有使用到Ribbon做软负载。在LoadBalancerFeignClient的execute方法中会创建FeignLoadBalancer并调用其executeWithLoadBalancer方法执行请求。FeignLoadBalancer由CachingSpringLoadBalancerFactory下create方法创建,CachingSpringLoadBalancerFactory是在FeignRibbonClientAutoConfiguration中定义,在其create创建方法中主要的逻辑就是通过SpringClientFactory获取IClientConfig、ILoadBalancer、ServerIntrospector实例并组装成FeignLoadBalancer对象。在FeignLoadBalancer的executeWithLoadBalancer方法中会构建一个LoadBalancerCommand对象,负载相关功能主要由它来实现,通过LoadBalancerCommand的submit方法提交请求,然后会选择出一个Server并在reconstructURIWithServer中把请求Url里的Host替换成选择出来的ServerHost。
选择Server的逻辑在LoadBalancerCommand.selectServer中,其中会调用LoadBalancerContext.getServerFromLoadBalancer,其中决定选择的逻辑执行是ILoadBalancer.chooseServer。查看RibbonClientConfiguration可知ILoadBalancer默认实现为ZoneAwareLoadBalancer。ZoneAwareLoadBalancer基于IRule.choose,IRule默认实现是ZoneAvoidanceRule,智能路由实现的中心思想就是自定义IRule。
相关文章推荐
- 微服务框架Spring Cloud介绍 Part4: 使用Eureka, Ribbon, Feign实现REST服务客户端
- Spring Cloud微服务开发笔记5——Ribbon负载均衡策略规则定制
- spring cloud Ribbon
- springcloud使用ribbon实现客户端负载均衡
- Spring Cloud Ribbon 全解 (1) - 总览篇
- Spring Cloud Ribbon负载均衡器处理方法
- 《spring cloud微服务实战》读书笔记——Spring Cloud Ribbon(一)RestTemplate
- Spring-cloud 服务发现与消费(以ribbon为例)
- 负载均衡之Spring Cloud Ribbon
- spring cloud ribbon - 负载均衡
- Spring Cloud入门教程(二):客户端负载均衡(Ribbon)
- 笔记:Spring Cloud Ribbon RestTemplate 详解
- 【Spring Cloud】Ribbon负载均衡
- 【Spring Cloud】Ribbon负载均衡
- SpringCloud 笔记 (二)---- 简单搭建一个服务消费者,实现简单的ribbon负载均衡
- SpringCloud 进阶之Ribbon和Feign(负载均衡)
- spring cloud之服务调用及使用ribbon实现负载均衡(三)
- Spring Cloud Spring Boot mybatis 企业分布式微服务云(四)服务消费(Ribbon)【Dalston版】
- Spring Cloud中,如何解决Feign/Ribbon第一次请求失败的问题?
- Spring Cloud Ribbon(负载均衡)