使用Java实现5种负载均衡算法实例

网友投稿 455 2022-09-24


使用Java实现5种负载均衡算法实例

目录前言概念几种负载均衡算法图例轮询算法加权轮询法加权随机法随机法IP_Hash算法总结

前言

负载均衡是为了解决并发情况下,多个请求访问,把请求通过提前约定好的规则转发给各个server。其中有好几个种经典的算法。在用java代码编写这几种算法之前,先来了解一下负载均衡这个概念。

概念

负载均衡是将客户端请求访问,通过提前约定好的规则转发给各个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");

toompuqNxm

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.1

192.168.1.2

192.168.1.3

192.168.1.1

192.168.1.2

192.168.1.3

192.168.1.1

192.168.1.2

192.16toompuqNxm8.1.3

192.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 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 = entoompuqNxmtry.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 testWhttp://eightRobin=new TestWeight();

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

String server=testWeightRobin.weightRobin();

System.out.println(server);

}

}

}

输出结果:

192.168.1.1

192.168.1.3

192.168.1.3

192.168.1.3

192.168.1.3

192.168.1.2

192.168.1.2

192.168.1.1

192.168.1.3

192.168.1.3

加权随机法

获取带有权重的随机数字,随机这种东西,不能看绝对,只能看相对,我们不用index 控制下标进行轮询,只用random 进行随机取ip,即实现算法。

package com.monkeyjava.learn.basic.robin;

import java.util.*;

public class TestRandomWeight {

static Map ipMap=new HashMap(16);

stoompuqNxmtatic {

// 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.3

192.168.1.3

192.168.1.2

192.168.1.1

192.168.1.2

192.168.1.1

192.168.1.3

192.168.1.2

192.168.1.2

192.168.1.3

随机法

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

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();

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.3

192.168.1.3

192.168.1.1

192.168.1.2

192.168.1.1

192.168.1.3

192.168.1.2

192.168.1.3

192.168.1.3

192.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小时内删除侵权内容。

上一篇:华为防火墙(USG)的管理方式配置(华为usg2000防火墙管理地址)
下一篇:QinQ技术〔也称Stacked VLAN 或Double VLAN〕(qinq技术主要用于解决什么问题)
相关文章

 发表评论

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