先直接上图:
这里我只讲轮询算法的实现:
很明显,这个轮询类继承了AbstractLoadBalancerRule这个抽象类
看下轮询类中定义了什么东西:
举个例子:
看到这个UP没,UP通俗的来讲,就是说活的机器。这里是2个
看下具体的代码实现:
这里再补充:
while(!this.nextServerCyclicCounter.compareAndSet(current, next));
这个nextServerCyclicCounter在之前的构造函数里面初始化为0了。
再看一遍这个图
再看下代码中是不是说:next=(current+1)/modulo?
那么current初始化为0,0+1后为1,不就对应了上图中的,reset接口计数从1开始。然后不断的取余进行计算下标位置
那么总结:
ribbon的轮询算法:
1.通过你配置的信息,找到你对应的服务名称,计算这个服务下有多少个活着的机器数(我们这里是8001,8002,一共2个),假设为active_sum
2.你调用一次方法,那么rest从1开始计数,假设为rest_count
计算公式rest_count%active_sum=index
3.计算出index后,内部有一个自旋+CAS操作
比较当前值curr和你计算出来的index值,如果不一样,那么index值赋给curr,则实现一个index的转变。(CAS效率高)
那么你一个index对应唯一的一个ip地址
那么从index的转变----------------->>ip地址的转变,即ip地址的轮询。
结束(可能不太详细,更深层的源码并没有详细的解释出来,不过大概就是这样了,我个人认为记住两点就好了,一个是index的下标计算方式,还有一个是CAS+自旋操作来实现index的变换)