Java代码实现负载均衡五种算法

前言:

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

1.概念

负载,从字面意思可以分析,是指后端server可以承受的压力。这个一方面是服务器的性能,另一方面就是代码的质量了。

均衡,就是说把服务部署在多态server,如何调度这些资源。根据服务器性能不同,进行一个权衡。

当web访问量增加,服务器性能不同,更好的去利用服务器,我们需要负载均衡算法。

2.几种负载均衡算法简介

主要的负载均衡算法是图中这些,在代码实现之前,我们先简单回顾一下他们的概念。

轮询法:

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

优点:绝对公平

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

加权轮询法:

该算法中,每个机器接受的连接数量是按权重比例分配的。这是对普通轮询算法的改进,比如你可以设定:第三台机器的处理能力是第一台机器的两倍,那么负载均衡器会把两倍的连接数量分配给第3台机器。加权轮询分为:简单的轮询、平滑的轮询。

什么是平滑的轮询,就是把每个不同的服务,平均分布。在Nginx源码中,实现了一种叫做平滑的加权轮询(smooth weighted round-robin balancing)的算法,它生成的序列更加均匀。5个请求现在分散开来,不再是连续的。

随机法:

负载均衡方法随机的把负载分配到各个可用的服务器上,通过随机数生成算法选取一个服务器。毕竟随机,,有效性受到了质疑。

加权随机法:

获取带有权重的随机数字,随机这种东西,不能看绝对,只能看相对。

IP_Hash算法:

hash(object)%N算法,通过一种散列算法把请求分配到不同的服务器上。

3.Java代码实现负载均衡五种算法

1.轮询法:

