负载均衡算法之轮询

来源:互联网 发布:dijkstra算法java实现 编辑:程序博客网 时间:2024/06/07 01:36

轮询顾名思义就是按照顺序进行轮流访问
实现算法如下:

public class RoundRobin {    //初始化全局变量,记录上次调用过得机器    public static int j;    static int[] servers = {1,2,3,4,5,6,7,8,9,10};    public static void main(String[] args) {        while(true){            try {                Thread.sleep(100);                System.out.println(getServer());            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }    public static String getServer(){        //初始化服务器            //上次调用机器+1取模            j = (j+1)%servers.length;            return "s"+j;    }}

但是由于线上服务器由于配置或者非单一服务等原因,服务性能可能不一致,所以均等轮询策略满足不了需求,就有了加权轮询算法:
三台机器S[i] = {1,2,3},那么分配的权重可能是{2,4,6},那么访问算法如下:
import java.util.ArrayList;
import java.util.List;

public class WeightRoundRobin {

/**上次选择的服务器*/  private int currentIndex = -1;  /**当前调度的权值*/  private int currentWeight = 0;  /**最大权重*/  private int maxWeight;  /**权重的最大公约数*/  private int gcdWeight;  /**服务器数*/  private int serverCount;  private List<Server> servers = new ArrayList<Server>(); /* * 得到两值的最大公约数 */public int greaterCommonDivisor(int a, int b){      if(a % b == 0){        return b;    }else{        return greaterCommonDivisor(b,a % b);    }}/* * 得到list中所有权重的最大公约数,实际上是两两取最大公约数d,然后得到的d * 与下一个权重取最大公约数,直至遍历完 */public int greatestCommonDivisor(List<Server> servers){      int divisor = 0;      for(int index = 0, len = servers.size(); index < len - 1; index++){          if(index ==0){              divisor = greaterCommonDivisor(                          servers.get(index).getWeight(), servers.get(index + 1).getWeight());          }else{              divisor = greaterCommonDivisor(divisor, servers.get(index).getWeight());          }      }      return divisor;  }/* * 得到list中的最大的权重 */public int greatestWeight(List<Server> servers){      int weight = 0;      for(Server server : servers){          if(weight < server.getWeight()){              weight = server.getWeight();          }      }      return weight;  }/**  *  算法流程:   *  假设有一组服务器 S = {S0, S1, …, Sn-1}  *  有相应的权重,变量currentIndex表示上次选择的服务器  *  权值currentWeight初始化为0,currentIndex初始化为-1 ,当第一次的时候返回 权值取最大的那个服务器,  *  通过权重的不断递减 寻找 适合的服务器返回 */   public Server getServer(){       while(true){           currentIndex = (currentIndex + 1) % serverCount;           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);           }       }   }  public void init(){       servers.add(new Server("192.168.191.1", 1));       servers.add(new Server("192.168.191.2", 2));       servers.add(new Server("192.168.191.4", 4));       servers.add(new Server("192.168.191.8", 8));       maxWeight = greatestWeight(servers);       gcdWeight = greatestCommonDivisor(servers);       serverCount = servers.size();   }   public static void main(String args[]){      WeightRoundRobin weightRoundRobin = new WeightRoundRobin();        weightRoundRobin.init();        for(int i = 0; i < 15; i++){            Server server = weightRoundRobin.getServer();            System.out.println("server " + server.getIp() + " weight=" + server.getWeight());        }   }

}

class Server{
private String ip;
private int weight;

 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;}  

}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 乌龟下面壳烂了怎么办 小孩卵圆孔未闭合该怎么办 刚辞职又后悔了怎么办 隼羽头饰卖了怎么办 u盘变成只读了怎么办 小孩被蟑螂咬了怎么办 被蟑螂咬出血了怎么办 多肉植物张长了怎么办 蟹爪莲叶子蔫了怎么办 混沌与秩序2延迟怎么办 混沌与秩序2脸书怎么办 ios炉石传说卡门怎么办 狗狗对主人低吼怎么办 吹雪之松锦徒长怎么办 武装突袭被禁了怎么办 眼球小血管破了怎么办 眼睛白眼球破了怎么办 打拳击手腕伤了怎么办 上眼皮进东西了怎么办 眼睛进了异物怎么办妙招 眼睛毛血管破了怎么办 怪物猎人x钱不够怎么办 小米2开不了机怎么办 3ds更新系统不动怎么办 u盘中病毒了怎么办 aj5白银前面皱了怎么办 狗吃了巧克力该怎么办 孩子零食吃多了怎么办 上学时月经侧漏怎么办 漏电被电的脚肿怎么办 走路有尿溢出来怎么办 篮球气嘴漏气了怎么办 暗线插座盒坏了怎么办 焊过电焊眼睛疼怎么办 烧电焊后眼睛痛怎么办? 焊完电焊眼睛疼怎么办 烧电焊后眼睛痛怎么办 用电焊后眼睛痛怎么办 看电焊后眼睛痛怎么办 眼睛焊电焊很痛怎么办 电焊没带眼睛痛怎么办