轮询算法的核心为:用发出请求的次数除以所调用微服务的提供者数量,并取余数。
算法如下:
接口:
package order.lb;
import org.springframework.cloud.client.ServiceInstance;
import java.util.List;
public interface LoadBalancer {
ServiceInstance instances(List 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 serviceInstances) {
int i = getAndIncrement() % serviceInstances.size();
return serviceInstances.get(i);
}
}
在启动类上加上注解:
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration = MySelfRule.class),
使用(需注释@LoadBalanced注解):
@GetMapping("consumer/payment/lb")
public String getPayment(){
List 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);
}