/*** Title:轮询* Description:** @author Created by Julie* @version 1.0* @date on 15:49 2017/10/26*/
package com.test.loadbalance;import java.util.*;
import java.util.concurrent.ConcurrentHashMap;public class TestRoundRobin {//    1.定义map, key-ip,value-weightstatic Map<String,Integer> ipMap=new HashMap<>();static {ipMap.put("192.168.13.1",1);ipMap.put("192.168.13.2",1);ipMap.put("192.168.13.3",1);}//    Integer sum=0;Integer  pos = 0;public String RoundRobin(){Map<String,Integer> ipServerMap=new ConcurrentHashMap<>();ipServerMap.putAll(ipMap);//    2.取出来key,放到set中Set<String> ipset=ipServerMap.keySet();//    3.set放到list,要循环list取出ArrayList<String> iplist=new ArrayList<String>();iplist.addAll(ipset);String serverName=null;//    4.定义一个循环的值,如果大于set就从0开始synchronized(pos){if (pos>=ipset.size()){pos=0;}serverName=iplist.get(pos);//轮询+1pos ++;}return serverName;}public static void main(String[] args) {TestRoundRobin testRoundRobin=new TestRoundRobin();for (int i=0;i<10;i++){String serverIp=testRoundRobin.RoundRobin();System.out.println(serverIp);}}}

2.加权轮询法

package com.test.loadbalance;import java.util.*;
import java.util.concurrent.ConcurrentHashMap;/*** Title:* Description:加权轮询** @author Created by Julie* @version 1.0* @date on 18:05 2017/10/26*/
public class TestWeightRobin {//    1.map, key-ip,value-weightstatic Map<String,Integer> ipMap=new HashMap<>();static {ipMap.put("192.168.13.1",1);ipMap.put("192.168.13.2",2);ipMap.put("192.168.13.3",4);}Integer pos=0;public String WeightRobin(){Map<String,Integer> ipServerMap=new ConcurrentHashMap<>();ipServerMap.putAll(ipMap);Set<String> ipSet=ipServerMap.keySet();Iterator<String> ipIterator=ipSet.iterator();//定义一个list放所有serverArrayList<String> ipArrayList=new ArrayList<String>();//循环set,根据set中的可以去得知map中的value,给list中添加对应数字的server数量while (ipIterator.hasNext()){String serverName=ipIterator.next();Integer weight=ipServerMap.get(serverName);for (int i = 0;i < weight ;i++){ipArrayList.add(serverName);}}String serverName=null;if (pos>=ipArrayList.size()){pos=0;}serverName=ipArrayList.get(pos);//轮询+1pos ++;return  serverName;}public static void main(String[] args) {TestWeightRobin testWeightRobin=new TestWeightRobin();for (int i =0;i<10;i++){String server=testWeightRobin.WeightRobin();System.out.println(server);}}
}

3.随机法:

package com.test.loadbalance;import java.util.*;
import java.util.concurrent.ConcurrentHashMap;/*** Title:* Description:随机** @author Created by Julie* @version 1.0* @date on 18:25 2017/10/26*/
public class TestRandom {//    1.定义map, key-ip,value-weightstatic Map<String,Integer> ipMap=new HashMap<>();static {ipMap.put("192.168.13.1",1);ipMap.put("192.168.13.2",2);ipMap.put("192.168.13.3",4);}public String Random() {Map<String,Integer> ipServerMap=new ConcurrentHashMap<>();ipServerMap.putAll(ipMap);Set<String> ipSet=ipServerMap.keySet();//定义一个list放所有serverArrayList<String> ipArrayList=new ArrayList<String>();ipArrayList.addAll(ipSet);//循环随机数Random random=new Random();//随机数在list数量中取(1-list.size)int pos=random.nextInt(ipArrayList.size());String serverNameReturn= ipArrayList.get(pos);return  serverNameReturn;}public static void main(String[] args) {TestRandom testRandom=new TestRandom();for (int i =0;i<10;i++){String server=testRandom.Random();System.out.println(server);}}
}

4.加权随机:

package com.test.loadbalance;import java.util.*;
import java.util.concurrent.ConcurrentHashMap;/*** Title:* Description:加权随机** @author Created by Julie* @version 1.0* @date on 18:42 2017/10/26*/
public class TestRobinRandom {//    1.定义map, key-ip,value-weightstatic Map<String,Integer> ipMap=new HashMap<>();static {ipMap.put("192.168.13.1",1);ipMap.put("192.168.13.2",2);ipMap.put("192.168.13.3",4);}public String RobinRandom(){Map<String,Integer> ipServerMap=new ConcurrentHashMap<>();ipServerMap.putAll(ipMap);Set<String> ipSet=ipServerMap.keySet();Iterator<String> ipIterator=ipSet.iterator();//定义一个list放所有serverArrayList<String> ipArrayList=new ArrayList<String>();//循环set,根据set中的可以去得知map中的value,给list中添加对应数字的server数量while (ipIterator.hasNext()){String serverName=ipIterator.next();Integer weight=ipServerMap.get(serverName);for (int i=0;i<weight;i++){ipArrayList.add(serverName);}}//循环随机数Random random=new Random();//随机数在list数量中取(1-list.size)int pos=random.nextInt(ipArrayList.size());String serverNameReturn= ipArrayList.get(pos);return  serverNameReturn;}public static void main(String[] args) {TestRobinRandom testRobinRandom=new TestRobinRandom();for (int i =0;i<10;i++){String server=testRobinRandom.RobinRandom();System.out.println(server);}}
}

5.IP_Hash算法:

package com.test.loadbalance;import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;/*** Title:* Description:** @author Created by Julie* @version 1.0* @date on 18:35 2017/10/26*/
public class ipHash {//    1.定义map, key-ip,value-weightstatic Map<String,Integer> ipMap=new HashMap<>();static {ipMap.put("192.168.13.1",1);ipMap.put("192.168.13.2",2);ipMap.put("192.168.13.3",4);}public String ipHash(String clientIP){Map<String,Integer> ipServerMap=new ConcurrentHashMap<>();ipServerMap.putAll(ipMap);//    2.取出来key,放到set中Set<String> ipset=ipServerMap.keySet();//    3.set放到list,要循环list取出ArrayList<String> iplist=new ArrayList<String>();iplist.addAll(ipset);//对ip的hashcode值取余数,每次都一样的int hashCode=clientIP.hashCode();int serverListsize=iplist.size();int pos=hashCode%serverListsize;return iplist.get(pos);}public static void main(String[] args) {ipHash iphash=new ipHash();String servername= iphash.ipHash("192.168.21.2");System.out.println(servername);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/249684.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Nodejs发送邮件

尝试用了Nodemailer来发送邮件&#xff0c;结果成功了&#xff0c;虽然是相对比较简单的&#xff0c;但还是记录一下吧。 Nodemailer 是 Node.js 应用程序的一个模块&#xff0c;可以方便地发送电子邮件。 使用 # 初始化 pageage.json 文件 $ npm init # 安装依赖 $ npm ins…

HTTP同源策略

同源策略是web安全策略中的一种&#xff0c;非常重要。 同源策略明确规定&#xff1a;不同域的客户端在没有明确授权的情况下&#xff0c;不能读写对方的资源。 简单说来就是web浏览器允许第一个页面的脚本访问访问第二个页面的数据&#xff0c;但是也只有在两个页面有相同的…

Spring Cloud 微服务架构

一、分布式服务框架的发展 1.1 第一代服务框架   代表&#xff1a;Dubbo(Java)、Orleans(.Net)等 特点&#xff1a;和语言绑定紧密 1.2 第二代服务框架   代表&#xff1a;Spring Cloud等 现状&#xff1a;适合混合式开发&#xff08;例如借助Steeltoe OSS可以让ASP.Ne…

JZOJ 4421. aplusb

4421. aplusb Time Limits: 1000 ms Memory Limits: 524288 KB Detailed Limits Goto ProblemSetDescription SillyHook要给小朋友出题了&#xff0c;他想&#xff0c;对于初学者&#xff0c;第一题肯定是ab 啊&#xff0c;但当他出完数据后神奇地发现.in不见了&#xff0c…

跨域资源共享CORS详解

最近深入了解了CORS的相关东西&#xff0c;觉得阮一峰老师的文章写得最详细易懂了&#xff0c;所有转载作为学习笔记。 原文地址&#xff1a;跨域资源共享 CORS 详解 CORS是W3C的一个标准&#xff0c;全称是跨域资源共享&#xff08;Cross-origin resource sharing&#xff0…

计算机网络(十),HTTP的关键问题

目录 1.在浏览器地址栏键入URL&#xff0c;按下回车之后经历的流程 2.HTTP状态码 3.GET请求和POST请求的区别 4.Cookie和Session的区别 5.IPV4和IPV6 十、HTTP的关键问题 1.在浏览器地址栏键入URL&#xff0c;按下回车之后经历的流程 &#xff08;1&#xff09;DNS解析 &#x…

云技术

云技术是指在广域网或局域网内将硬件、软件、网络等系列资源统一起来&#xff0c;实现数据的计算、储存、处理和共享的一种托管技术。

vue中 mock使用教程

//mock/index.js import Mock from mockjs //引入mockjs&#xff0c;npm已安装 import { Random,toJSONSchema } from mockjs // 引入random对象,随机生成数据的对象&#xff0c;&#xff08;与占位符一样&#xff09; Mock.setup({timeout:1000 //设置请求延时时间 }) const …

前端开发掌握nginx常用功能之rewrite

上一篇博文对nginx最常用功能的server及location的匹配规则进行了讲解&#xff0c;这也是nginx实现控制访问和反向代理的基础。掌握请求的匹配规则算是对nginx有了入门&#xff0c;但是这些往往还是不能满足实际的需求场景&#xff0c;例如请求url重写、重定向等等&#xff0c;…

vue2.0脚手架的webpack 配置文件分析

前言 作为 Vue 的使用者我们对于 vue-cli 都很熟悉&#xff0c;但是对它的 webpack 配置我们可能关注甚少&#xff0c;今天我们为大家带来 vue-cli#2.0 的 webpack 配置分析 vue-cli 的简介、安装我们不在这里赘述&#xff0c;对它还不熟悉的同学可以直接访问 vue-cli 查看 …

一个可供中小团队参考的微服务架构技术栈

一个可供中小团队参考的微服务架构技术栈

WinSxS文件夹瘦身

WinSxS文件夹瘦身2014-5-8 18:03:32来源&#xff1a;IT之家作者&#xff1a;阿象责编&#xff1a;阿象 评论&#xff1a;27刚刚&#xff0c;我们分享了如何用DISM管理工具查看Win8.1 WinSxS文件夹实际大小。对于WinSxS文件夹&#xff0c;几乎每个Windows爱好者都认识到其重要性…

bcrypt的简单使用

前段时间在捣鼓个人项目的时候用到了nodejs做服务端&#xff0c;发现使用加密的方法和之前常用的加密方式不太一致&#xff0c;下面以demo的形式总结一下bcrypt对密码进行加密的方法。 一、简介 Bcrypt简介&#xff1a; bcrypt是一种跨平台的文件加密工具。bcrypt 使用的是布…

盒子居中

1、未脱标 margin&#xff1a;0 auto&#xff1b; 2、脱标&#xff08;absolute、fixed&#xff09; left&#xff1a;50%&#xff1b; margin-left&#xff1a;width/2&#xff1b; 转载于:https://www.cnblogs.com/liujianing/p/10356984.html

织梦无子栏目时禁止调用同级栏目

1. 修改文件 \include\taglib\channel.lib.php 把代码 if($typeson && $reid!0 && $totalRow0) 改为 if($typeson && $reid!0 && $totalRow0 && $noself) 2. 使用channel标签时添加noself属性 {dede:channel noselfyes} {/dede:channe…

nodejs实现文件上传

前段时间在做个人项目的时候&#xff0c;用到了nodejs服务端上传文件&#xff0c;现在回头把这个小结一下&#xff0c;作为记录。 本人上传文件时是基于express的multiparty&#xff0c;当然也可以使用connect-multiparty中间件实现&#xff0c;但官方似乎不推荐使用connect-m…

python腾讯语音合成

一、腾讯语音合成介绍 腾讯云语音合成技术&#xff08;TTS&#xff09;可以将任意文本转化为语音&#xff0c;实现让机器和应用张口说话。 腾讯TTS技术可以应用到很多场景&#xff0c;比如&#xff0c;移动APP语音播报新闻&#xff1b;智能设备语音提醒&#xff1b;依靠网上现有…

钩子函数和回调函数的区别

一般认为&#xff0c;钩子函数就是回调函数的一种&#xff0c;其实还是有差异的&#xff0c;差异地方就是&#xff1a;触发的时机不同。 先说钩子函数&#xff1a; 钩子&#xff08;Hook&#xff09;概念源于Windows的消息处理机制&#xff0c;通过设置钩子&#xff0c;应用程…

【bzoj4712】洪水

Portal --> bzoj4712 Description 给你一棵树&#xff0c;节点从\(1\)到\(n\)编号&#xff0c;每个节点有一个权值&#xff0c;有若干次操作&#xff0c;操作有以下两种&#xff1a; \((C,x,delta)\)&#xff1a;将编号为\(x\)的点的权值改为\(delta\) \((Q,x)\)&#xff1a…