java轮训算法_自定义轮询算法

本文介绍了如何在Java中实现一个自定义的轮询算法,用于负载均衡。核心思想是通过请求次数除以服务提供者的数量并取余数来选择服务实例。具体实现包括定义LoadBalancer接口,创建实现类MyLB,使用AtomicInteger保证线程安全,并在启动类上配置自定义的负载均衡规则。最后,在消费端通过注解和接口调用来实现轮询调用微服务。
摘要由CSDN通过智能技术生成

轮询算法的核心为:用发出请求的次数除以所调用微服务的提供者数量,并取余数。

算法如下:

接口:

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);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值