Server
package com.hhdys.bean;
public class Server {
private String name;
private int weight;
private int visitCount;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public Server(String name, int weight) {
super();
this.name = name;
this.weight = weight;
this.visitCount=weight;
}
public int getVisitCount() {
return visitCount;
}
public void setVisitCount(int visitCount) {
this.visitCount = visitCount;
}
}
Main
package com.hhdys.test;
import java.util.ArrayList;
import java.util.List;
import com.hhdys.bean.Server;
public class LBTest {
List<Server> servers=new ArrayList<>();
int totalWeight=0;
int gcd=0;
int curServer=0;
int curIndex=0;
public LBTest() {
super();
Server server1=new Server("A", 4);
Server server2=new Server("B", 2);
Server server3=new Server("C", 3);
Server server4=new Server("D", 4);
servers.add(server1);
servers.add(server2);
servers.add(server3);
servers.add(server4);
setGcd();
setTotalWeight();
}
private void setTotalWeight(){
for(Server server : servers){
this.totalWeight+=server.getWeight();
}
this.totalWeight/=this.gcd;
System.out.println("total weight is "+this.totalWeight);
}
private int gcd(int x,int y){
if(x<y){
return gcd(y,x);
}
int result=x%y;
if(result==0){
return y;
}
return gcd(y, result);
}
private void setGcd(){
int tempGcd=0;
for(Server server :servers){
if(tempGcd==0){
tempGcd=server.getWeight();
continue;
}else{
tempGcd=gcd(tempGcd, server.getWeight());
}
}
this.gcd=tempGcd;
System.out.println("gcd is "+this.gcd);
}
public Server getServer(){
int serversNum=servers.size();
if(curIndex>=this.totalWeight){//超过一次轮询
System.out.println("reset visit info===============");
curIndex=0;
curServer=0;
for(Server server:servers){
server.setVisitCount(server.getWeight());
}
}
Server server=servers.get(curServer);
if(judgeServerStatus(server)){
dealSeleted(server);
return server;
}
while (true) {//轮询到的机器不可用,自动轮询下一台机器
this.curServer++;
if(this.curServer>=serversNum){
this.curServer=0;
}
server=servers.get(this.curServer);
if(judgeServerStatus(server)){
dealSeleted(server);
return server;
}
}
}
private void dealSeleted(Server server){
server.setVisitCount(server.getVisitCount()-this.gcd);
this.curIndex++;
this.curServer++;
if(this.curServer>=servers.size()){
this.curServer=0;
}
}
private boolean judgeServerStatus(Server server){
if(server==null){
return false;
}
if(server.getVisitCount()>0){
return true;
}
return false;
}
public static void main(String[] args){
long time=System.currentTimeMillis();
System.out.println("begin=======");
LBTest test=new LBTest();
for(int i=0;i<20;i++){
Server server=test.getServer();
System.out.println("the server is "+server.getName());
}
System.out.println("end========"+(System.currentTimeMillis()-time)/1000);
}
}