日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

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

發(fā)布時(shí)間:2023/12/10 java 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java代码实现负载均衡五种算法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言:

負(fù)載均衡是為了解決并發(fā)情況下,多個(gè)請(qǐng)求訪問(wèn),把請(qǐng)求通過(guò)提前約定好的規(guī)則轉(zhuǎn)發(fā)給各個(gè)server。其中有好幾個(gè)種經(jīng)典的算法。在用java代碼編寫這幾種算法之前,先來(lái)了解一下負(fù)載均衡這個(gè)概念。

1.概念

負(fù)載,從字面意思可以分析,是指后端server可以承受的壓力。這個(gè)一方面是服務(wù)器的性能,另一方面就是代碼的質(zhì)量了。

均衡,就是說(shuō)把服務(wù)部署在多態(tài)server,如何調(diào)度這些資源。根據(jù)服務(wù)器性能不同,進(jìn)行一個(gè)權(quán)衡。

當(dāng)web訪問(wèn)量增加,服務(wù)器性能不同,更好的去利用服務(wù)器,我們需要負(fù)載均衡算法。

2.幾種負(fù)載均衡算法簡(jiǎn)介

主要的負(fù)載均衡算法是圖中這些,在代碼實(shí)現(xiàn)之前,我們先簡(jiǎn)單回顧一下他們的概念。

輪詢法:

輪詢算法按順序把每個(gè)新的連接請(qǐng)求分配給下一個(gè)服務(wù)器,最終把所有請(qǐng)求平分給所有的服務(wù)器。

優(yōu)點(diǎn):絕對(duì)公平

缺點(diǎn):無(wú)法根據(jù)服務(wù)器性能去分配,無(wú)法合理利用服務(wù)器資源。

加權(quán)輪詢法:

該算法中,每個(gè)機(jī)器接受的連接數(shù)量是按權(quán)重比例分配的。這是對(duì)普通輪詢算法的改進(jìn),比如你可以設(shè)定:第三臺(tái)機(jī)器的處理能力是第一臺(tái)機(jī)器的兩倍,那么負(fù)載均衡器會(huì)把兩倍的連接數(shù)量分配給第3臺(tái)機(jī)器。加權(quán)輪詢分為:簡(jiǎn)單的輪詢、平滑的輪詢。

什么是平滑的輪詢,就是把每個(gè)不同的服務(wù),平均分布。在Nginx源碼中,實(shí)現(xiàn)了一種叫做平滑的加權(quán)輪詢(smooth weighted round-robin balancing)的算法,它生成的序列更加均勻。5個(gè)請(qǐng)求現(xiàn)在分散開(kāi)來(lái),不再是連續(xù)的。

隨機(jī)法:

負(fù)載均衡方法隨機(jī)的把負(fù)載分配到各個(gè)可用的服務(wù)器上,通過(guò)隨機(jī)數(shù)生成算法選取一個(gè)服務(wù)器。畢竟隨機(jī),,有效性受到了質(zhì)疑。

加權(quán)隨機(jī)法:

獲取帶有權(quán)重的隨機(jī)數(shù)字,隨機(jī)這種東西,不能看絕對(duì),只能看相對(duì)。

IP_Hash算法:

hash(object)%N算法,通過(guò)一種散列算法把請(qǐng)求分配到不同的服務(wù)器上。

3.Java代碼實(shí)現(xiàn)負(fù)載均衡五種算法

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.取出來(lái)key,放到set中Set<String> ipset=ipServerMap.keySet();// 3.set放到list,要循環(huán)list取出ArrayList<String> iplist=new ArrayList<String>();iplist.addAll(ipset);String serverName=null;// 4.定義一個(gè)循環(huán)的值,如果大于set就從0開(kāi)始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.加權(quán)輪詢法

package com.test.loadbalance;import java.util.*; import java.util.concurrent.ConcurrentHashMap;/*** Title:* Description:加權(quán)輪詢** @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();//定義一個(gè)list放所有serverArrayList<String> ipArrayList=new ArrayList<String>();//循環(huán)set,根據(jù)set中的可以去得知map中的value,給list中添加對(duì)應(yīng)數(shù)字的server數(shù)量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.隨機(jī)法:

package com.test.loadbalance;import java.util.*; import java.util.concurrent.ConcurrentHashMap;/*** Title:* Description:隨機(jī)** @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();//定義一個(gè)list放所有serverArrayList<String> ipArrayList=new ArrayList<String>();ipArrayList.addAll(ipSet);//循環(huán)隨機(jī)數(shù)Random random=new Random();//隨機(jī)數(shù)在list數(shù)量中取(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.加權(quán)隨機(jī):

package com.test.loadbalance;import java.util.*; import java.util.concurrent.ConcurrentHashMap;/*** Title:* Description:加權(quán)隨機(jī)** @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();//定義一個(gè)list放所有serverArrayList<String> ipArrayList=new ArrayList<String>();//循環(huán)set,根據(jù)set中的可以去得知map中的value,給list中添加對(duì)應(yīng)數(shù)字的server數(shù)量while (ipIterator.hasNext()){String serverName=ipIterator.next();Integer weight=ipServerMap.get(serverName);for (int i=0;i<weight;i++){ipArrayList.add(serverName);}}//循環(huán)隨機(jī)數(shù)Random random=new Random();//隨機(jī)數(shù)在list數(shù)量中取(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.取出來(lái)key,放到set中Set<String> ipset=ipServerMap.keySet();// 3.set放到list,要循環(huán)list取出ArrayList<String> iplist=new ArrayList<String>();iplist.addAll(ipset);//對(duì)ip的hashcode值取余數(shù),每次都一樣的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);}}

總結(jié)

以上是生活随笔為你收集整理的Java代码实现负载均衡五种算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。