负载均衡-加权随机算法
由于访问概率大致相同,所以如果部分服务器性能不一致的话,容易导致性能差的服务器压力过大,所以要根据服务器性能不一致的情况,给性能好的服务器多处理请求,给差的少分配请求(能者多劳)所以就需要在随机算法的基础上给每台服务器设置权重,延伸为加权随机算法
package nginx;
import java.util.*;
/**
* 负载均衡
* 加权随机算法
* <P>由于访问概率大致相同,所以如果部分服务器性能不一致的话,容易导致性能差的服务器压力过大,所以要根据服务器性能不一致的情况,给性能好的服务器多处理请求,给差的少分配请求(能者多劳)所以就需要在随机算法的基础上给每台服务器设置权重,延伸为加权随机算法</P>
*
* <li>1、将应用服务器集群的IP存到Map里,每个IP对应有一个权重</li>
* <li>2、创建一个List,来将所有权重下的IP存到list里面 如:192.168.1.100 权重为3,则需要加入3个IP,192.168.1.102权重为4,则需要加入4个IP </li>
* <li>3、在0~所有权重之和的范围中选出一个随机数,这个随机数对应List的位置即是当前选取出来的IP地址 </li>
* <li>4、在调用量越大的情况下,每台服务器的流量分配处理概率越均衡(性能好的能分配较多的流量)</li>
*
* @author Administrator
*/
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 Random random = new Random();
/**
* 获取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());
}
}
//当前服务器IP地址的权重之和
int allWeight = map.values().stream().mapToInt(a -> a).sum();
System.out.println(allWeight + "");
//随机选取一个IP
int number = random.nextInt(allWeight);
System.out.println(Arrays.toString(ipList.toArray()));
return ipList.get(number);
}
public static void main(String[] args) {
//三台服务器IP的调用概率
double a = 0, b = 0, c = 0;
int size = 100000;
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(a / size + "\n" + b / size + "\n" + c / size + "");
}
}
权重之和:12
List: [192.168.1.103, 192.168.1.103, 192.168.1.103, 192.168.1.103, 192.168.1.103, 192.168.1.100, 192.168.1.100, 192.168.1.100, 192.168.1.102, 192.168.1.102, 192.168.1.102, 192.168.1.102]
概率:
0.25059
0.33183
0.41758