服务注册中心常用的三种负载均衡方式写法
首先我们需要先写一个负载均衡的实例接口,下面写的负载均衡实例都要实现我们的LoadBalance接口
package com.web.balance;
import org.springframework.cloud.client.ServiceInstance;
public interface LoadBalance {
public ServiceInstance getInstance(String name);
}
1.轮询负载均衡,即权重是1:1,我们在集群项目里获取接口的比例都是1,按照顺序轮询然后重复
package com.web.balance;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
@Component
public class RoundLoadBalance implements LoadBalance {
@Autowired
private DiscoveryClient discoveryClient;
private AtomicInteger atomicInteger=new AtomicInteger(0);
@Override
public ServiceInstance getInstance(String name) {
List<ServiceInstance> instances = discoveryClient.getInstances(name);
if (instances == null || instances.size() == 0) {
return null;
}
int a = atomicInteger.incrementAndGet()%instances.size();
return instances.get(a);
}
}
2.随机负载均衡,按照随机数的情况来写
package com.web.balance;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import java.util.List;
@Component
public class RandomLoadBance implements LoadBalance {
@Autowired
DiscoveryClient discoveryClient;
@Override
public ServiceInstance getInstance(String name) {
List<ServiceInstance> instances = discoveryClient.getInstances(name);
int size = instances.size();
if(size==0||instances==null){
return null;
}else{
int rand = (int) (Math.random()*size);
return instances.get(rand);
}
}
}
3.权重负载均衡,我们这里使用的服务注册中心是nacos设置的权重来写的,代码的角度和思路都是一样的按照自己写的来看。
package com.web.balance;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer;
@Component
public class PowerWeightBalance implements LoadBalance{
@Autowired
DiscoveryClient discoveryClient;
private ArrayList<ServiceInstance> list = new ArrayList<ServiceInstance>();
private AtomicInteger count = new AtomicInteger(-1);
@Override
public ServiceInstance getInstance(String name) {
List<ServiceInstance> instances = discoveryClient.getInstances(name);
if (instances.size()==0||instances==null){
return null;
}
instances.forEach((instance)->{
try{
double weight = Double.parseDouble(instance.getMetadata().get("nacos.weight"));
for (int i = 0; i <weight; i++) {
list.add(instance);
}
}catch (Exception e){
throw e;
}
});
return list.get(count.incrementAndGet()%list.size());
}
}