自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java進(jìn)階之深入理解負(fù)載均衡的五種算法實(shí)現(xiàn)原理

開發(fā) 后端 服務(wù)器 算法
什么是負(fù)載均衡:指由多臺服務(wù)器以對稱的方式組成一個(gè)服務(wù)器集合,每臺服務(wù)器都具有等價(jià)的地位,都可以單獨(dú)對外提供服務(wù)而無須其他服務(wù)器的輔助。

 本文轉(zhuǎn)載自微信公眾號「Android開發(fā)編程」,作者Android開發(fā)編程。轉(zhuǎn)載本文請聯(lián)系A(chǔ)ndroid開發(fā)編程公眾號。

前言

什么是負(fù)載均衡:

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

今天我們就來說說;

一、負(fù)載均衡算法簡介

1、輪詢法

將請求按順序輪流地分配到后端服務(wù)器上,它均衡地對待后端的每一臺服務(wù)器,而不關(guān)心服務(wù)器實(shí)際的連接數(shù)和當(dāng)前的系統(tǒng)負(fù)載;

2、隨機(jī)法

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

3、源地址哈希法

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

4、加權(quán)輪詢法

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

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

與加權(quán)輪詢法一樣,加權(quán)隨機(jī)法也根據(jù)后端機(jī)器的配置,系統(tǒng)的負(fù)載分配不同的權(quán)重。不同的是,它是按照權(quán)重隨機(jī)請求后端服務(wù)器,而非順序;

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

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,要循環(huán)list取出 
  19.         ArrayList<String> iplist=new ArrayList<String>(); 
  20.         iplist.addAll(ipset); 
  21.         String serverName=null
  22.         // 4.定義一個(gè)循環(huán)的值,如果大于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.加權(quán)輪詢法

  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.         //定義一個(gè)list放所有server 
  18.         ArrayList<String> ipArrayList=new ArrayList<String>(); 
  19.         //循環(huán)set,根據(jù)set中的可以去得知map中的value,給list中添加對應(yīng)數(shù)字的server數(shù)量 
  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.隨機(jī)法

  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.         //定義一個(gè)list放所有server 
  16.         ArrayList<String> ipArrayList=new ArrayList<String>(); 
  17.         ipArrayList.addAll(ipSet); 
  18.         //循環(huán)隨機(jī)數(shù) 
  19.         Random random=new Random(); 
  20.         //隨機(jī)數(shù)在list數(shù)量中取(1-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.加權(quán)隨機(jī)

  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.         //定義一個(gè)list放所有server 
  17.         ArrayList<String> ipArrayList=new ArrayList<String>(); 
  18.         //循環(huán)set,根據(jù)set中的可以去得知map中的value,給list中添加對應(yīng)數(shù)字的server數(shù)量 
  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.         //循環(huán)隨機(jī)數(shù) 
  27.         Random random=new Random(); 
  28.         //隨機(jī)數(shù)在list數(shù)量中取(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,要循環(huán)list取出 
  20.         ArrayList<String> iplist=new ArrayList<String>(); 
  21.         iplist.addAll(ipset); 
  22.         //對ip的hashcode值取余數(shù),每次都一樣的 
  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.     } 

總結(jié) 

不進(jìn)則退,一起加油!

 

責(zé)任編輯:武曉燕 來源: Android開發(fā)編程
相關(guān)推薦

2021-10-21 10:02:37

Java開發(fā)代碼

2018-11-27 12:31:39

負(fù)載均衡高可用架構(gòu)

2021-09-10 07:31:54

AndroidAppStartup原理

2020-01-14 09:40:00

Nginx負(fù)載均衡正向代理

2021-09-08 06:51:52

AndroidRetrofit原理

2021-10-15 09:19:17

AndroidSharedPrefe分析源碼

2023-09-06 13:58:01

負(fù)載均衡算法

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 基礎(chǔ)

2021-09-18 06:56:01

JavaCAS機(jī)制

2025-04-14 08:10:00

負(fù)載均衡代碼java

2023-09-19 22:47:39

Java內(nèi)存

2017-08-08 09:15:41

前端JavaScript頁面渲染

2015-01-06 15:25:12

DockerDocker Volu數(shù)據(jù)容器

2021-02-17 11:25:33

前端JavaScriptthis

2022-01-14 12:28:18

架構(gòu)OpenFeign遠(yuǎn)程

2022-11-04 09:43:05

Java線程

2024-03-12 00:00:00

Sora技術(shù)數(shù)據(jù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號