Ribbon的负载均衡源码
2021/9/28 1:40:38
本文主要是介绍Ribbon的负载均衡源码,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Ribbon的负载均衡
负载均衡策略
当我们发起请求的时候,把断点设置在拦截器那里,然后慢慢放行,就能来到这里,在getserver这个方法,看名字就是获取服务信息的。
层层跟进发现,底层原来还是要通过IRule组件来选择服务实例的,所以这⾥依然需要确认下rule的实现类到底是谁,虽然我们可以很轻松在当前类中找到rule的默认值,如下图所示:
因为springcloud主要还是依赖springboot,而大部分的bean的注入基本都是通过@bean注解在xxxxxConfiguration 实现的,默认为RoundBobinRule,那就去看看有没有注入别的rule组件,对其进行覆盖,结果就在 找到了。
慢慢的往下走,发现rule的类型,确实和想的一样,然后去调用他的choose方法。
查看变量,确实是我们注入的2个serviceA
getPredicate()的方法,看上去像是对server的list集合进行了过滤,因为后面的方法名字是afterFiltering,所以我们直接进去chooseRoundRobinAfterFiltering
发现了轮询的核心方法,注意如果在debug的模式下,负载均衡可能会有问题,我刚刚断点的时候,全是请求同一个服务实例。
下面就测试一下它核心的轮询算法:
/** * @author WGR * @create 2021/9/27 -- 21:07 */ public class Test2 { static AtomicInteger nextIndex = new AtomicInteger(); public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("1"); list.add("2"); list.add("3"); list.add("4"); Optional<String> of = Optional.of(list.get(incrementAndGetModulo(list.size()))); System.out.println(of.get()); Optional<String> of2 = Optional.of(list.get(incrementAndGetModulo(list.size()))); System.out.println(of2.get()); Optional<String> of3 = Optional.of(list.get(incrementAndGetModulo(list.size()))); System.out.println(of3.get()); Optional<String> of4 = Optional.of(list.get(incrementAndGetModulo(list.size()))); System.out.println(of4.get()); Optional<String> of5 = Optional.of(list.get(incrementAndGetModulo(list.size()))); System.out.println(of5.get()); } private static int incrementAndGetModulo(int modulo) { for (;;) { int current = nextIndex.get(); //核心的步骤就是用当前值对服务实例的总数取模,而且当前值是不断+1的。 int next = (current + 1) % modulo; if (nextIndex.compareAndSet(current, next) && current < modulo) return current; } } }
但是它会有一些问题,如果我其中的一个服务挂了,它可能最多需要4分钟才能感知到,当然这个会在hystrix解决。
这篇关于Ribbon的负载均衡源码的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15鸿蒙生态设备数量超8亿台
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?