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会出现轮询效果。