loadbalance轮询算法 java实现
/**
* <html>
* <body>
* <P> Copyright JasonInternational</p>
* <p> All rights reserved.</p>
* <p> Created on 2018年5月16日 下午8:33:15</p>
* <p> Created by Jason</p>
* </body>
* </html>
*/
package cn.ucaner.component.loadbalance;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* @Package:cn.ucaner.datastructure.loadbalance
* @ClassName:Hash
* @Description: <p> Hash</p>
* @Author: - Jason
* @CreatTime:2018年5月16日 下午8:38:29
* @Modify By:
* @ModifyTime: 2018年5月16日
* @Modify marker:
* @version V1.0
*/
public class Hash {
public static String getServer(){
// 重建一个Map,避免服务器的上下线导致的并发问题
Map<String, Integer> serverMap = new HashMap<String, Integer>();
serverMap.putAll(IpMap.serverWeightMap);
// 取得Ip地址List
Set<String> keySet = serverMap.keySet();
ArrayList<String> keyList = new ArrayList<String>();
keyList.addAll(keySet);
// 在Web应用中可通过HttpServlet的getRemoteIp方法获取
String remoteIp = "127.0.0.1";
int hashCode = remoteIp.hashCode();
int serverListSize = keyList.size();
int serverPos = hashCode % serverListSize;
return keyList.get(serverPos);
}
/**
* @Description: Just for Test
* @param args void
* @Autor: Jason - Jasonandy@hotmail.com
*/
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println(getServer());
}
}
}
/** * <html> * <body> * <P> Copyright JasonInternational</p> * <p> All rights reserved.</p> * <p> Created on 2018年5月16日 下午8:00:17</p> * <p> Created by Jason</p> * </body> * </html> */ package cn.ucaner.component.loadbalance; import java.util.HashMap; /** * @Package:cn.ucaner.datastructure.loadbalance * @ClassName:IpMap * @Description: <p> IpMap * https://www.cnblogs.com/szlbm/p/5588555.html * </p> * @Author: - Jason * @CreatTime:2018年5月16日 下午8:00:17 * @Modify By: * @ModifyTime: 2018年5月16日 * @Modify marker: * @version V1.0 */ public class IpMap { // 待路由的Ip列表,Key代表Ip,Value代表该Ip的权重 public static HashMap<String, Integer> serverWeightMap = new HashMap<String, Integer>(); static{ serverWeightMap.put("192.168.1.100", 1); serverWeightMap.put("192.168.1.101", 1); // 权重为4 serverWeightMap.put("192.168.1.102", 4); serverWeightMap.put("192.168.1.103", 1); serverWeightMap.put("192.168.1.104", 1); // 权重为3 serverWeightMap.put("192.168.1.105", 3); serverWeightMap.put("192.168.1.106", 1); // 权重为2 serverWeightMap.put("192.168.1.107", 2); serverWeightMap.put("192.168.1.108", 1); serverWeightMap.put("192.168.1.109", 1); serverWeightMap.put("192.168.1.110", 1); } }
/** * <html> * <body> * <P> Copyright JasonInternational</p> * <p> All rights reserved.</p> * <p> Created on 2018年5月16日 下午8:33:15</p> * <p> Created by Jason</p> * </body> * </html> */ package cn.ucaner.component.loadbalance; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.Set; /** * @Package:cn.ucaner.datastructure.loadbalance * @ClassName:Random * @Description: <p> Random * * 基于概率统计的理论,吞吐量越大,随机算法的效果越接近于轮询算法的效果 * </p> * @Author: - 随机算法 * @CreatTime:2018年5月16日 下午8:36:48 * @Modify By: * @ModifyTime: 2018年5月16日 * @Modify marker: * @version V1.0 */ public class Random { public static String getServer(){ // 重建一个Map,避免服务器的上下线导致的并发问题 Map<String, Integer> serverMap = new HashMap<String, Integer>(); serverMap.putAll(IpMap.serverWeightMap); // 取得Ip地址List Set<String> keySet = serverMap.keySet(); ArrayList<String> keyList = new ArrayList<String>(); keyList.addAll(keySet); java.util.Random random = new java.util.Random();//获取随机数 int randomPos = random.nextInt(keyList.size()); return keyList.get(randomPos); } /** * @Description: Just for Test * @param args void * @Autor: Jason - Jasonandy@hotmail.com */ public static void main(String[] args) { for (int i = 0; i < 10; i++) { System.out.println(getServer()); } } }
/** * <html> * <body> * <P> Copyright JasonInternational</p> * <p> All rights reserved.</p> * <p> Created on 2018年5月16日 下午8:33:15</p> * <p> Created by Jason</p> * </body> * </html> */ package cn.ucaner.component.loadbalance; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.Set; /** * @Package:cn.ucaner.datastructure.loadbalance * @ClassName:RoundRobin * @Description: <p> 轮询算法 * https://www.cnblogs.com/szlbm/p/5588555.html * </p> * @Author: - Jason * @CreatTime:2018年5月16日 下午8:33:15 * @Modify By: * @ModifyTime: 2018年5月16日 * @Modify marker: * @version V1.0 */ public class RoundRobin { private static Integer pos = 0; public static String getServer(){ // 重建一个Map,避免服务器的上下线导致的并发问题 Map<String, Integer> serverMap = new HashMap<String, Integer>(); serverMap.putAll(IpMap.serverWeightMap); // 取得Ip地址List Set<String> keySet = serverMap.keySet(); ArrayList<String> keyList = new ArrayList<String>(); keyList.addAll(keySet); String server = null; synchronized (pos){ if (pos > keySet.size()) pos = 0; server = keyList.get(pos); pos ++; } return server; } /** * @Description: Just for Test * @param args void * @Autor: Jason - Jasonandy@hotmail.com */ public static void main(String[] args) { for (int i = 0; i < 10; i++) { System.out.println(getServer()); } } }
/** * <html> * <body> * <P> Copyright JasonInternational</p> * <p> All rights reserved.</p> * <p> Created on 2018年5月16日 下午8:33:15</p> * <p> Created by Jason</p> * </body> * </html> */ package cn.ucaner.component.loadbalance; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; /** * @Package:cn.ucaner.datastructure.loadbalance * @ClassName:WeightRandom * @Description: <p> WeightRandom </p> * @Author: - * @CreatTime:2018年5月16日 下午8:41:24 * @Modify By: * @ModifyTime: 2018年5月16日 * @Modify marker: * @version V1.0 */ public class WeightRandom { public static String getServer(){ // 重建一个Map,避免服务器的上下线导致的并发问题 Map<String, Integer> serverMap = new HashMap<String, Integer>(); serverMap.putAll(IpMap.serverWeightMap); // 取得Ip地址List Set<String> keySet = serverMap.keySet(); Iterator<String> iterator = keySet.iterator(); List<String> serverList = new ArrayList<String>(); while (iterator.hasNext()){ String server = iterator.next(); int weight = serverMap.get(server); for (int i = 0; i < weight; i++) serverList.add(server); } java.util.Random random = new java.util.Random(); int randomPos = random.nextInt(serverList.size()); return serverList.get(randomPos); } /** * @Description: Just for Test * @param args void * @Autor: Jason - Jasonandy@hotmail.com */ public static void main(String[] args) { for (int i = 0; i < 10; i++) { System.out.println(getServer()); } } }
/** * <html> * <body> * <P> Copyright JasonInternational</p> * <p> All rights reserved.</p> * <p> Created on 2018年5月16日 下午8:33:15</p> * <p> Created by Jason</p> * </body> * </html> */ package cn.ucaner.component.loadbalance; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; /** * @Package:cn.ucaner.datastructure.loadbalance * @ClassName:WeightRoundRobin * @Description: <p> WeightRoundRobin </p> * @Author: - Jason * @CreatTime:2018年5月16日 下午8:39:44 * @Modify By: * @ModifyTime: 2018年5月16日 * @Modify marker: * @version V1.0 */ public class WeightRoundRobin { private static Integer pos; public static String getServer(){ // 重建一个Map,避免服务器的上下线导致的并发问题 Map<String, Integer> serverMap = new HashMap<String, Integer>(); serverMap.putAll(IpMap.serverWeightMap); // 取得Ip地址List Set<String> keySet = serverMap.keySet(); Iterator<String> iterator = keySet.iterator(); List<String> serverList = new ArrayList<String>(); while (iterator.hasNext()) { String server = iterator.next(); int weight = serverMap.get(server); for (int i = 0; i < weight; i++) serverList.add(server); } String server = null; synchronized (pos){ if (pos > keySet.size()) pos = 0; server = serverList.get(pos); pos ++; } return server; } /** * @Description: Just for Test * @param args void * @Autor: Jason - Jasonandy@hotmail.com */ public static void main(String[] args) { //for (int i = 0; i < 10; i++) { System.out.println(getServer()); //} } }
--------------------------------------
勿忘初心 方得始终
--------------------------------------

浙公网安备 33010602011771号