成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java 進階之深入理解負載均衡的 5 種算法實現原理

開發 后端 算法
負載均衡能夠平均分配客戶請求到服 務器陣列,借此提供快速獲取重要數據,解決大量并發訪問服務問題,這種集群技術可以用最少的投資獲得接近于大型主機的性能。

 

前言

什么是負載均衡:

指由多臺服務器以對稱的方式組成一個服務器集合,每臺服務器都具有等價的地位,都可以單獨對外提供服務而無須其他服務器的輔助。通過某種 負載分擔技術,將外部發送來的請求均勻分配到對稱結構中的某一臺服務器上,而接收到請求的服務器獨立地回應客戶的請求。負載均衡能夠平均分配客戶請求到服 務器陣列,借此提供快速獲取重要數據,解決大量并發訪問服務問題,這種集群技術可以用最少的投資獲得接近于大型主機的性能;

今天我們就來說說;

一、負載均衡算法簡介

1、輪詢法

將請求按順序輪流地分配到后端服務器上,它均衡地對待后端的每一臺服務器,而不關心服務器實際的連接數和當前的系統負載;

2、隨機法

通過系統的隨機算法,根據后端服務器的列表大小值來隨機選取其中的一臺服務器進行訪問。由概率統計理論可以得知,隨著客戶端調用服務端的次數增多, 其實際效果越來越接近于平均分配調用量到后端的每一臺服務器,也就是輪詢的結果;

3、源地址哈希法

源地址哈希的思想是根據獲取客戶端的IP地址,通過哈希函數計算得到的一個數值,用該數值對服務器列表的大小進行取模運算,得到的結果便是客服端要訪問服務器的序號。采用源地址哈希法進行負載均衡,同一IP地址的客戶端,當后端服務器列表不變時,它每次都會映射到同一臺后端服務器進行訪問;

4、加權輪詢法

不同的后端服務器可能機器的配置和當前系統的負載并不相同,因此它們的抗壓能力也不相同。給配置高、負載低的機器配置更高的權重,讓其處理更多的請;而配置低、負載高的機器,給其分配較低的權重,降低其系統負載,加權輪詢能很好地處理這一問題,并將請求順序且按照權重分配到后端;

5、加權隨機法

與加權輪詢法一樣,加權隨機法也根據后端機器的配置,系統的負載分配不同的權重。不同的是,它是按照權重隨機請求后端服務器,而非順序;

二、代碼實現負載均衡五種算法

