7.手写轮询操作


1.轮询原理

 2.实例

基于前面的eureka集群,附加以下代码

 LoadBalancer

public interface LoadBalancer {
    ServiceInstance instances(List serviceInstances);
}

 MyLB

/**
 *
 * 轮询原理 + CAS + 自旋锁
 */
@Component
public class MyLB implements LoadBalancer{

    private AtomicInteger atomicInteger = new AtomicInteger(0);

    /**
     * 获取下一个服务器数组的索引,索引 = 第几次访问 % 服务器数组长度
     * @return
     */
    public final int getAndIncrement(){
        int current;
        int next;
        do {
            // 获取初始值
            current = this.atomicInteger.get();
            next = current > Integer.MAX_VALUE ? 0 : current + 1;
        }while(!this.atomicInteger.compareAndSet(current,next));
        System.out.println("第几次访问,next = "+next);
        return next;
    }

    /**
     *
     * @param serviceInstances 服务器数组
     * @return
     */
    @Override
    public ServiceInstance instances(List serviceInstances) {
        // 获取服务器下表
        int index = getAndIncrement() % serviceInstances.size();
        return serviceInstances.get(index);
    }
}

 接口

    @GetMapping("payment/lb")
    public Object getLb(){
        List instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
        ServiceInstance instance = loadBalancer.instances(instances);
        return instance.getPort();
    }

3.访问结果

 访问localhost:8080//consumer/payment/lb会出现轮询效果。