负载均衡-加权轮询
由于访问概率大致相同,所以如果部分服务器性能不一致的话,容易导致性能差的服务器压力过大,所以要根据服务器性能不一致的情况,给性能好的服务器多处理请求,给差的少分配请求(能者多劳)所以就需要在轮询算法的基础上给每台服务器设置权重,延伸为 加权轮询算法
1、将应用服务器集群的IP存到Map里,每个IP对应有一个权重
2、创建一个List,来将所有权重下的IP存到list里面 如:192.168.1.100 权重为3,则需要加入3个IP,192.168.1.102权重为4,则需要加入4个IP,权重越大,该服务器每轮所获得的请求数量越多。
3、循环计算 index ,获取对应的IP
package nginx;
import java.util.*;
public class RandomJava {
/**
* 服务器列表<服务器地址>
*/
public static Map<String, Integer> map = new HashMap<String, Integer>() {
{
put("192.168.1.100", 3);
put("192.168.1.102", 4);
put("192.168.1.103", 5);
}
};
static int index = 0;
/**
* 获取IP
* @return
*/
public static String getServer() {
List<String> ipList = new ArrayList<String>();
for (Map.Entry<String, Integer> item : map.entrySet()) {
//将每个权重W 下的IP添加 W次,来满足权重
for (int i = 0; i < item.getValue(); i++) {
ipList.add(item.getKey());
}
}
if (index == ipList.size()) {
index = 0;
}
return ipList.get(index++);
}
public static void main(String[] args) {
//三台服务器IP的调用概率
double a = 0, b = 0, c = 0;
int size = 100000000;
String ip = "";
for (int i = 0; i < size; i++) {
ip = getServer();
if (ip.equals("192.168.1.100")) {
a++;
}
if (ip.equals("192.168.1.102")) {
b++;
}
if (ip.equals("192.168.1.103")) {
c++;
}
//System.out.println(ip);
}
System.out.println(" a: " + a / size + "\n" + " b: " + b / size + "\n" + " c: " + c / size + "");
}
}