“在代码的世界里,每一行都是进步的足迹,每一次挑战都是成长的机遇。”

常见负载均衡算法demo

1. 随机算法(Random):随机选择一个服务器来处理请求。

2. 轮询算法(Round Robin):按照顺序依次将请求分发给每个服务器,循环往复。

3. 加权轮询算法(Weighted Round Robin):根据服务器的权重,按照一定的比例分发请求。

4. 最少连接算法(Least Connection):选择当前连接数最少的服务器来处理请求。

5. IP哈希算法(IP Hash):根据客户端的IP地址进行哈希计算,将请求分发给对应的服务器。

以下是常见负载均衡算法的最佳使用场景:

1. 随机算法(Random):适用于无需考虑服务器负载情况的场景。每次请求都随机选择一个服务器处理,简单且均衡地分发请求。

2. 轮询算法(Round Robin):适用于服务器性能相近的场景。按照顺序将请求依次分发给每个服务器,实现请求的均匀分配。

3. 加权轮询算法(Weighted Round Robin):适用于服务器性能不均衡的场景。通过为每个服务器分配不同的权重,可以根据服务器的性能来调整请求的分发比例。

4. 最少连接算法(Least Connection):适用于处理长连接或连接持续时间较长的场景。选择当前连接数最少的服务器来处理请求,可以有效地分担服务器的负载。

5. IP哈希算法(IP Hash):适用于需要保持会话一致性的场景。根据客户端的IP地址进行哈希计算,将同一客户端的请求始终分发到同一台服务器,确保会话的连续性。

package com.xiang.design.create.loadBalancer;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class LoadBalancer {
private static List<String> servers;
private Random random;

public LoadBalancer() {
servers = new ArrayList<>();
servers.add("192.168.0.1");
servers.add("192.168.0.2");
servers.add("192.168.0.3");
random = new Random();
}

public String randomAlgorithm() {
int index = random.nextInt(servers.size());
return servers.get(index);
}

public String roundRobinAlgorithm() {
// 使用静态变量记录当前请求的索引
int index = RequestCounter.getNextIndex(servers.size());
return servers.get(index);
}

public String weightedRoundRobinAlgorithm() {
// 假设服务器的权重分别为2、35
int[] weights = {2, 3, 5};
int totalWeight = 0;
for (int weight : weights) {
totalWeight += weight;
}

int randomWeight = random.nextInt(totalWeight);
int sum = 0;
int index = 0;
for (int weight : weights) {
sum += weight;
if (randomWeight < sum) {
return servers.get(index);
}
index++;
}

return servers.get(servers.size() - 1);
}

public String leastConnectionAlgorithm() {
// 假设服务器的当前连接数分别为10、58
int[] connections = {10, 5, 8};
int minConnections = Integer.MAX_VALUE;
int index = 0;
for (int i = 0; i < connections.length; i++) {
if (connections[i] < minConnections) {
minConnections = connections[i];
index = i;
}
}

return servers.get(index);
}

public String ipHashAlgorithm(String clientIp) {
int hashCode = clientIp.hashCode();
int index = Math.abs(hashCode) % servers.size();
return servers.get(index);
}

public static void main(String[] args) {
LoadBalancer loadBalancer = new LoadBalancer();

// 使用随机算法
String randomServer = loadBalancer.randomAlgorithm();
System.out.println("Random algorithm: " + randomServer);

// 使用轮询算法
String roundRobinServer1 = loadBalancer.roundRobinAlgorithm();
String roundRobinServer2 = loadBalancer.roundRobinAlgorithm();
System.out.println("Round Robin algorithm: " + roundRobinServer1 + ", " + roundRobinServer2);

// 使用加权轮询算法
String weightedRoundRobinServer1 = loadBalancer.weightedRoundRobinAlgorithm();
String weightedRoundRobinServer2 = loadBalancer.weightedRoundRobinAlgorithm();
System.out.println("Weighted Round Robin algorithm: " + weightedRoundRobinServer1 + ", " + weightedRoundRobinServer2);

// 使用最少连接算法
String leastConnectionServer = loadBalancer.leastConnectionAlgorithm();
System.out.println("Least Connection algorithm: " + leastConnectionServer);

// 使用IP哈希算法
String clientIp = "192.168.1.100";
String ipHashServer = loadBalancer.ipHashAlgorithm(clientIp);
System.out.println("IP Hash algorithm: " + ipHashServer);
}
}

class RequestCounter {
private static int index = 0;

public static synchronized int getNextIndex(int size) {
int currentIndex = index;
index = (index + 1) % size;
return currentIndex;
}
}

Write your comment Here