<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
負載均衡是將使用者端請求存取,通過提前約定好的規則轉發給各個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<String> ips = Lists.newArrayList("192.168.1.1", "192.168.1.2", "192.168.1.3"); 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.168.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<String, Integer> ipMap=new HashMap<String, Integer>(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<String> getServerIpByWeight() { List<String> ips = new ArrayList<String>(32); for (Map.Entry<String, Integer> 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 weightRobin(){ List<String> ips = this.getServerIpByWeight(); if (index >= ips.size()){ index = 0; } String serverIp= ips.get(index); index ++; return serverIp; } public static void main(String[] args) { TestWeight testWeightRobin=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<String, Integer> ipMap=new HashMap<String, Integer>(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<String> getServerIpByWeight() { List<String> ips = new ArrayList<String>(32); for (Map.Entry<String, Integer> 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<String> 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<String> 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
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<String> 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
每次執行結果都一樣
到此這篇關於Java實現5種負載均衡演演算法(小結)的文章就介紹到這了,更多相關Java 負載均衡 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45