溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

使用Java實現(xiàn)5種負(fù)載均衡算法的方法教程

發(fā)布時間:2021-09-30 14:48:41 來源:億速云 閱讀:150 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“使用Java實現(xiàn)5種負(fù)載均衡算法的方法教程”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

目錄
  • 前言

  • 概念

  • 幾種負(fù)載均衡算法圖例

  • 輪詢算法

  • 加權(quán)輪詢法

  • 加權(quán)隨機法

  • 隨機法

  • IP_Hash算法

  • 總結(jié)

前言

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

概念

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

使用Java實現(xiàn)5種負(fù)載均衡算法的方法教程

幾種負(fù)載均衡算法圖例

使用Java實現(xiàn)5種負(fù)載均衡算法的方法教程

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

輪詢算法

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

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

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

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);
        }
    }
}

輸出結(jié)果:

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

加權(quán)輪詢法

該算法中,每個機器接受的連接數(shù)量是按權(quán)重比例分配的。這是對普通輪詢算法的改進(jìn),比如你可以設(shè)定:第三臺機器的處理能力是第一臺機器的兩倍,那么負(fù)載均衡器會把兩倍的連接數(shù)量分配給第3臺機器,輪詢可以將請求順序按照權(quán)重分配到后端。

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-權(quán)重
        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ù)權(quán)重不同,放入list 中的數(shù)量等同于權(quán)重,輪詢出的的次數(shù)等同于權(quán)重
            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);
        }
    }
}

輸出結(jié)果:

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

加權(quán)隨機法

獲取帶有權(quán)重的隨機數(shù)字,隨機這種東西,不能看絕對,只能看相對,我們不用index 控制下標(biāo)進(jìn)行輪詢,只用random 進(jìn)行隨機取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-權(quán)重
        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ù)權(quán)重不同,放入list 中的數(shù)量等同于權(quán)重,輪詢出的的次數(shù)等同于權(quán)重
            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);
        }
    }
}

輸出結(jié)果:

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

隨機法

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

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ù)散列取模算法將請求分配到不同的服務(wù)器上

優(yōu)點:保證了相同客戶端IP地址將會被哈希到同一臺后端服務(wù)器,直到后端服務(wù)器列表變更。根據(jù)此特性可以在服務(wù)消費者與服務(wù)提供者之間建立有狀態(tài)的session會話

缺點: 如果服務(wù)器進(jìn)行了下線操作,源IP路由的服務(wù)器IP就會變成另外一臺,如果服務(wù)器沒有做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);
    }
}

輸出結(jié)果

192.168.1.3

每次運行結(jié)果都一樣

“使用Java實現(xiàn)5種負(fù)載均衡算法的方法教程”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI