本文共 2324 字,大约阅读时间需要 7 分钟。
springcloud 提供了跟多组件以及大量与服务治理相关的抽象接口,LoadBalancerClient为springcloud提供的负载均衡器客户端。
LoadBalancerClient先从提供的服务中获取某一个实例(默认策略为轮询),比如订单服务需要访问商品服务,商品服务有3个节点,LoadBalancerClient会通过choose(),方法获取到3个节点中的一个服务,拿到服务的信息之后取出服务ip信息,就可以得到完成的想要访问的ip地址和接口,最后通过RestTempate访问商品服务。
springcloud提供的组件Ribbon,内部就是集成了LoadBalancerClient负载均衡,通过@LoadBalance注解开启负载均衡器。
首页我们开始追踪LoadBalancerClient源码,
可以发现LoadBalancerClient接口继承了ServiceInstanceChooser接口,主要的方法为2个execute方法,均是用来执行请求的。还有个reconstructURI()是用来重构URL的。进入ServiceInstanceChooser接口内容看下:
进入ServiceInstanceChooser接口中,可以看到主要的方法为choose(),这是是用来根据服务的名称,获取来选择其中一个服务实例。也就是根据seriverid获取ServiceInstance。在看看LoadBalancerClient的实现类RibbonLoadBalancerClient。
综上我们可以知道LoadBalancerClient接口一个结构情况了: 现在我们在进入到LoadBalancerClient的实现类RibbonLoadBalancerClient里面看下,RibbonLoadBalancerClient实现类是非常重要的类。他就是实现了服务的负载和选择,以及负载策略的配置,整个的负载均衡都由它实现。我们看下RibbonLoadBalancerClient实现类里面几个重要的实现方法:
第一个:choose(),用来选择具体的服务实例。 第二个:getServer(),获取实例。 最终通过ILoadBalancer去做服务选择实例。我们放一起来看下:
那现在我们在看下ILoadBalancer是怎么实现选择服务实例的: 我们从上面也能看到ILoadBalancer中的chooseServer方法里面默认值为:default。 进入ILoadBalancer 实现类BaseLoadBalancer看下: 跟着刚才的chooseServer()方法进去: 我们的key为“default”,那么我们去看下这个key代表的是什么意思吧。进去rule对象里面看下: 我们可以看到这个rule是IRule接口声明出来的,且默认定义的实现类是RoundRobinRule(),也就是轮询策略。 那我们看下IRule接口: 我们可以看到IRule接口定义了3个方法,choose是用来选择实例的,setLoadBalancer和getLoadBalance用来设置和获取ILoadBalancer的。 那我们来看下IRule接口有多少个实现类吧: 可以看到IRule里面有很多策略实现类。这样我们是不是就可以通过IRule接口实现一个自定义负载策略了呢,来看下: 的确是这样的,IRule定义了一个方法,这里返回了RandomRule实现类,也就是随机策略。以上源码内容比较多,一定要细心研究,我们来总结下流程:
首先我们穿一个serverid,也就是服务id,通过LoadBalancerClient接口调用实现类RibbonLoadBalancerClient中的**choose(serverid)**方法。
2.choose()---->getServer(ILoadBalancer loadbalance)----->chooseServer()
choose(serverid)内部调用getServer(ILoadBalancer loadBalancer, Object hint),getServer方法通过ILoadBalancer类进行了负载策均衡之旅。 3.实现chooseServer()方法 接着通过实现ILoaddBalancer接口的chooseServer(Object key)方法,实现类为BaseLoadBalancer。 4. 通过IRule接口,自定义负载策略。其实LoadBalancerClient 还有个核心类IPing,这里就不多解析了,向EurekaClient获取注册列表信息,默认每10秒向EurekaClient发送一次“ping”,进而检查是否需要更新服务的注册列表信息。
负载均衡的实现LoadBalancerClient具体交给了ILoadBalancer来处理,ILoadBalancer通过配置IRule、IPing等,向EurekaClient获取注册列表信息,默认每10秒向EurekaClient发送一次“ping”,进而检查是否需要更新服务的注册列表信息。最后,在得到服务注册列表信息后,ILoadBalancer根据IRule的策略进行负载均衡。
转载地址:http://lnhof.baihongyu.com/