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

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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: