負載:就是后端系統(tǒng)的承載能力。比如同等條件下,一個1核cpu-1G內存的機器的承載能力一般會比8核cpu-8G內存的機器要差;相同配置下,一個cpu利用率為80%的機器比30%的承載能力一般要差等等。
均衡:保證后端請求的平衡。比如:在同等情況下,分配到多臺機器的請求要相當;有些情況下,同一用戶盡可能分配到同一臺機器等等。
負載均衡的算法實際上就是解決跨系統(tǒng)調用的時候,在考慮后端機器承載情況的前提下,保證請求分配的平衡和合理。下面是基于java的負載均衡算法解析及源碼,以供參考。
1、輪詢:
package class2.zookeeper.loadbalance;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* 負載均衡算法,輪詢法
* @author guoy
*
*/
static Map《String,Integer》 serverWeigthMap = new HashMap《String,Integer》();
static{
serverWeigthMap.put(“192.168.1.12”, 1);
serverWeigthMap.put(“192.168.1.13”, 1);
serverWeigthMap.put(“192.168.1.14”, 2);
serverWeigthMap.put(“192.168.1.15”, 2);
serverWeigthMap.put(“192.168.1.16”, 3);
serverWeigthMap.put(“192.168.1.17”, 3);
serverWeigthMap.put(“192.168.1.18”, 1);
serverWeigthMap.put(“192.168.1.19”, 2);
}
Integer pos = 0;
public String roundRobin()
{
//重新建立一個map,避免出現由于服務器上線和下線導致的并發(fā)問題
Map《String,Integer》 serverMap = new HashMap《String,Integer》();
serverMap.putAll(serverWeigthMap);
//獲取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;
}
public static void main(String[] args) {
TestRoundRobin robin = new TestRoundRobin();
for (int i = 0; i 《 20; i++) {
String serverIp = robin.roundRobin();
System.out.println(serverIp);
}
}
}
2、加權輪詢:
package class2.zookeeper.loadbalance;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
/**
* 加權隨機載均衡算法
* @author guoy
*
*/
public class TestWeightRandom {
static Map《String,Integer》 serverWeigthMap = new HashMap《String,Integer》();
static{
serverWeigthMap.put(“192.168.1.12”, 1);
serverWeigthMap.put(“192.168.1.13”, 1);
serverWeigthMap.put(“192.168.1.14”, 2);
serverWeigthMap.put(“192.168.1.15”, 2);
serverWeigthMap.put(“192.168.1.16”, 3);
serverWeigthMap.put(“192.168.1.17”, 3);
serverWeigthMap.put(“192.168.1.18”, 1);
serverWeigthMap.put(“192.168.1.19”, 2);
}
public static String weightRandom()
{
//重新建立一個map,避免出現由于服務器上線和下線導致的并發(fā)問題
Map《String,Integer》 serverMap = new HashMap《String,Integer》();
serverMap.putAll(serverWeigthMap);
//獲取ip列表list
Set《String》 keySet = serverMap.keySet();
Iterator《String》 it = keySet.iterator();
List《String》 serverList = new ArrayList《String》();
while (it.hasNext()) {
String server = it.next();
Integer weight = serverMap.get(server);
for (int i = 0; i 《 weight; i++) {
serverList.add(server);
}
}
Random random = new Random();
int randomPos = random.nextInt(serverList.size());
String server = serverList.get(randomPos);
return server;
}
public static void main(String[] args) {
String serverIp = weightRandom();
System.out.println(serverIp);
}
}
3、隨機:
package class2.zookeeper.loadbalance;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.Set;
/**
* 隨機負載均衡算法
* @author guoy
*
*/
public class TestRandom {
static Map《String,Integer》 serverWeigthMap = new HashMap《String,Integer》();
static{
serverWeigthMap.put(“192.168.1.12”, 1);
serverWeigthMap.put(“192.168.1.13”, 1);
serverWeigthMap.put(“192.168.1.14”, 2);
serverWeigthMap.put(“192.168.1.15”, 2);
serverWeigthMap.put(“192.168.1.16”, 3);
serverWeigthMap.put(“192.168.1.17”, 3);
serverWeigthMap.put(“192.168.1.18”, 1);
serverWeigthMap.put(“192.168.1.19”, 2);
}
public static String random()
{
//重新建立一個map,避免出現由于服務器上線和下線導致的并發(fā)問題
Map《String,Integer》 serverMap = new HashMap《String,Integer》();
serverMap.putAll(serverWeigthMap);
//獲取ip列表list
Set《String》 keySet = serverMap.keySet();
ArrayList《String》 keyList = new ArrayList《String》();
keyList.addAll(keySet);
Random random = new Random();
int randomPos = random.nextInt(keyList.size());
String server = keyList.get(randomPos);
return server;
}
public static void main(String[] args) {
String serverIp = random();
System.out.println(serverIp);
}
}
4、加權隨機:
package class2.zookeeper.loadbalance;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
/**
* 加權隨機載均衡算法
* @author guoy
*
*/
public class TestWeightRandom {
static Map《String,Integer》 serverWeigthMap = new HashMap《String,Integer》();
static{
serverWeigthMap.put(“192.168.1.12”, 1);
serverWeigthMap.put(“192.168.1.13”, 1);
serverWeigthMap.put(“192.168.1.14”, 2);
serverWeigthMap.put(“192.168.1.15”, 2);
serverWeigthMap.put(“192.168.1.16”, 3);
serverWeigthMap.put(“192.168.1.17”, 3);
serverWeigthMap.put(“192.168.1.18”, 1);
serverWeigthMap.put(“192.168.1.19”, 2);
}
public static String weightRandom()
{
//重新建立一個map,避免出現由于服務器上線和下線導致的并發(fā)問題
Map《String,Integer》 serverMap = new HashMap《String,Integer》();
serverMap.putAll(serverWeigthMap);
//獲取ip列表list
Set《String》 keySet = serverMap.keySet();
Iterator《String》 it = keySet.iterator();
List《String》 serverList = new ArrayList《String》();
while (it.hasNext()) {
String server = it.next();
Integer weight = serverMap.get(server);
for (int i = 0; i 《 weight; i++) {
serverList.add(server);
}
}
Random random = new Random();
int randomPos = random.nextInt(serverList.size());
String server = serverList.get(randomPos);
return server;
}
public static void main(String[] args) {
String serverIp = weightRandom();
System.out.println(serverIp);
}
}
5、ip hash:
package class2.zookeeper.loadbalance;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* 負載均衡 ip_hash算法
* @author guoy
*
*/
public class TestIpHash {
static Map《String,Integer》 serverWeigthMap = new HashMap《String,Integer》();
static{
serverWeigthMap.put(“192.168.1.12”, 1);
serverWeigthMap.put(“192.168.1.13”, 1);
serverWeigthMap.put(“192.168.1.14”, 2);
serverWeigthMap.put(“192.168.1.15”, 2);
serverWeigthMap.put(“192.168.1.16”, 3);
serverWeigthMap.put(“192.168.1.17”, 3);
serverWeigthMap.put(“192.168.1.18”, 1);
serverWeigthMap.put(“192.168.1.19”, 2);
}
/**
* 獲取請求服務器地址
* @param remoteIp 負載均衡服務器ip
* @return
*/
public static String ipHash(String remoteIp)
{
//重新建立一個map,避免出現由于服務器上線和下線導致的并發(fā)問題
Map《String,Integer》 serverMap = new HashMap《String,Integer》();
serverMap.putAll(serverWeigthMap);
//獲取ip列表list
Set《String》 keySet = serverMap.keySet();
ArrayList《String》 keyList = new ArrayList《String》();
keyList.addAll(keySet);
int hashCode =remoteIp.hashCode();
int serverListSize = keyList.size();
int serverPos = hashCode % serverListSize;
return keyList.get(serverPos);
}
public static void main(String[] args) {
String serverIp = ipHash(“192.168.1.12”);
System.out.println(serverIp);
}
}
評論