负载均衡中间件及算法解析
负载均衡中间件
主流软件负载均衡中间件对比
常用负载均衡算法
● 随机
● 加权随机
● 轮询
● 加权轮询
● 平滑加权轮询
● 最小调用时间
● 一致性hash
通用代码
/**
* 负载均衡策略类接口
* @author weidongge
* @date 2022-03-14 16:31
*/
public interface LoadBalanceStrategy {
/**
* 负载均衡接口方法
*
* @param configs configs
* @param object object
* @return com.superwei.utils.lb.ProviderConfig
* @author apple
* @date 2022/3/14
*/
ServiceProvider select(List<ServiceProvider> configs, Object object);
}
/**
* 服务实体
* @author weidongge
* @date 2022-03-14 16:31
*/
@Data
public class ServiceProvider {
private String host;
private Integer port;
private String interfaceName;
private String[] methods;
private String application;
private int weight;
private int currentWeight;
private int callTime;
}
/**
* 测试
*
* @param strategy strategy
* @param configNum configNum
* @param testCount testCount
* @author apple
* @date 2022/3/14
*/
public void loadBalance(LoadBalanceStrategy strategy ,int configNum,int testCount ){
List<ServiceProvider> configs = new ArrayList<>();
int[] counts = new int[configNum];
for(int i = 0; i< configNum; i++){
ServiceProvider config = new ServiceProvider();
config.setInterfaceName("com.serviceImpl" + i);
config.setHost("127.0.0.1");
config.setPort(i);
int weight = new Random().nextInt(100);
config.setWeight(0);
config.setCurrentWeight(weight);
config.setCallTime(new Random().nextInt(100));
configs.add(config);
}
for(int i = 0; i< testCount ; i++){
ServiceProvider config = strategy.select(configs,"127.0.0.1:1234");
int count = counts[config.getPort()];
counts[config.getPort()] = ++count;
}
for(int i = 0; i< configNum; i++){
ServiceProvider provider = configs.get(i);
System.out.println("序号:" + i +
" 服务:" + provider.getHost() + ":" + provider.getPort() + "&" + provider.getInterfaceName()+
" 权重:" + provider.getWeight() + " " +
" 调用时间:" + provider.getCallTime() +
" 被调用次数:" + counts[i]);
}