一、分析轮询思路
二、代码实现
自定义轮询算法
@Component
public class MyLoadBalance implements LoadBalance {
private AtomicInteger atomicInteger = new AtomicInteger(0);
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;
}
@Override
public ServiceInstance instance(List<ServiceInstance> serviceInstances) {
int index = getAndIncrement() % serviceInstances.size();
return serviceInstances.get(index);
}
}
控制层
@GetMapping(value = "/getPort")
public Result getServerPort(){
/*
* 获取CLOUD-PAYMENT-SERVICE服务下所有的实例
*/
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
if (instances == null || instances.size() <= 0){
return null;
}
ServiceInstance serviceInstance = loadBalance.instance(instances);
/*
* 获取转发的IP地址以及端口号
*/
URI uri = serviceInstance.getUri();
return restTemplate.getForObject(uri + "/payment/getPort",Result.class);
}