结合“Ribbon负载均衡算法“底层思想来手写一个负载均衡算法例子

Ribbon负载均衡算法

1、原理

接口请求的请求次数 % 服务器集群总数量 = 实际调用服务器位置下标(也就是当前获得的服务器),每次服务器重启之后请求接口记数重新从1开始。(参照下图理解)
结合“Ribbon负载均衡算法“底层思想来手写一个负载均衡算法例子_第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

提示:自己手写负载均衡算法时,需要将@LoadBalanced这个注解注释掉

你可能感兴趣的:(spring)