闽公网安备 35020302035485号

依此类推……
public class RoundRobinDemo {
// 定义一个全局计数器,每次调用时递增
privatestatic AtomicInteger index = new AtomicInteger(-1);
// 定义一个服务器列表
privatestatic List<String> serverList = new ArrayList<>();
// 堆代码 duidaima.com
public static String roundRobin() {
// 获取服务器数量
int serverCount = serverList.size();
// 确定当前请求应转发到哪个服务器
int currentServerIndex = index.incrementAndGet() % serverCount;
// 返回相应的服务器地址
return serverList.get(currentServerIndex);
}
public static void main(String[] args) {
serverList.add("Server A");
serverList.add("Server B");
serverList.add("Server C");
System.out.println(roundRobin());
System.out.println(roundRobin());
System.out.println(roundRobin());
System.out.println(roundRobin());
}
}
输出结果:Server A Server B Server C Server A二.加权轮询算法(Weighted Round Robin)

public class WeightRoundRobinDemo {
// 定义一个全局计数器,每次调用时递增
privatestatic AtomicInteger atomicInteger = new AtomicInteger(0);
// 定义一个服务器及其对应权重值的映射
privatestatic Map<String, Integer> serverMap = new TreeMap<>();
// 记录所有服务器的总权重
privatestaticint totalWeight = 0;
// 堆代码 duidaima.com
public static void main(String[] args) {
serverMap.put("Server A", 4);
serverMap.put("Server B", 3);
serverMap.put("Server C", 1);
// 计算所有服务器的总权重
for (Map.Entry<String, Integer> entry : serverMap.entrySet()) {
totalWeight += entry.getValue();
}
// 模拟四个请求
System.out.println(weightRoundRobin());
System.out.println(weightRoundRobin());
System.out.println(weightRoundRobin());
System.out.println(weightRoundRobin());
}
public static String weightRoundRobin() {
// 获取服务器数量
int serverCount = serverMap.size();
// 如果没有可用服务器,返回null
if (serverCount == 0) {
returnnull;
}
// 为避免多线程环境中并发操作导致的错误,在方法内部执行锁操作
synchronized (serverMap) {
// 确定当前请求应转发到哪个服务器
int currentServerIndex = atomicInteger.incrementAndGet() % totalWeight;
// 遍历服务器列表并根据服务器权重值选择相应地址
for (Map.Entry<String, Integer> entry : serverMap.entrySet()) {
String serverAddress = entry.getKey();
Integer weight = entry.getValue();
currentServerIndex -= weight;
if (currentServerIndex < 0) {
return serverAddress;
}
}
}
returnnull;
}
}
输出结果:Server A Server A Server A Server B三.随机算法(Random)

// 定义一个服务器列表
privatestatic List<String> serverList = new ArrayList<>();
public static String random() {
// 获取服务器数量
int serverCount = serverList.size();
// 如果没有可用服务器,返回null
if (serverCount == 0) {
returnnull;
}
// 生成一个随机数
int randomIndex = new Random().nextInt(serverCount);
// 返回相应的服务器地址
return serverList.get(randomIndex);
}
4.加权随机算法(Weighted Random)
// 定义一个服务器及其对应权重值的映射
privatestatic Map<String, Integer> serverMap = new ConcurrentHashMap<>();
public static String weightRandom() {
// 获取服务器数量
int serverCount = serverMap.size();
// 如果没有可用服务器,返回null
if (serverCount == 0) {
returnnull;
}
// 为避免多线程环境中并发操作导致的错误,在方法内部执行锁操作
synchronized (serverMap) {
// 计算所有服务器的总权重
int totalWeight = 0;
for (Map.Entry<String, Integer> entry : serverMap.entrySet()) {
totalWeight += entry.getValue();
}
}
// 生成一个随机数
int randomWeight = new Random().nextInt(totalWeight);
// 遍历服务器列表并根据服务器权重值选择相应地址
for (Map.Entry<String, Integer> entry : serverMap.entrySet()) {
String serverAddress = entry.getKey();
Integer weight = entry.getValue();
randomWeight -= weight;
if (randomWeight < 0) {
return serverAddress;
}
}
// 默认返回null
returnnull;
}
五.源IP哈希算法(Hash)
// 定义一个服务器列表
privatestatic List<String> serverList = new ArrayList<>();
public static String hash(String clientIP) {
// 获取服务器数量
int serverCount = serverList.size();
// 如果没有可用服务器,返回null
if (serverCount == 0) {
returnnull;
}
// 计算客户端IP地址的哈希码
int hashCode = clientIP.hashCode();
// 根据哈希码确定请求应转发到哪个服务器
int serverIndex = hashCode % serverCount;
// 返回相应的服务器地址
return serverList.get(serverIndex);
}
六.最少连接算法(Least Connections)
// 定义一个服务器列表
privatestatic List<String> serverList = new ArrayList<>();
// 记录每个服务器的连接数
privatestatic Map<String, Integer> connectionsMap = new ConcurrentHashMap<>();
public static String leastConnections() {
// 获取服务器数量
int serverCount = serverList.size();
// 如果没有可用服务器,返回null
if (serverCount == 0) {
returnnull;
}
// 默认选择第一个服务器
String selectedServerAddress = serverList.get(0);
// 获取第一个服务器的连接数
int minConnections = connectionsMap.getOrDefault(selectedServerAddress, 0);
// 遍历服务器列表以找到连接数最少的服务器
for (int i = 1; i < serverCount; i++) {
String serverAddress = serverList.get(i);
int connections = connectionsMap.getOrDefault(serverAddress, 0);
if (connections < minConnections) {
selectedServerAddress = serverAddress;
minConnections = connections;
}
}
// 返回连接数最少的服务器的地址
return selectedServerAddress;
}
需要注意的是,如果服务器宕机或网络链路中断,负载均衡器将需要重新计算服务器的连接数,这将延长响应时间并影响性能。