一、随机法(Random)
完全随机:通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。由概率统计理论可以得知,随着客户端调用服务端的次数增多,其实际效果越来越接近于平均分配调用量到后端的每一台服务器,也就是轮询的结果。
代码实现:
public class Servers {
public List<String> list = new ArrayList<>() {
{
add("192.168.1.1");
add("192.168.1.2");
add("192.168.1.3");
}
};
}
public class FullRandom {
static Servers servers = new Servers();
static Random random = new Random();
public static String go() {
var number = random.nextInt(servers.list.size()); // 创建一个0 ~ list.size() 之间的一个随机数
return servers.list.get(number); // 随机获取list中的值
}
public static void main(String[] args) {
for (var i = 0; i < 10; i++) {
System.out.println(go());
}
}
}
当有充足的请求次数,就会越来越平均;完全随机是最简单的负载均衡算法了,缺点比较明显,因为服务器有好有坏,处理能力是不同的,我们希望性能好的服务器多处理些请求,性能差的服务器少处理一些请求,所以就有了加权随机。
加权随机:虽然还是采用的随机算法,但是为每台服务器设置了权重,权重大的服务器获得的概率大一些,权重小的服务器获得的概率小一些。
方法一:服务器的权重是多少就加入多少次服务器的 ip 到 List 中
代码实现:
public class Servers {
public HashMap<String, Integer> map = new HashMap<>() {
{
put("192.168.1.1", 2); // map 中的值代表该服务器对应的权重
put("192.168.1.2", 7);
put("192.168.1.3", 1