1. 程式人生 > 實用技巧 >自定義輪詢演算法

自定義輪詢演算法

輪詢演算法的核心為:用發出請求的次數除以所呼叫微服務的提供者數量,並取餘數。

演算法如下:

介面:

package order.lb;

import org.springframework.cloud.client.ServiceInstance;

import java.util.List;

public interface LoadBalancer {
ServiceInstance instances(List<ServiceInstance> serviceInstances);

}
實現類:
@Component
public class MyLB implements LoadBalancer{
private AtomicInteger atomicInteger=new AtomicInteger(0);
public final int getAndIncrement(){
int current;
int next;
do{
current=this.atomicInteger.get();
next=current>=214748364?0:current+1;
}while (!this.atomicInteger.compareAndSet(current,next));
System.out.println("next:"+next);
return next;
}
@Override
public ServiceInstance instances(List<ServiceInstance> serviceInstances) {

int i = getAndIncrement() % serviceInstances.size();
return serviceInstances.get(i);
}
}
使用(需註釋@LoadBalanced註解):
@GetMapping("consumer/payment/lb")
public String getPayment(){
List<ServiceInstance> serviceInstances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
if (serviceInstances==null||serviceInstances.size()<=0){
return null;
}
ServiceInstance instances = loadBalancer.instances(serviceInstances);
URI uri = instances.getUri();
return restTemplate.getForObject(uri+"/payment/lb",String.class);
}