Java 实现5种负载均衡算法

负载均衡是将客户端请求访问 , 通过提前约定好的规则转发给各个server 。其中有好几个种经典的算法 , 下面我们用JAVA实现这几种算法 。

Java 实现5种负载均衡算法

文章插图
 
轮询算法轮询算法按顺序把每个新的连接请求分配给下一个服务器 , 最终把所有请求平分给所有的服务器 。
优点:绝对公平
【Java 实现5种负载均衡算法】缺点:无法根据服务器性能去分配 , 无法合理利用服务器资源 。
package com.monkeyjava.learn.basic.robin;import com.google.common.collect.Lists;import java.util.HashMap;import java.util.List;import java.util.Map;public class TestRound {private Integerindex = 0;private List<String> ips = Lists.newArrayList("192.168.1.1", "192.168.1.2", "192.168.1.3");public String roundRobin(){String serverIp;synchronized(index){if (index >= ips.size()){index = 0;}serverIp= ips.get(index);//轮询+1index ++;}return serverIp;}public static void main(String[] args) {TestRound testRoundRobin =new TestRound();for (int i=0;i< 10 ;i++){String serverIp= testRoundRobin.roundRobin();System.out.println(serverIp);}}}输出结果:
192.168.1.1192.168.1.2192.168.1.3192.168.1.1192.168.1.2192.168.1.3192.168.1.1192.168.1.2192.168.1.3192.168.1.1加权轮询法该算法中 , 每个机器接受的连接数量是按权重比例分配的 。这是对普通轮询算法的改进 , 比如你可以设定:第三台机器的处理能力是第一台机器的两倍 , 那么负载均衡器会把两倍的连接数量分配给第3台机器 , 轮询可以将请求顺序按照权重分配到后端 。
package com.monkeyjava.learn.basic.robin;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class TestWeight {private Integer index = 0;static Map<String, Integer> ipMap=new HashMap<String, Integer>(16);static {// 1.map, key-ip,value-权重ipMap.put("192.168.1.1", 1);ipMap.put("192.168.1.2", 2);ipMap.put("192.168.1.3", 4);}public List<String> getServerIpByWeight() {List<String> ips = new ArrayList<String>(32);for (Map.Entry<String, Integer> entry : ipMap.entrySet()) {String ip = entry.getKey();Integer weight = entry.getValue();// 根据权重不同 , 放入list 中的数量等同于权重 , 轮询出的的次数等同于权重for (int ipCount =0; ipCount < weight; ipCount++) {ips.add(ip);}}return ips;}public String weightRobin(){List<String> ips = this.getServerIpByWeight();if (index >= ips.size()){index = 0;}String serverIp= ips.get(index);index ++;returnserverIp;}public static void main(String[] args) {TestWeight testWeightRobin=new TestWeight();for (int i =0;i< 10 ;i++){String server=testWeightRobin.weightRobin();System.out.println(server);}}}输出结果:
192.168.1.1192.168.1.3192.168.1.3192.168.1.3192.168.1.3192.168.1.2192.168.1.2192.168.1.1192.168.1.3192.168.1.3加权随机法获取带有权重的随机数字 , 随机这种东西 , 不能看绝对 , 只能看相对 , 我们不用index 控制下标进行轮询 , 只用random 进行随机取ip , 即实现算法 。
package com.monkeyjava.learn.basic.robin;import java.util.*;public class TestRandomWeight {static Map<String, Integer> ipMap=new HashMap<String, Integer>(16);static {// 1.map, key-ip,value-权重ipMap.put("192.168.1.1", 1);ipMap.put("192.168.1.2", 2);ipMap.put("192.168.1.3", 4);}public List<String> getServerIpByWeight() {List<String> ips = new ArrayList<String>(32);for (Map.Entry<String, Integer> entry : ipMap.entrySet()) {String ip = entry.getKey();Integer weight = entry.getValue();// 根据权重不同 , 放入list 中的数量等同于权重 , 轮询出的的次数等同于权重for (int ipCount =0; ipCount < weight; ipCount++) {ips.add(ip);}}return ips;}public String randomWeightRobin(){List<String> ips = this.getServerIpByWeight();//循环随机数Random random=new Random();int index =random.nextInt(ips.size());String serverIp = ips.get(index);returnserverIp;}public static void main(String[] args) {TestRandomWeight testRandomWeightRobin=new TestRandomWeight();for (int i =0;i< 10 ;i++){String server= testRandomWeightRobin.randomWeightRobin();System.out.println(server);}}}输出结果:
192.168.1.3192.168.1.3192.168.1.2192.168.1.1192.168.1.2192.168.1.1192.168.1.3192.168.1.2192.168.1.2192.168.1.3随机法负载均衡方法随机的把负载分配到各个可用的服务器上 , 通过随机数生成算法选取一个服务器 , 这种实现算法最简单 , 随之调用次数增大 , 这种算法可以达到没台服务器的请求量接近于平均 。


推荐阅读