Ribbon负载均衡算法之轮循(面试重点)

本文介绍了如何利用自旋锁和CAS指令实现微服务的负载均衡策略。通过原子整数 AtomicInteger 实现自旋锁,保证并发安全性,并以微服务实例列表为基础,进行轮询调用。每次调用时,根据当前计数器更新并返回对应服务实例,确保负载均衡。此外,还强调了自旋锁相对于传统锁的轻量级特性。
摘要由CSDN通过智能技术生成


该算法采用自旋锁加CAS指令:

1、算法核心思想:

通过微服务名来获取所有活着的服务。

         List<ServiceInstance> serviceList = discoveryClient.getInstances("微服务名");

如:

127.0.0.1:8001 = serviceList.get(0)      第一个服务

127.0.0.1:8002 = serviceList.get(1)      第二个服务

。。。

这个两个服务作为集群,总服务数数为2。那么轮循的意思:

第一次调用:n = 1 ; n % 2 = 1 ,那么就调用 serviceList.get(1);

第二次调用:n = 2 ; n % 2 = 0 ,那么就调用 serviceList.get(0);

。。。

2、算法的实现:

private AtomicInteger atomicInteger = new AtomicInteger(0);
public int getIncrementNum(){
    int current;
    int next;
    //这里使用do while 来实现自旋锁,
    //不要用synchronized和lock 这两把锁比较重。来使用CAS来进行实现赋值。
    do {
        current = this.atomicInteger.get();
        //next = current + 1;//切记不要超过2147483647
        next = current >= 2147483647 ? 0 : current + 1 ;
    }   while (!this.atomicInteger.compareAndSet(current, next));
    //第几次访问 next为第几次
    return next;
}

public ServiceInstance service(List<ServiceInstance> serviceInstanceList){
    if (serviceInstanceList==null||serviceInstanceList.size()==0){
          return null;
    }
    int index = this.getIncrementNum() % serviceInstanceList.size();
     return  serviceInstanceList.get(index);
}

一起学习!一起分享!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值