欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實現(xiàn)5種負載均衡算法(小結)

 更新時間:2022年06月01日 10:21:11   作者:星星不閃包退1  
負載均衡是將客戶端請求訪問,通過提前約定好的規(guī)則轉發(fā)給各個server,本文主要介紹了Java實現(xiàn)5種負載均衡算法,具有一定的參考價值,感興趣的可以了解一下

概念

負載均衡是將客戶端請求訪問,通過提前約定好的規(guī)則轉發(fā)給各個server。其中有好幾個種經典的算法,下面我們用Java實現(xiàn)這幾種算法。

輪詢算法

輪詢算法按順序把每個新的連接請求分配給下一個服務器,最終把所有請求平分給所有的服務器。

優(yōu)點:絕對公平

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

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

加權輪詢法

該算法中,每個機器接受的連接數(shù)量是按權重比例分配的。這是對普通輪詢算法的改進,比如你可以設定:第三臺機器的處理能力是第一臺機器的兩倍,那么負載均衡器會把兩倍的連接數(shù)量分配給第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();
            // 根據(jù)權重不同,放入list 中的數(shù)量等同于權重,輪詢出的的次數(shù)等同于權重
            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

加權隨機法

獲取帶有權重的隨機數(shù)字,隨機這種東西,不能看絕對,只能看相對,我們不用index 控制下標進行輪詢,只用random 進行隨機取ip,即實現(xiàn)算法。

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();
            // 根據(jù)權重不同,放入list 中的數(shù)量等同于權重,輪詢出的的次數(shù)等同于權重
            for (int ipCount =0; ipCount < weight; ipCount++) {
                ips.add(ip);
            }
        }
        return ips;
    }
 
    public String randomWeightRobin(){
        List<String> ips = this.getServerIpByWeight();
        //循環(huán)隨機數(shù)
        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

隨機法

負載均衡方法隨機的把負載分配到各個可用的服務器上,通過隨機數(shù)生成算法選取一個服務器,這種實現(xiàn)算法最簡單,隨之調用次數(shù)增大,這種算法可以達到每臺服務器的請求量接近于平均。

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(){
        //隨機數(shù)
        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

IP_Hash算法

hash(ip)%N算法,通過一種散列算法把客戶端來源IP根據(jù)散列取模算法將請求分配到不同的服務器上

優(yōu)點:保證了相同客戶端IP地址將會被哈希到同一臺后端服務器,直到后端服務器列表變更。根據(jù)此特性可以在服務消費者與服務提供者之間建立有狀態(tài)的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實現(xiàn)5種負載均衡算法(小結)的文章就介紹到這了,更多相關Java 負載均衡 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java fastdfs客戶端實現(xiàn)上傳下載文件

    Java fastdfs客戶端實現(xiàn)上傳下載文件

    這篇文章主要介紹了Java fastdfs客戶端實現(xiàn)上傳下載文件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • Java的反射機制之獲取class詳解

    Java的反射機制之獲取class詳解

    這篇文章主要介紹了Java的反射機制之獲取class詳解,Class類表示一個類或接口的元數(shù)據(jù),通過它可以獲取到類或接口的構造函數(shù)、方法、字段、注解等信息,也能夠創(chuàng)建對象、調用方法等,需要的朋友可以參考下
    2023-09-09
  • MyBatisPlus3.4.3版自動生成代碼的使用過程

    MyBatisPlus3.4.3版自動生成代碼的使用過程

    這篇文章主要介紹了MyBatisPlus3.4.3版自動生成代碼的使用,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • Spring中@Autowired注解的原理詳解

    Spring中@Autowired注解的原理詳解

    這篇文章主要介紹了Spring中@Autowired注解的原理詳解,對于spring配置一個bean時,如果需要給該bean提供一些初始化參數(shù),則需要通過依賴注入方式,所謂的依賴注入就是通過spring將bean所需要的一些參數(shù)傳遞到bean實例對象的過程,需要的朋友可以參考下
    2023-11-11
  • Java redis使用場景介紹

    Java redis使用場景介紹

    Redis是一個完全開源、遵守 BSD 協(xié)議、簡單的、高效的、分布式的、基于內存的k-v數(shù)據(jù)庫,本篇文章帶你了解它的使用場景,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • Java單例模式與破壞單例模式概念原理深入講解

    Java單例模式與破壞單例模式概念原理深入講解

    單例模式(Singleton?Pattern)是?Java?中最簡單的設計模式之一。這種類型的設計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。這種模式涉及到一個單一的類,該類負責創(chuàng)建自己的對象,同時確保只有單個對象被創(chuàng)建
    2023-02-02
  • Java優(yōu)先隊列(PriorityQueue)重寫compare操作

    Java優(yōu)先隊列(PriorityQueue)重寫compare操作

    這篇文章主要介紹了Java優(yōu)先隊列(PriorityQueue)重寫compare操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Java中的遞增i++與++i的實現(xiàn)原理詳解

    Java中的遞增i++與++i的實現(xiàn)原理詳解

    這篇文章主要介紹了Java中的i++與++i的實現(xiàn)原理詳解,在Java中,i++是一種常見的遞增操作符,用于將變量i的值增加1,它是一種簡潔且方便的方式來實現(xiàn)循環(huán)和計數(shù)功能,i++可以用于各種情況,本文來看一下其實現(xiàn)原理,需要的朋友可以參考下
    2023-10-10
  • JAVA中出現(xiàn)異常、拋出異常后續(xù)代碼是否執(zhí)行情況詳析

    JAVA中出現(xiàn)異常、拋出異常后續(xù)代碼是否執(zhí)行情況詳析

    當產生異常后,并在異常處理器中進行執(zhí)行之后,程序會是如何的一種狀態(tài),是終止還是繼續(xù)執(zhí)行處理之后的代碼呢,下面這篇文章主要給大家介紹了關于JAVA中出現(xiàn)異常、拋出異常后續(xù)代碼是否執(zhí)行情況的相關資料,需要的朋友可以參考下
    2024-05-05
  • 雙重檢查鎖定模式Java中的陷阱案例

    雙重檢查鎖定模式Java中的陷阱案例

    這篇文章主要介紹了雙重檢查鎖定模式Java中的陷阱,雙重檢查鎖定(也叫做雙重檢查鎖定優(yōu)化)是一種軟件設計模式,它的作用是減少延遲初始化在多線程環(huán)境下獲取鎖的次數(shù),尤其是單例模式下比較突出,想具體了解的小伙伴可以參考下面文章內容,附呦詳細的舉例說明
    2021-10-10

最新評論