负载均衡是指由多个服务器以对称方式组成的服务器集。每台服务器地位相当,可以独立向外界提供服务,不需要其他服务器的协助。本文主要介绍用Java实现五种负载均衡算法的相关信息。有需要的可以参考一下。
目录
介绍概念
几种负载均衡算法中的图例轮询算法
加权轮询方法
加权随机方法
随机方法
IP_Hash算法
摘要
前言
负载均衡是解决并发情况下多个请求访问的问题,通过事先约定的规则将请求转发给各个服务器。有几种经典算法。在用java代码编写这些算法之前,我们先来了解一下负载均衡的概念。
概念
负载均衡就是通过事先约定好的规则,将客户端的访问请求转发给各个服务器。有几种经典算法。这里我们用Java来实现这些算法。
几种负载均衡算法图例
主要的负载平衡算法如图所示。在代码实现之前,让我们简单回顾一下它们的概念。
轮询算法
轮询算法将每个新的连接请求按顺序分配给下一个服务器,最后将所有请求平均分配给所有服务器。
优点:绝对公平
缺点:无法根据服务器性能进行分配,无法合理利用服务器资源。
包com . monkey Java . learn . basic . robin;
导入com . Google . common . collect . lists;
导入Java . util . hashmap;
导入Java . util . list;
导入Java . util . map;
公共类测试回合{
私有整数索引=0;
private ListString IPS=lists . newarraylist(' 192 . 168 . 1 . 1 ',' 192.168.1.2 ',' 192 . 168 . 1 . 3 ');
公共字符串roundRobin(){
字符串serverIp
同步(索引){
if (index=ips.size()){
索引=0;
}
server IP=IPS . get(index);
//轮询1
指数;
}
返回serverIp
}
公共静态void main(String[] args) {
TestRound testRoundRobin=new test round();
for(int I=0;i 10i ){
string server IP=testroundrobin . round robin();
system . out . println(server IP);
}
}
}
输出结果:
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.168.1.3
192.168.1.1
加权轮询方法
在该算法中,每台机器接受的连接数按照权重比进行分配。这是对普通轮询算法的改进。例如,您可以设置,如果第三台机器的处理能力是第一台机器的两倍,负载平衡器将向第三台机器分配两倍数量的连接。轮询可以根据权重将请求顺序分发到后端。
包com . monkey Java . learn . basic . robin;
导入Java . util . ArrayList;
导入Java . util . hashmap;
导入Java . util . list;
导入Java . util . map;
公共类TestWeight {
私有整数索引=0;
静态MapString,Integer ipMap=new HashMapString,Integer(16);
静态{
//1 .映射,键ip,值权重
ipMap.put('192.168.1.1 ',1);
ipMap.put('192.168.1.2 ',2);
ipMap.put('192.168.1.3 ',4);
}
公共列表字符串getServerIpByWeight() {
ListString IPS=new ArrayList string(32);
对于(图。EntryString,Integer entry:IP map . entry set()){
string IP=entry . getkey();
整数weight=entry . getvalue();
//根据权重不同,放入列表的数等于权重,轮询的次数等于权重。
for(int IP count=0;ipCount重量;ipCount ) {
IPS . add(IP);
}
}
回报IP;
}
公共字符串weightRobin(){
ListString IPS=this . getserveripbyweight();
if (index=ips.size()){
索引=0;
}
string server IP=IPS . get(index);
指数;
返回serverIp
}
公共静态void main(String[] args) {
test weight test weight robin=new test weight();
for(int I=0;i 10i ){
string server=testweightbrobin。weight robin();
System.out.println(服务器);
}
}
}
输出结果:
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
加权随机法
获取带有权重的随机数字,随机这种东西,不能看绝对,只能看相对,我们不用指数控制下标进行轮询,只用随意进行随机取ip,即实现算法。
包com。猴子爪哇咖啡。学习。基本的。罗宾;
导入Java。util。*;
公共类TestRandomWeight {
静态MapString,Integer ipMap=new HashMapString,Integer(16);
静态{
//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);
}
公共列表字符串getServerIpByWeight() {
ListString IPS=新的ArrayList字符串(32);
对于(图EntryString,整数项:IP映射。条目集()){
字符串IP=条目。getkey();
整数重量=入口。getvalue();
//根据权重不同,放入目录中的数量等同于权重,轮询出的的次数等同于权重
for(int IP count=0;ipCount重量;ipCount ) {
IPS。添加(IP);
}
}
回报IP;
}
公共字符串randomweightbrobin(){
ListString IPS=this。getserveripbyweight();
//循环随机数
Random Random=new Random();
int index=随机。nextint(IPS。size());
字符串服务器IP=IPS。get(索引);
返回serverIp
}
公共静态void main(String[] args) {
TestRandomWeight testrandomweightbrobin=new TestRandomWeight();
for(int I=0;i 10i ){
string server=testrandomweightbrobin。randomweightbrobin();
System.out.println(服务器);
}
}
}
输出结果:
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
随机法
负载均衡方法随机的把负载分配到各个可用的服务器上,通过随机数生成算法选取一个服务器,这种实现算法最简单,随之调用次数增大,这种算法可以达到每台服务器的请求量接近于平均。
包com。猴子爪哇咖啡。学习。基本的。罗宾;
导入com。谷歌。常见。收藏。列表;
导入Java。util。列表;
导入Java。util。随机;
公共类TestRandom {
private ListString IPS=lists。newarraylist(' 192。168 .1 .1 ',' 192.168.1.2 ',' 192 .168 .1 .3 ');
公共字符串randomRobin(){
//随机数
Random Random=new Random();
int index=随机。nextint(IPS。size());
字符串服务器IP=IPS。get(索引);
返回serverIp
}
公共静态void main(String[] args) {
TestRandom testRandomdRobin=new TestRandom();
for(int I=0;i 10i ){
字符串服务器IP=testrandomdrobin。随机罗宾();
系统。出去。println(服务器IP);
}
}
}
输出
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 _哈希算法
哈希(ip)%N算法,通过一种散列算法把客户端来源互联网协议(互联网协议)根据散列取模算法将请求分配到不同的服务器上
优点:保证了相同客户端互联网协议(互联网协议)地址将会被哈希到同一台后端服务器,直到后端服务器列表变更。根据此特性可以在服务消费者与服务提供者之间建立有状态的会议会话
缺点:如果服务器进行了下线操作,源互联网协议(互联网协议)路由的服务器互联网协议(互联网协议)就会变成另外一台,如果服务器没有做会议共享话,会造成会议丢失。
包com。猴子爪哇咖啡。学习。基本的。罗宾;
导入com。谷歌。常见。收藏。列表;
导入Java。util。列表;
公共类TestIpHash {
private ListString IPS=lists。newarraylist(' 192。168 .1 .1 ',' 192.168.1.2 ',' 192 .168 .1 .3 ');
公共字符串ipHashRobin(字符串clientIp){
int hashCode=clientip。hashCode();
int服务器列表大小=IPS。size();
int index=hashCode % server listsize;
string server IP=IPS . get(index);
返回serverIp
}
公共静态void main(String[] args) {
testi phash testi phash=new testi phash();
string servername=testi phash . iphashrobin(' 192 . 168 . 88 . 2 ');
system . out . println(servername);
}
}
输出结果
192.168.1.3
结果每次都一样。
总结
关于使用Java实现五种负载平衡算法的文章到此结束。有关Java负载平衡算法的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。