負載均衡演算法---Java簡單實現(2)
阿新 • • 發佈:2018-11-23
上一篇介紹了負載均衡的輪詢,隨機,跟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());
}
對比一下,其實加權輪詢和隨機跟不加權只是單單添加了一個引數,來限制獲取伺服器的地址,這個根據適合場景,隨機應變就好。