1.輪詢法

  1. import java.util.*; 
  2. import java.util.concurrent.ConcurrentHashMap; 
  3. public class TestRoundRobin {  
  4.     // 1.定義map, key-ip,value-weight 
  5.     static Map<String,Integer> ipMap=new HashMap<>(); 
  6.     static { 
  7.         ipMap.put("192.168.13.1",1); 
  8.         ipMap.put("192.168.13.2",1); 
  9.         ipMap.put("192.168.13.3",1); 
  10.     } 
  11.   // Integer sum=0; 
  12.     Integer  pos = 0
  13.     public String RoundRobin(){ 
  14.         Map<String,Integer> ipServerMap=new ConcurrentHashMap<>(); 
  15.         ipServerMap.putAll(ipMap); 
  16.         // 2.取出來key,放到set中 
  17.         Set<String> ipset=ipServerMap.keySet(); 
  18.         // 3.set放到list,要循環list取出 
  19.         ArrayList<String> iplist=new ArrayList<String>(); 
  20.         iplist.addAll(ipset); 
  21.         String serverName=null
  22.         // 4.定義一個循環的值,如果大于set就從0開始 
  23.         synchronized(pos){ 
  24.             if (pos>=ipset.size()){ 
  25.                 pos=0
  26.             } 
  27.             serverName=iplist.get(pos); 
  28.             //輪詢+1 
  29.             pos ++; 
  30.         } 
  31.         return serverName; 
  32.     } 
  33.     public static void main(String[] args) { 
  34.         TestRoundRobin testRoundRobin=new TestRoundRobin(); 
  35.         for (int i=0;i<10;i++){ 
  36.             String serverIp=testRoundRobin.RoundRobin(); 
  37.             System.out.println(serverIp); 
  38.         } 
  39.     } 

2.加權輪詢法

  1. import java.util.*; 
  2. import java.util.concurrent.ConcurrentHashMap; 
  3. public class TestWeightRobin { 
  4.     //    1.map, key-ip,value-weight 
  5.     static Map<String,Integer> ipMap=new HashMap<>(); 
  6.     static { 
  7.         ipMap.put("192.168.13.1",1); 
  8.         ipMap.put("192.168.13.2",2); 
  9.         ipMap.put("192.168.13.3",4); 
  10.     } 
  11.     Integer pos=0
  12.     public String WeightRobin(){ 
  13.         Map<String,Integer> ipServerMap=new ConcurrentHashMap<>(); 
  14.         ipServerMap.putAll(ipMap); 
  15.         Set<String> ipSet=ipServerMap.keySet(); 
  16.         Iterator<String> ipIterator=ipSet.iterator(); 
  17.         //定義一個list放所有server 
  18.         ArrayList<String> ipArrayList=new ArrayList<String>(); 
  19.         //循環set,根據set中的可以去得知map中的value,給list中添加對應數字的server數量 
  20.         while (ipIterator.hasNext()){ 
  21.             String serverName=ipIterator.next(); 
  22.             Integer weight=ipServerMap.get(serverName); 
  23.             for (int i = 0;i < weight ;i++){ 
  24.                 ipArrayList.add(serverName); 
  25.             } 
  26.         } 
  27.         String serverName=null
  28.         if (pos>=ipArrayList.size()){ 
  29.             pos=0
  30.         } 
  31.         serverName=ipArrayList.get(pos); 
  32.         //輪詢+1 
  33.         pos ++; 
  34.         return  serverName; 
  35.     } 
  36.     public static void main(String[] args) { 
  37.         TestWeightRobin testWeightRobin=new TestWeightRobin(); 
  38.         for (int i =0;i<10;i++){ 
  39.             String server=testWeightRobin.WeightRobin(); 
  40.             System.out.println(server); 
  41.         } 
  42.     } 

3.隨機法

  1. import java.util.*; 
  2. import java.util.concurrent.ConcurrentHashMap; 
  3. public class TestRandom { 
  4.     //    1.定義map, key-ip,value-weight 
  5.     static Map<String,Integer> ipMap=new HashMap<>(); 
  6.     static { 
  7.         ipMap.put("192.168.13.1",1); 
  8.         ipMap.put("192.168.13.2",2); 
  9.         ipMap.put("192.168.13.3",4); 
  10.     } 
  11.     public String Random() { 
  12.         Map<String,Integer> ipServerMap=new ConcurrentHashMap<>(); 
  13.         ipServerMap.putAll(ipMap); 
  14.         Set<String> ipSet=ipServerMap.keySet(); 
  15.         //定義一個list放所有server 
  16.         ArrayList<String> ipArrayList=new ArrayList<String>(); 
  17.         ipArrayList.addAll(ipSet); 
  18.         //循環隨機數 
  19.         Random random=new Random(); 
  20.         //隨機數在list數量中?。?-list.size) 
  21.         int pos=random.nextInt(ipArrayList.size()); 
  22.         String serverNameReturn= ipArrayList.get(pos); 
  23.         return  serverNameReturn; 
  24.     } 
  25.     public static void main(String[] args) { 
  26.         TestRandom testRandom=new TestRandom(); 
  27.         for (int i =0;i<10;i++){ 
  28.             String server=testRandom.Random(); 
  29.             System.out.println(server); 
  30.         } 
  31.     } 

4.加權隨機

  1. import java.util.*; 
  2. import java.util.concurrent.ConcurrentHashMap; 
  3. public class TestRobinRandom { 
  4.     //    1.定義map, key-ip,value-weight 
  5.     static Map<String,Integer> ipMap=new HashMap<>(); 
  6.     static { 
  7.         ipMap.put("192.168.13.1",1); 
  8.         ipMap.put("192.168.13.2",2); 
  9.         ipMap.put("192.168.13.3",4); 
  10.     } 
  11.     public String RobinRandom(){ 
  12.         Map<String,Integer> ipServerMap=new ConcurrentHashMap<>(); 
  13.         ipServerMap.putAll(ipMap); 
  14.         Set<String> ipSet=ipServerMap.keySet(); 
  15.         Iterator<String> ipIterator=ipSet.iterator(); 
  16.         //定義一個list放所有server 
  17.         ArrayList<String> ipArrayList=new ArrayList<String>(); 
  18.         //循環set,根據set中的可以去得知map中的value,給list中添加對應數字的server數量 
  19.         while (ipIterator.hasNext()){ 
  20.             String serverName=ipIterator.next(); 
  21.             Integer weight=ipServerMap.get(serverName); 
  22.             for (int i=0;i<weight;i++){ 
  23.                 ipArrayList.add(serverName); 
  24.             } 
  25.         } 
  26.         //循環隨機數 
  27.         Random random=new Random(); 
  28.         //隨機數在list數量中取(1-list.size) 
  29.         int pos=random.nextInt(ipArrayList.size()); 
  30.         String serverNameReturn= ipArrayList.get(pos); 
  31.         return  serverNameReturn; 
  32.     } 
  33.     public static void main(String[] args) { 
  34.         TestRobinRandom testRobinRandom=new TestRobinRandom(); 
  35.         for (int i =0;i<10;i++){ 
  36.             String server=testRobinRandom.RobinRandom(); 
  37.             System.out.println(server); 
  38.         } 
  39.     } 

5.源地址哈希法

  1. import java.util.ArrayList; 
  2. import java.util.HashMap; 
  3. import java.util.Map; 
  4. import java.util.Set; 
  5. import java.util.concurrent.ConcurrentHashMap; 
  6. public class ipHash { 
  7.     //    1.定義map, key-ip,value-weight 
  8.     static Map<String,Integer> ipMap=new HashMap<>(); 
  9.     static { 
  10.         ipMap.put("192.168.13.1",1); 
  11.         ipMap.put("192.168.13.2",2); 
  12.         ipMap.put("192.168.13.3",4); 
  13.     } 
  14.     public String ipHash(String clientIP){ 
  15.         Map<String,Integer> ipServerMap=new ConcurrentHashMap<>(); 
  16.         ipServerMap.putAll(ipMap); 
  17.         //    2.取出來key,放到set中 
  18.         Set<String> ipset=ipServerMap.keySet(); 
  19.         //    3.set放到list,要循環list取出 
  20.         ArrayList<String> iplist=new ArrayList<String>(); 
  21.         iplist.addAll(ipset); 
  22.         //對ip的hashcode值取余數,每次都一樣的 
  23.         int hashCode=clientIP.hashCode(); 
  24.         int serverListsize=iplist.size(); 
  25.         int pos=hashCode%serverListsize; 
  26.         return iplist.get(pos); 
  27.     } 
  28.     public static void main(String[] args) { 
  29.         ipHash iphash=new ipHash(); 
  30.         String servername= iphash.ipHash("192.168.21.2"); 
  31.         System.out.println(servername); 
  32.     } 

總結

不進則退,一起加油

 

責任編輯:張燕妮 來源: Android開發編程
相關推薦

2021-10-10 13:31:14

Java負載均衡算法

2018-11-27 12:31:39

負載均衡高可用架構

2021-09-10 07:31:54

AndroidAppStartup原理

2020-01-14 09:40:00

Nginx負載均衡正向代理

2021-09-08 06:51:52

AndroidRetrofit原理

2021-10-15 09:19:17

AndroidSharedPrefe分析源碼

2024-08-29 08:41:50

2021-09-17 06:55:50

AndroidLayoutView

2022-09-05 22:22:00

Stream操作對象

2021-09-24 08:10:40

Java 語言 Java 基礎

2021-09-18 06:56:01

JavaCAS機制

2023-09-19 22:47:39

Java內存

2021-02-17 11:25:33

前端JavaScriptthis

2017-08-08 09:15:41

前端JavaScript頁面渲染

2019-12-26 09:13:00

算法硬件軟件

2022-01-14 12:28:18

架構OpenFeign遠程

2024-03-12 00:00:00

Sora技術數據

2022-11-04 09:43:05

Java線程

2021-03-10 10:55:51

SpringJava代碼

2022-09-05 08:39:04

kubernetesk8s
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久www成人免费无遮挡大片 | 日韩一区二区精品 | 成年视频在线观看福利资源 | 嫩草一区二区三区 | 九九热免费看 | 国产一区二区不卡 | 国产真实乱全部视频 | 成人黄在线观看 | 亚洲国产免费 | 精品免费国产视频 | 久久成人一区 | 欧美最猛性xxxxx亚洲精品 | 欧美日韩综合视频 | 久久国内精品 | 亚洲国产中文字幕 | 亚洲免费影院 | 国产99久久精品 | 国产一区二区三区久久久久久久久 | 91原创视频| 成人免费影院 | 国产精品片 | 久草热8精品视频在线观看 午夜伦4480yy私人影院 | 中文字幕在线视频网站 | www.夜夜骑| 99久久精品免费看国产免费软件 | 97色综合 | 久久av一区二区三区 | 欧美激情亚洲激情 | 超碰欧美 | 国产精品一区二区不卡 | 欧美国产大片 | 一级免费看 | 中文字幕在线观看av | 欧美黄色一区 | 免费的av网站 | 丝袜美腿一区二区三区动态图 | 国产高清一二三区 | 在线一级片| 人人做人人澡人人爽欧美 | 国产精品99久久久久久www | 在线视频a |