springcloud LoadBalancerClient 负载策略原理

springcloud LoadBalancerClient 负载策略原理

springcloud 提供了跟多组件以及大量与服务治理相关的抽象接口,LoadBalancerClient为springcloud提供的负载均衡器客户端。

LoadBalancerClient先从提供的服务中获取某一个实例(默认策略为轮询),比如订单服务需要访问商品服务,商品服务有3个节点,LoadBalancerClient会通过choose(),方法获取到3个节点中的一个服务,拿到服务的信息之后取出服务ip信息,就可以得到完成的想要访问的ip地址和接口,最后通过RestTempate访问商品服务。

springcloud提供的组件Ribbon,内部就是集成了LoadBalancerClient负载均衡,通过@LoadBalance注解开启负载均衡器。

深入解析LoadBalancerClient接口源码

首页我们开始追踪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实现类,也就是随机策略。

总结

以上源码内容比较多,一定要细心研究,我们来总结下流程:

1.LoadBalancerClient——>RibbonLoadBalancerClient中的choose()

首先我们穿一个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的策略进行负载均衡。

  • 8
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Survivor001

你可以相信我,如果你愿意的话

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值