博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
springcloud LoadBalancerClient 负载策略原理
阅读量:2048 次
发布时间:2019-04-28

本文共 2324 字,大约阅读时间需要 7 分钟。

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的策略进行负载均衡。

转载地址:http://lnhof.baihongyu.com/

你可能感兴趣的文章
Leetcode C++ 剑指 Offer 09. 用两个栈实现队列
查看>>
Leetcode C++《每日一题》20200707 112. 路径总和
查看>>
云原生 第十一章 应用健康
查看>>
Leetcode C++ 《第202场周赛》
查看>>
云原生 第十二章 可观测性:监控与日志
查看>>
Leetcode C++ 《第203场周赛》
查看>>
云原生 第十三章 Kubernetes网络概念及策略控制
查看>>
《redis设计与实现》 第一部分:数据结构与对象 || 读书笔记
查看>>
《redis设计与实现》 第二部分(第9-11章):单机数据库的实现
查看>>
算法工程师 面经2019年5月
查看>>
搜索架构师 一面面经2019年6月
查看>>
稻草人手记
查看>>
第一次kaggle比赛 回顾篇
查看>>
leetcode 50. Pow(x, n)
查看>>
leetcode 130. Surrounded Regions
查看>>
【托业】【全真题库】TEST2-语法题
查看>>
博客文格式优化
查看>>
【托业】【新托业全真模拟】疑难语法题知识点总结(01~05)
查看>>
【SQL】group by 和order by 的区别。
查看>>
【F12】谷歌浏览器--前台效果可以在不访问服务器的前提下直接改样式看效果是否是预期值。...
查看>>