1.在服务的消费方提供一个接口
public interface LoadBalancer{
ServiceInstance instance(List<ServiceInstance> serviceInstanceList);
}
2.实现接口
@Component
public class MyLb implements LoadBalancer{
private AtomicInteger atomicInteger = new AtomicInteger(0);
private 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));
return next;
}
@Override
public ServiceInstance instance(List<ServiceInstance> serviceInstanceList) {
int index = getAndIncrement() % serviceInstanceList.size();
return serviceInstanceList.get(index);
}
}
3.Controller接口实现 ,记住注释@LoadBalanced
public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";
@Resource
private DiscoveryClient discoveryClient;
@Resource
private LoadBalancer loadBalanced;
@GetMapping(value = "/consumer/payment/lb")
public String getPaymentLB(){
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
if(instances == null || instances.size()<=0){
return null;
}
ServiceInstance serviceInstance = loadBalanced.instance(instances);
URI uri = serviceInstance.getUri();
return restTemplate.getForObject(uri+"/payment/lb",String.class);
}