Java实现5种负载均衡算法(小结)

网友投稿 282 2022-07-27


目录概念轮询算法加权轮询法加权随机法随机法IP_Hash算法

概念

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

轮询算法

轮询算法按顺序把每个新的连接请求分配给下一个服务器,最终把所有请求平分给所有的服务器。

优点:绝对公平

缺点:无法根据服务器性能去分配,无法合理利用服务器资源。

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 Integer index = 0;

private List 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);

//轮询+1

index ++;

}

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 = http://0;

static Map ipMap=new HashMap(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 getServerIpByWeight() {

List ips = new ArrayList(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 ips = this.getServerIpByWeight();

if (index >= ips.size()){

index = 0;

}

String serverIp= ips.get(index);

index ++;

return serverIp;

}

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 ipMap=new HashMap(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 getServerIpByWeight() {

List ips = new ArrayList(32);

for (Map.Entry 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 ips = this.getServerIpByWeight();

//循环随机数

Random random=new Random();

int index =random.nextInt(ips.size());

String serverIp = ips.get(index);

return serverIp;

}

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

随机法

负载均衡方法随机的把负载分配到各个可用的服务器上,通过随机数生成算法选取一个服务器KnXZGT,这种实现算法最简单,随之调用次数增大,这种算法可以达到每台服务器的请求量接近于平均。

package com.monkeyjava.learn.basic.robin;

import com.google.common.collect.Lists;

import java.util.List;

import java.util.Random;

public class TestRandom {

private List ips = Lists.newArrayList("192.168.1.1", "192.168.1.2", "192.168.1.3");

public String randomRobin(){

//随机数

Random random=new Random();

http:// int index =random.nextInt(ips.size());

String serverIp= ips.get(index);

return serverIp;

}

public static void main(String[] args) {

TestRandom testRandomdRobin =new TestRandom();

for (int i=0;i< 10 ;i++){

String serverIp= testRandomdRobin.randomRobin();

System.out.println(serverIp);

}

}

}

输出

192.168.1.3192.168.1.3192.168.1.1192.168.1.2192.168.1.1192.168.1.3192.168.1.2192.168.1.3192.168.1.3192.168.1.2

IP_Hash算法

hash(ip)%N算法,通过一种散列算法把客户端来源IP根据散列取模算法将请求分配到不同的服务器上

优点:保证了相同客户端IP地址将会被哈希到同一台后端服务器,直到后端服务器列表变更。根据此特性可以在服务消费者与服务提供者之间建立有状态的session会话

缺点: 如果服务器进行了下线操作,源IP路由的服务器IP就会变成另外一台,如果服务器没有做session 共享话,会造成session丢失。

package com.monkeyjava.learn.basic.robin;

import com.google.common.collect.Lists;

import java.util.List;

public class TestIpHash {

private List ips = Lists.newArrayList("192.168.1.1", "192.168.1.2", "192.168.1.3");

public String ipHashRobin(String clientIp){

int hashCode=clientIp.hashCode();

int serverListsize=ips.size();

int index = hashCode%serverListsize;

String serverIp= ips.get(index);

return serverIp;

}

public static void main(String[] args) {

TestIpHash testIpHash =new TestIpHash();

String servername= testIpHash.ipHashRobin("192.168.88.2");

System.out.println(servername);

}

}

输出结果

192.168.1.3

每次运行结果都一样


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java程序包不存在问题的解决办法(idea java包不存在)
下一篇:SpringSecurity页面授权与登录验证实现(内存取值与数据库取值)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~