轮询算法
- 上次请求下标值(第一次默认为0)加1%服务器集群总数量=实际调用服务下标,每次重启服务从1开始计时
源码分析
-
Ribbon实现负载均衡实在RoundRobinRule类中完成的
-
choose方法为轮询算法,在这个方法里面,我们得到了集群里服务数量serverCount
-
将serverCount传入incrementAndGetModulo方法里面
-
incrementAndGetModulo方法里,我们得到之前下标,然后加1,然后与当前服务数量取模,就得到了需要调用服务的下标,然后利用cas自旋操作将nextServerCyclicCounter更新为当前下标值,然后返回next,这样就完成轮询操作了
这几个数据整理了一个表格,假设集群数量(serverCount)为2,结果集为
nextServerCyclicCounter | current | next | 更新后的nextServerCyclicCounter |
---|---|---|---|
0 | 0+1=1 | 1%2=1 | 1 |
1 | 1+1= 2 | 2%2=0 | 0 |
0 | 0+1=1 | 1%2=1 | 1 |
这样就完成了一个轮询操作