西部数码网站管理助手 ftp密码,0基础网站搭建教程,wordpress头像class,做网站推广哪个好前言#xff1a;
负载均衡是为了解决并发情况下#xff0c;多个请求访问#xff0c;把请求通过提前约定好的规则转发给各个server。其中有好几个种经典的算法。在用java代码编写这几种算法之前#xff0c;先来了解一下负载均衡这个概念。
1.概念
负载#xff0c;从字面…前言
负载均衡是为了解决并发情况下多个请求访问把请求通过提前约定好的规则转发给各个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 MapString,Integer ipMapnew HashMap();static {ipMap.put(192.168.13.1,1);ipMap.put(192.168.13.2,1);ipMap.put(192.168.13.3,1);}// Integer sum0;Integer pos 0;public String RoundRobin(){MapString,Integer ipServerMapnew ConcurrentHashMap();ipServerMap.putAll(ipMap);// 2.取出来key,放到set中SetString ipsetipServerMap.keySet();// 3.set放到list要循环list取出ArrayListString iplistnew ArrayListString();iplist.addAll(ipset);String serverNamenull;// 4.定义一个循环的值如果大于set就从0开始synchronized(pos){if (posipset.size()){pos0;}serverNameiplist.get(pos);//轮询1pos ;}return serverName;}public static void main(String[] args) {TestRoundRobin testRoundRobinnew TestRoundRobin();for (int i0;i10;i){String serverIptestRoundRobin.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 MapString,Integer ipMapnew HashMap();static {ipMap.put(192.168.13.1,1);ipMap.put(192.168.13.2,2);ipMap.put(192.168.13.3,4);}Integer pos0;public String WeightRobin(){MapString,Integer ipServerMapnew ConcurrentHashMap();ipServerMap.putAll(ipMap);SetString ipSetipServerMap.keySet();IteratorString ipIteratoripSet.iterator();//定义一个list放所有serverArrayListString ipArrayListnew ArrayListString();//循环set根据set中的可以去得知map中的value给list中添加对应数字的server数量while (ipIterator.hasNext()){String serverNameipIterator.next();Integer weightipServerMap.get(serverName);for (int i 0;i weight ;i){ipArrayList.add(serverName);}}String serverNamenull;if (posipArrayList.size()){pos0;}serverNameipArrayList.get(pos);//轮询1pos ;return serverName;}public static void main(String[] args) {TestWeightRobin testWeightRobinnew TestWeightRobin();for (int i 0;i10;i){String servertestWeightRobin.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 MapString,Integer ipMapnew 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() {MapString,Integer ipServerMapnew ConcurrentHashMap();ipServerMap.putAll(ipMap);SetString ipSetipServerMap.keySet();//定义一个list放所有serverArrayListString ipArrayListnew ArrayListString();ipArrayList.addAll(ipSet);//循环随机数Random randomnew Random();//随机数在list数量中取1-list.sizeint posrandom.nextInt(ipArrayList.size());String serverNameReturn ipArrayList.get(pos);return serverNameReturn;}public static void main(String[] args) {TestRandom testRandomnew TestRandom();for (int i 0;i10;i){String servertestRandom.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 MapString,Integer ipMapnew 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(){MapString,Integer ipServerMapnew ConcurrentHashMap();ipServerMap.putAll(ipMap);SetString ipSetipServerMap.keySet();IteratorString ipIteratoripSet.iterator();//定义一个list放所有serverArrayListString ipArrayListnew ArrayListString();//循环set根据set中的可以去得知map中的value给list中添加对应数字的server数量while (ipIterator.hasNext()){String serverNameipIterator.next();Integer weightipServerMap.get(serverName);for (int i0;iweight;i){ipArrayList.add(serverName);}}//循环随机数Random randomnew Random();//随机数在list数量中取1-list.sizeint posrandom.nextInt(ipArrayList.size());String serverNameReturn ipArrayList.get(pos);return serverNameReturn;}public static void main(String[] args) {TestRobinRandom testRobinRandomnew TestRobinRandom();for (int i 0;i10;i){String servertestRobinRandom.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 MapString,Integer ipMapnew 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){MapString,Integer ipServerMapnew ConcurrentHashMap();ipServerMap.putAll(ipMap);// 2.取出来key,放到set中SetString ipsetipServerMap.keySet();// 3.set放到list要循环list取出ArrayListString iplistnew ArrayListString();iplist.addAll(ipset);//对ip的hashcode值取余数每次都一样的int hashCodeclientIP.hashCode();int serverListsizeiplist.size();int poshashCode%serverListsize;return iplist.get(pos);}public static void main(String[] args) {ipHash iphashnew ipHash();String servername iphash.ipHash(192.168.21.2);System.out.println(servername);}}