负载均衡算法---Java简单实现(2)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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());
	}

对比一下,其实加权轮询和随机跟不加权只是单单添加了一个参数,来限制获取服务器的地址,这个根据适合场景,随机应变就好。

猜你喜欢

转载自blog.csdn.net/YQYnsmile/article/details/78910265