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()); //} } }
--------------------------------------
勿忘初心 方得始终
--------------------------------------