版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/YQYnsmile/article/details/78910265
上一篇介绍了负载均衡的轮询,随机,跟hash算法,这边我们一起了解下,加权的轮询以及加权的随机。其实理解好了轮询跟随机算法,再加权的话其实是差不多的。
看面通过代码来了解:
(1)为了不重复创建一个server列表,我们先建立一个共有的server列表,如下:
public static Map<String,Integer> ipMapList = new HashMap<String,Integer>();
static{
ipMapList.put("102.33.22.34", 3);
ipMapList.put("102.33.21.35", 1);
ipMapList.put("102.33.23.36", 7);
ipMapList.put("102.33.24.37", 6);
ipMapList.put("102.33.25.38", 2);
ipMapList.put("102.33.26.39", 2);
ipMapList.put("102.33.27.11", 4);
ipMapList.put("102.33.28.56", 8);
ipMapList.put("102.33.29.56", 4);
ipMapList.put("102.33.30.37", 9);
}
(2)我们先来认识下加权轮询:
private static volatile int pos = 0;
public static String getServerIP(){
String ip = null;
Map<String,Integer> map = new HashMap<String,Integer>();
map.putAll(IPMapList.ipMapList);
Set<String> keySet = map.keySet();
Iterator<String> iterator = keySet.iterator();
List<String> list = new ArrayList<>();
while(iterator.hasNext()){
String server = iterator.next();
int weight = map.get(server);
for(int i=0;i<weight;i++){
list.add(server);
}
}
if(pos>list.size()) pos = 0;
ip = list.get(pos);
pos++;
return ip;
}
public static void main(String[] args) {
System.out.println(getServerIP());
}
看完之后是不是觉得没什么变化,只是添加了红色的部分,当然了,加权也不一定这样加,这里可以自己想适合的加权算法。
(3)加权随机
public static String getServerIp(){
String ip = null;
Map<String,Integer> map = new HashMap<String,Integer>();
map.putAll(IPMapList.ipMapList);
Set<String> keySet = map.keySet();
Iterator<String> iterator = keySet.iterator();
List<String> list = new ArrayList<>();
while(iterator.hasNext()){
String server = iterator.next();
int weight = map.get(server);
for(int i=0;i<weight;i++){
list.add(server);
}
}
Random random = new Random();
int pos = random.nextInt(list.size());
ip = list.get(pos);
return ip;
}
public static void main(String[] args) {
System.out.println(getServerIp());
}
对比一下,其实加权轮询和随机跟不加权只是单单添加了一个参数,来限制获取服务器的地址,这个根据适合场景,随机应变就好。