依此类推……
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; }需要注意的是,如果服务器宕机或网络链路中断,负载均衡器将需要重新计算服务器的连接数,这将延长响应时间并影响性能。