Ribbon负载均衡算法
1、原理
接口请求的请求次数 % 服务器集群总数量 = 实际调用服务器位置下标(也就是当前获得的服务器),每次服务器重启之后请求接口记数重新从1开始。(参照下图理解)
2、自己动手写一个本地的负载均衡算法
a)首先创建一个负载均衡的接口(LoadBalancer)
public interface LoadBalancer {
ServiceInstance instances(List<ServiceInstance> serviceInstances);
}
b)创建这个接口的实现类
@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 >= 2147483647 ? 0 : current + 1;
}while (!this.atomicInteger.compareAndSet(current,next));
//compareAndSet 方法为若current和期望值一致,则将这个值替换为next
System.out.println("*****第几次访问,次数next: "+next);
return next;
}
@Override
public ServiceInstance instances(List<ServiceInstance> serviceInstances) {
int index = getAndIncrement() % serviceInstances.size();
return serviceInstances.get(index);
}
}
c)在controller层创建对应方法
@GetMapping(value = "/consumer/payment/lb")
public String getPaymentLB(){
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
//从eureka服务中心发现并获得名为CLOUD-PAYMENT-SERVICE服务中的集群服务器
if (instances==null||instances.size()<=0){
return null;
}
ServiceInstance instance = loadBalancer.instances(instances);
//利用自己写的负载均衡接口处理服务
URI uri = instance.getUri();
return restTemplate.getForObject(uri+"/payment/lb",String.class);
}
d)在浏览器输入url地址测试
http://localhost/consumer/payment/lb