1. 程式人生 > >負載均衡演算法---Java簡單實現(2)

負載均衡演算法---Java簡單實現(2)

上一篇介紹了負載均衡的輪詢,隨機,跟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()); }

對比一下,其實加權輪詢和隨機跟不加權只是單單添加了一個引數,來限制獲取伺服器的地址,這個根據適合場景,隨機應變就好。