负载均衡的几种算法Java实现代码
轮询:
1 package class2.zookeeper.loadbalance; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.Map; 6 import java.util.Set; 7 8 /** 9 * 負載均衡算法,輪詢法 10 * @author guoy 11 * 12 */ 13 public class TestRoundRobin { 14 15 16 static Map<String,Integer> serverWeigthMap = new HashMap<String,Integer>(); 17 18 static{ 19 serverWeigthMap.put("192.168.1.12", 1); 20 serverWeigthMap.put("192.168.1.13", 1); 21 serverWeigthMap.put("192.168.1.14", 2); 22 serverWeigthMap.put("192.168.1.15", 2); 23 serverWeigthMap.put("192.168.1.16", 3); 24 serverWeigthMap.put("192.168.1.17", 3); 25 serverWeigthMap.put("192.168.1.18", 1); 26 serverWeigthMap.put("192.168.1.19", 2); 27 } 28 Integer pos = 0; 29 public String roundRobin() 30 { 31 //重新建立一個map,避免出現由於服務器上線和下線導致的並發問題 32 Map<String,Integer> serverMap = new HashMap<String,Integer>(); 33 serverMap.putAll(serverWeigthMap); 34 //獲取ip列表list 35 Set<String> keySet = serverMap.keySet(); 36 ArrayList<String> keyList = new ArrayList<String>(); 37 keyList.addAll(keySet); 38 39 String server = null; 40 41 synchronized (pos) { 42 if(pos >=keySet.size()){ 43 pos = 0; 44 } 45 server = keyList.get(pos); 46 pos ++; 47 } 48 return server; 49 } 50 51 public static void main(String[] args) { 52 TestRoundRobin robin = new TestRoundRobin(); 53 for (int i = 0; i < 20; i++) { 54 String serverIp = robin.roundRobin(); 55 System.out.println(serverIp); 56 } 57 } 58 }
加权轮询:
1 package class2.zookeeper.loadbalance; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.Iterator; 6 import java.util.List; 7 import java.util.Map; 8 import java.util.Random; 9 import java.util.Set; 10 11 /** 12 * 加權隨機载均衡算法 13 * @author guoy 14 * 15 */ 16 public class TestWeightRandom { 17 18 static Map<String,Integer> serverWeigthMap = new HashMap<String,Integer>(); 19 20 static{ 21 serverWeigthMap.put("192.168.1.12", 1); 22 serverWeigthMap.put("192.168.1.13", 1); 23 serverWeigthMap.put("192.168.1.14", 2); 24 serverWeigthMap.put("192.168.1.15", 2); 25 serverWeigthMap.put("192.168.1.16", 3); 26 serverWeigthMap.put("192.168.1.17", 3); 27 serverWeigthMap.put("192.168.1.18", 1); 28 serverWeigthMap.put("192.168.1.19", 2); 29 } 30 31 public static String weightRandom() 32 { 33 //重新建立一個map,避免出現由於服務器上線和下線導致的並發問題 34 Map<String,Integer> serverMap = new HashMap<String,Integer>(); 35 serverMap.putAll(serverWeigthMap); 36 //獲取ip列表list 37 Set<String> keySet = serverMap.keySet(); 38 Iterator<String> it = keySet.iterator(); 39 40 List<String> serverList = new ArrayList<String>(); 41 42 while (it.hasNext()) { 43 String server = it.next(); 44 Integer weight = serverMap.get(server); 45 for (int i = 0; i < weight; i++) { 46 serverList.add(server); 47 } 48 } 49 Random random = new Random(); 50 int randomPos = random.nextInt(serverList.size()); 51 52 String server = serverList.get(randomPos); 53 return server; 54 } 55 56 public static void main(String[] args) { 57 String serverIp = weightRandom(); 58 System.out.println(serverIp); 59 } 60 }
随机:
1 package class2.zookeeper.loadbalance; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.Map; 6 import java.util.Random; 7 import java.util.Set; 8 9 /** 10 * 隨機负载均衡算法 11 * @author guoy 12 * 13 */ 14 public class TestRandom { 15 16 static Map<String,Integer> serverWeigthMap = new HashMap<String,Integer>(); 17 18 static{ 19 serverWeigthMap.put("192.168.1.12", 1); 20 serverWeigthMap.put("192.168.1.13", 1); 21 serverWeigthMap.put("192.168.1.14", 2); 22 serverWeigthMap.put("192.168.1.15", 2); 23 serverWeigthMap.put("192.168.1.16", 3); 24 serverWeigthMap.put("192.168.1.17", 3); 25 serverWeigthMap.put("192.168.1.18", 1); 26 serverWeigthMap.put("192.168.1.19", 2); 27 } 28 29 public static String random() 30 { 31 //重新建立一個map,避免出現由於服務器上線和下線導致的並發問題 32 Map<String,Integer> serverMap = new HashMap<String,Integer>(); 33 serverMap.putAll(serverWeigthMap); 34 //獲取ip列表list 35 Set<String> keySet = serverMap.keySet(); 36 ArrayList<String> keyList = new ArrayList<String>(); 37 keyList.addAll(keySet); 38 39 Random random = new Random(); 40 int randomPos = random.nextInt(keyList.size()); 41 42 String server = keyList.get(randomPos); 43 return server; 44 } 45 46 public static void main(String[] args) { 47 String serverIp = random(); 48 System.out.println(serverIp); 49 } 50 }
加权随机:
1 package class2.zookeeper.loadbalance; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.Iterator; 6 import java.util.List; 7 import java.util.Map; 8 import java.util.Random; 9 import java.util.Set; 10 11 /** 12 * 加權隨機载均衡算法 13 * @author guoy 14 * 15 */ 16 public class TestWeightRandom { 17 18 static Map<String,Integer> serverWeigthMap = new HashMap<String,Integer>(); 19 20 static{ 21 serverWeigthMap.put("192.168.1.12", 1); 22 serverWeigthMap.put("192.168.1.13", 1); 23 serverWeigthMap.put("192.168.1.14", 2); 24 serverWeigthMap.put("192.168.1.15", 2); 25 serverWeigthMap.put("192.168.1.16", 3); 26 serverWeigthMap.put("192.168.1.17", 3); 27 serverWeigthMap.put("192.168.1.18", 1); 28 serverWeigthMap.put("192.168.1.19", 2); 29 } 30 31 public static String weightRandom() 32 { 33 //重新建立一個map,避免出現由於服務器上線和下線導致的並發問題 34 Map<String,Integer> serverMap = new HashMap<String,Integer>(); 35 serverMap.putAll(serverWeigthMap); 36 //獲取ip列表list 37 Set<String> keySet = serverMap.keySet(); 38 Iterator<String> it = keySet.iterator(); 39 40 List<String> serverList = new ArrayList<String>(); 41 42 while (it.hasNext()) { 43 String server = it.next(); 44 Integer weight = serverMap.get(server); 45 for (int i = 0; i < weight; i++) { 46 serverList.add(server); 47 } 48 } 49 Random random = new Random(); 50 int randomPos = random.nextInt(serverList.size()); 51 52 String server = serverList.get(randomPos); 53 return server; 54 } 55 56 public static void main(String[] args) { 57 String serverIp = weightRandom(); 58 System.out.println(serverIp); 59 } 60 }
ip hash:
1 package class2.zookeeper.loadbalance; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.Map; 6 import java.util.Set; 7 8 /** 9 * 负载均衡 ip_hash算法 10 * @author guoy 11 * 12 */ 13 public class TestIpHash { 14 15 16 static Map<String,Integer> serverWeigthMap = new HashMap<String,Integer>(); 17 18 static{ 19 serverWeigthMap.put("192.168.1.12", 1); 20 serverWeigthMap.put("192.168.1.13", 1); 21 serverWeigthMap.put("192.168.1.14", 2); 22 serverWeigthMap.put("192.168.1.15", 2); 23 serverWeigthMap.put("192.168.1.16", 3); 24 serverWeigthMap.put("192.168.1.17", 3); 25 serverWeigthMap.put("192.168.1.18", 1); 26 serverWeigthMap.put("192.168.1.19", 2); 27 } 28 29 /** 30 * 获取请求服务器地址 31 * @param remoteIp 负载均衡服务器ip 32 * @return 33 */ 34 public static String ipHash(String remoteIp) 35 { 36 //重新建立一個map,避免出現由於服務器上線和下線導致的並發問題 37 Map<String,Integer> serverMap = new HashMap<String,Integer>(); 38 serverMap.putAll(serverWeigthMap); 39 //獲取ip列表list 40 Set<String> keySet = serverMap.keySet(); 41 ArrayList<String> keyList = new ArrayList<String>(); 42 keyList.addAll(keySet); 43 44 int hashCode =remoteIp.hashCode(); 45 int serverListSize = keyList.size(); 46 int serverPos = hashCode % serverListSize; 47 48 return keyList.get(serverPos); 49 } 50 51 public static void main(String[] args) { 52 String serverIp = ipHash("192.168.1.12"); 53 System.out.println(serverIp); 54 } 55 56 }
不定期会发布一些实用的Java开发文章