1. 一般轮询算法
服务器类
package com.sosop.roundRobin;
public class Server {
private String ip;
private int weight;
public Server(String ip) {
super();
this.ip = ip;
}
public Server(String ip, int weight) {
this.ip = ip;
this.weight = weight;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
@Override
public String toString() {
return "Server [ip=" + ip + ", weight=" + weight + "]";
}
}
实现与测试
package com.sosop.roundRobin;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class NormalRoundRobin {
private List<Server> servers;
private int currentIndex;
private int totalServer;
public NormalRoundRobin() {
servers = new ArrayList<>();
servers.add(new Server("192.168.1.2"));
servers.add(new Server("192.168.1.3"));
servers.add(new Server("192.168.1.4"));
servers.add(new Server("192.168.1.5"));
servers.add(new Server("192.168.1.6"));
servers.add(new Server("192.168.1.7"));
servers.add(new Server("192.168.1.8"));
totalServer = servers.size();
currentIndex = totalServer - 1;
}
// 轮询
public Server round() {
currentIndex = (currentIndex + 1) % totalServer;
return servers.get(currentIndex);
}
public static void main(String[] args) {
final NormalRoundRobin r = new NormalRoundRobin();
// 不带并发的轮询
for (int i = 0; i < 14; i++) {
System.out.println(r.round());
}
System.out.println();
System.out.println("==========================");
System.out.println();
final CyclicBarrier b = new CyclicBarrier(14);
// 带并发的轮询
for (int i = 0; i < 14; i++) {
new Thread(new Runnable() {
@Override
public void run() {
try {
b.await();
System.out.println(Thread.currentThread().getName() + " " + r.round());
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}
}, "thread" + i).start();
}
}
}
结果:
Server [ip=192.168.1.2, weight=0]
Server [ip=192.168.1.3, weight=0]
Server [ip=192.168.1.4, weight=0]
Server [ip=192.168.1.5, weight=0]
Server [ip=192.168.1.6, weight=0]
Server [ip=192.168.1.7, weight=0]
Server [ip=192.168.1.8, weight=0]
Server [ip=192.168.1.2, weight=0]
Server [ip=192.168.1.3, weight=0]
Server [ip=192.168.1.4, weight=0]
Server [ip=192.168.1.5, weight=0]
Server [ip=192.168.1.6, weight=0]
Server [ip=192.168.1.7, weight=0]
Server [ip=192.168.1.8, weight=0]
==========================
thread13 Server [ip=192.168.1.2, weight=0]
thread4 Server [ip=192.168.1.6, weight=0]
thread3 Server [ip=192.168.1.5, weight=0]
thread1 Server [ip=192.168.1.3, weight=0]
thread12 Server [ip=192.168.1.7, weight=0]
thread0 Server [ip=192.168.1.2, weight=0]
thread2 Server [ip=192.168.1.4, weight=0]
thread10 Server [ip=192.168.1.6, weight=0]
thread11 Server [ip=192.168.1.5, weight=0]
thread8 Server [ip=192.168.1.3, weight=0]
thread9 Server [ip=192.168.1.4, weight=0]
thread7 Server [ip=192.168.1.2, weight=0]
thread6 Server [ip=192.168.1.8, weight=0]
thread5 Server [ip=192.168.1.7, weight=0]
2.加权轮询
package com.sosop.roundRobin;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class WeightRoundRobin {
private List<Server> servers;
private int currentIndex;
private int totalServer;
private int currentWeight;
private int maxWeight;
private int gcdWeight;
public WeightRoundRobin() {
servers = new ArrayList<>();
servers.add(new Server("192.168.1.2", 5));
servers.add(new Server("192.168.1.3", 10));
servers.add(new Server("192.168.1.4", 15));
servers.add(new Server("192.168.1.5", 100));
servers.add(new Server("192.168.1.6", 5));
servers.add(new Server("192.168.1.7", 20));
servers.add(new Server("192.168.1.8", 30));
totalServer = servers.size();
currentIndex = totalServer - 1;
maxWeight = maxWeight();
gcdWeight = serverGcd();
}
public Server round() {
while (true) {
currentIndex = (currentIndex + 1) % totalServer;
if (currentIndex == 0) {
currentWeight = currentWeight - gcdWeight;
if (currentWeight <= 0) {
currentWeight = maxWeight;
if(currentWeight == 0) {
return null;
}
}
}
if(servers.get(currentIndex).getWeight() >= currentWeight) {
return servers.get(currentIndex);
}
}
}
/**
* 返回所有服务器的权重的最大公约数
*
* @return
*/
private int serverGcd() {
int comDivisor = 0;
for (int i = 0; i < totalServer - 1; i++) {
if (comDivisor == 0) {
comDivisor = gcd(servers.get(i).getWeight(), servers.get(i + 1).getWeight());
} else {
comDivisor = gcd(comDivisor, servers.get(i + 1).getWeight());
}
}
return comDivisor;
}
/**
* 获得服务器中的最大权重
*
* @return
*/
private int maxWeight() {
int max = servers.get(0).getWeight();
int tmp;
for (int i = 1; i < totalServer; i++) {
tmp = servers.get(i).getWeight();
if (max < tmp) {
max = tmp;
}
}
return max;
}
/**
* 求两个数的最大公约数 4和6最大公约数是2
*
* @param num1
* @param num2
* @return
*/
private int gcd(int num1, int num2) {
BigInteger i1 = new BigInteger(String.valueOf(num1));
BigInteger i2 = new BigInteger(String.valueOf(num2));
return i1.gcd(i2).intValue();
}
public static void main(String[] args) {
final WeightRoundRobin wr = new WeightRoundRobin();
// 非并发情况
for (int i = 0; i < 100; i++) {
System.out.println(wr.round());
}
System.out.println();
System.out.println("==========");
System.out.println();
final CyclicBarrier b = new CyclicBarrier(30);
// 并发情况
for (int i = 0; i < 30; i++) {
new Thread(new Runnable() {
@Override
public void run() {
try {
b.await();
System.out.println(Thread.currentThread().getName() + " " + wr.round());
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}
}, "thread" + i).start();
}
}
}
结果:
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.7, weight=20]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.4, weight=15]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.7, weight=20]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.3, weight=10]
Server [ip=192.168.1.4, weight=15]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.7, weight=20]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.2, weight=5]
Server [ip=192.168.1.3, weight=10]
Server [ip=192.168.1.4, weight=15]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.6, weight=5]
Server [ip=192.168.1.7, weight=20]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.7, weight=20]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.4, weight=15]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.7, weight=20]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.3, weight=10]
Server [ip=192.168.1.4, weight=15]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.7, weight=20]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.2, weight=5]
Server [ip=192.168.1.3, weight=10]
Server [ip=192.168.1.4, weight=15]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.6, weight=5]
Server [ip=192.168.1.7, weight=20]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.7, weight=20]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.4, weight=15]
Server [ip=192.168.1.5, weight=100]
Server [ip=192.168.1.7, weight=20]
Server [ip=192.168.1.8, weight=30]
Server [ip=192.168.1.3, weight=10]
==========
thread0 Server [ip=192.168.1.5, weight=100]
thread3 Server [ip=192.168.1.2, weight=5]
thread7 Server [ip=192.168.1.6, weight=5]
thread10 Server [ip=192.168.1.5, weight=100]
thread12 Server [ip=192.168.1.5, weight=100]
thread15 Server [ip=192.168.1.5, weight=100]
thread18 Server [ip=192.168.1.5, weight=100]
thread2 Server [ip=192.168.1.8, weight=30]
thread29 Server [ip=192.168.1.5, weight=100]
thread1 Server [ip=192.168.1.7, weight=20]
thread27 Server [ip=192.168.1.8, weight=30]
thread26 Server [ip=192.168.1.5, weight=100]
thread25 Server [ip=192.168.1.8, weight=30]
thread24 Server [ip=192.168.1.5, weight=100]
thread23 Server [ip=192.168.1.5, weight=100]
thread22 Server [ip=192.168.1.5, weight=100]
thread21 Server [ip=192.168.1.5, weight=100]
thread20 Server [ip=192.168.1.5, weight=100]
thread19 Server [ip=192.168.1.5, weight=100]
thread17 Server [ip=192.168.1.5, weight=100]
thread16 Server [ip=192.168.1.5, weight=100]
thread14 Server [ip=192.168.1.5, weight=100]
thread13 Server [ip=192.168.1.5, weight=100]
thread11 Server [ip=192.168.1.5, weight=100]
thread9 Server [ip=192.168.1.8, weight=30]
thread8 Server [ip=192.168.1.7, weight=20]
thread6 Server [ip=192.168.1.5, weight=100]
thread5 Server [ip=192.168.1.4, weight=15]
thread4 Server [ip=192.168.1.3, weight=10]
thread28 Server [ip=192.168.1.5, weight=100]