最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 負(fù)載均衡的 5 種算法實現(xiàn)原理

 更新時間:2021年10月21日 10:58:38   作者:佚名  
這篇文章主要介紹Java 負(fù)載均衡的 5 種算法實現(xiàn)原理,負(fù)載均衡能夠平均分配客戶請求到服 務(wù)器陣列,借此提供快速獲取重要數(shù)據(jù),解決大量并發(fā)訪問服務(wù)問題,這種集群技術(shù)可以用最少的投資獲得接近于大型主機(jī)的性能。下面就來看看文章的具體內(nèi)容吧

前言:

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

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

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

1、輪詢法

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

2、隨機(jī)法

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

3、源地址哈希法

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

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

1.輪詢法

import java.util.*; 
import java.util.concurrent.ConcurrentHashMap; 
public  class TestRoundRobin {  
    // 1.定義map, key-ip,value-weight 
    static Map<String,Integer> ipMap= new HashMap<>(); 
    static { 
        ipMap.put("192.168.13.1",1); 
        ipMap.put("192.168.13.2",1); 
        ipMap.put("192.168.13.3",1); 
    } 
// Integer sum=0; 
    Integer  pos = 0; 
    public String RoundRobin(){ 
        Map<String,Integer> ipServerMap=new ConcurrentHashMap<>(); 
        ipServerMap.putAll(ipMap); 
        // 2.取出來key,放到set中 
        Set<String> ipset=ipServerMap.keySet(); 
        // 3.set放到list,要循環(huán)list取出 
        ArrayList<String> iplist=new ArrayList<String>(); 
        iplist.addAll(ipset); 
        String serverName=null; 
        // 4.定義一個循環(huán)的值,如果大于set就從0開始 
        synchronized(pos){ 
            if (pos>=ipset.size()){ 
                pos=0; 
            } 
            serverName=iplist.get(pos); 
            //輪詢+1 
            pos ++; 
        } 
        return serverName; 
    } 
    public  static  void main(String[] args) { 
        TestRoundRobin testRoundRobin=new TestRoundRobin(); 
        for ( int i=0;i<10;i++){ 
            String serverIp=testRoundRobin.RoundRobin(); 
            System.out.println(serverIp); 
        } 
    } 
} 

2.加權(quán)輪詢法

import java.util.*; 
import java.util.concurrent.ConcurrentHashMap; 
public  class TestWeightRobin { 
    //    1.map, key-ip,value-weight 
    static Map<String,Integer> ipMap= new HashMap<>(); 
    static { 
        ipMap.put("192.168.13.1",1); 
        ipMap.put("192.168.13.2",2); 
        ipMap.put("192.168.13.3",4); 
    } 
    Integer pos=0; 
    public String WeightRobin(){ 
        Map<String,Integer> ipServerMap=new ConcurrentHashMap<>(); 
        ipServerMap.putAll(ipMap); 
        Set<String> ipSet=ipServerMap.keySet(); 
        Iterator<String> ipIterator=ipSet.iterator(); 
        //定義一個list放所有server 
        ArrayList<String> ipArrayList=new ArrayList<String>(); 
        //循環(huán)set,根據(jù)set中的可以去得知map中的value,給list中添加對應(yīng)數(shù)字的server數(shù)量 
        while (ipIterator.hasNext()){ 
            String serverName=ipIterator.next(); 
            Integer weight=ipServerMap.get(serverName); 
            for ( int i = 0;i < weight ;i++){ 
                ipArrayList.add(serverName); 
            } 
        } 
        String serverName=null; 
        if (pos>=ipArrayList.size()){ 
            pos=0; 
        } 
        serverName=ipArrayList.get(pos); 
        //輪詢+1 
        pos ++; 
        return  serverName; 
    } 
    public  static  void main(String[] args) { 
        TestWeightRobin testWeightRobin=new TestWeightRobin(); 
        for ( int i =0;i<10;i++){ 
            String server=testWeightRobin.WeightRobin(); 
            System.out.println(server); 
        } 
    } 
} 

3.隨機(jī)法

import java.util.*; 
import java.util.concurrent.ConcurrentHashMap; 
public  class TestRandom { 
    //    1.定義map, key-ip,value-weight 
    static Map<String,Integer> ipMap= new HashMap<>(); 
    static { 
        ipMap.put("192.168.13.1",1); 
        ipMap.put("192.168.13.2",2); 
        ipMap.put("192.168.13.3",4); 
    } 
    public String Random() { 
        Map<String,Integer> ipServerMap=new ConcurrentHashMap<>(); 
        ipServerMap.putAll(ipMap); 
        Set<String> ipSet=ipServerMap.keySet(); 
        //定義一個list放所有server 
        ArrayList<String> ipArrayList=new ArrayList<String>(); 
        ipArrayList.addAll(ipSet); 
        //循環(huán)隨機(jī)數(shù) 
        Random random=new Random(); 
        //隨機(jī)數(shù)在list數(shù)量中?。?-list.size) 
        int pos=random.nextInt(ipArrayList.size()); 
        String serverNameReturn= ipArrayList.get(pos); 
        return  serverNameReturn; 
    } 
    public  static  void main(String[] args) { 
        TestRandom testRandom=new TestRandom(); 
        for ( int i =0;i<10;i++){ 
            String server=testRandom.Random(); 
            System.out.println(server); 
        } 
    } 
} 

4.加權(quán)隨機(jī)

import java.util.*; 
import java.util.concurrent.ConcurrentHashMap; 
public  class TestRobinRandom { 
    //    1.定義map, key-ip,value-weight 
    static Map<String,Integer> ipMap= new HashMap<>(); 
    static { 
        ipMap.put("192.168.13.1",1); 
        ipMap.put("192.168.13.2",2); 
        ipMap.put("192.168.13.3",4); 
    } 
    public String RobinRandom(){ 
        Map<String,Integer> ipServerMap=new ConcurrentHashMap<>(); 
        ipServerMap.putAll(ipMap); 
        Set<String> ipSet=ipServerMap.keySet(); 
        Iterator<String> ipIterator=ipSet.iterator(); 
        //定義一個list放所有server 
        ArrayList<String> ipArrayList=new ArrayList<String>(); 
        //循環(huán)set,根據(jù)set中的可以去得知map中的value,給list中添加對應(yīng)數(shù)字的server數(shù)量 
        while (ipIterator.hasNext()){ 
            String serverName=ipIterator.next(); 
            Integer weight=ipServerMap.get(serverName); 
            for ( int i=0;i<weight;i++){ 
                ipArrayList.add(serverName); 
            } 
        } 
        //循環(huán)隨機(jī)數(shù) 
        Random random=new Random(); 
        //隨機(jī)數(shù)在list數(shù)量中?。?-list.size) 
        int pos=random.nextInt(ipArrayList.size()); 
        String serverNameReturn= ipArrayList.get(pos); 
        return  serverNameReturn; 
    } 
    public  static  void main(String[] args) { 
        TestRobinRandom testRobinRandom=new TestRobinRandom(); 
        for ( int i =0;i<10;i++){ 
            String server=testRobinRandom.RobinRandom(); 
            System.out.println(server); 
        } 
    } 
} 

5.源地址哈希法

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.Set; 
import java.util.concurrent.ConcurrentHashMap; 
public  class ipHash { 
    //    1.定義map, key-ip,value-weight 
    static Map<String,Integer> ipMap= new HashMap<>(); 
    static { 
        ipMap.put("192.168.13.1",1); 
        ipMap.put("192.168.13.2",2); 
        ipMap.put("192.168.13.3",4); 
    } 
    public String ipHash(String clientIP){ 
        Map<String,Integer> ipServerMap=new ConcurrentHashMap<>(); 
        ipServerMap.putAll(ipMap); 
        //    2.取出來key,放到set中 
        Set<String> ipset=ipServerMap.keySet(); 
        //    3.set放到list,要循環(huán)list取出 
        ArrayList<String> iplist=new ArrayList<String>(); 
        iplist.addAll(ipset); 
        //對ip的hashcode值取余數(shù),每次都一樣的 
        int hashCode=clientIP.hashCode(); 
        int serverListsize=iplist.size(); 
        int pos=hashCode%serverListsize; 
        return iplist.get(pos); 
    } 
    public  static  void main(String[] args) { 
        ipHash iphash=new ipHash(); 
        String servername= iphash.ipHash("192.168.21.2"); 
        System.out.println(servername); 
    } 
} 

到此這篇關(guān)于Java 負(fù)載均衡的 5 種算法實現(xiàn)原理的文章就介紹到這了,更多相關(guān)Java 負(fù)載均衡的 算法實現(xiàn)原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決springboot項目啟動失敗Could not initialize class com.fasterxml.jackson.databind.ObjectMapper問題

    解決springboot項目啟動失敗Could not initialize class&

    這篇文章主要介紹了解決springboot項目啟動失敗Could not initialize class com.fasterxml.jackson.databind.ObjectMapper問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • spring集成okhttp3的步驟詳解

    spring集成okhttp3的步驟詳解

    okhttp是一個封裝URL,比HttpClient更友好易用的工具,下面這篇文章主要給大家介紹了關(guān)于spring集成okhttp3的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2018-04-04
  • 用Java生成二維碼并附帶文字信息

    用Java生成二維碼并附帶文字信息

    這篇文章主要介紹了用Java生成二維碼并附帶文字信息,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • java8中的Collectors.groupingBy用法詳解

    java8中的Collectors.groupingBy用法詳解

    這篇文章主要介紹了java8中的Collectors.groupingBy用法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • java加密解密示例分享

    java加密解密示例分享

    想要創(chuàng)造一個只有自己能看懂的文件嗎?那就是對數(shù)據(jù)加密吧,下面分享一個java的數(shù)據(jù)加密與解密示例
    2014-01-01
  • 詳解Mybatis逆向工程中使用Mysql8.0版本驅(qū)動遇到的問題

    詳解Mybatis逆向工程中使用Mysql8.0版本驅(qū)動遇到的問題

    今天在使用 8.0.12 版的 mysql 驅(qū)動時遇到了各種各樣的坑。這篇文章主要介紹了詳解Mybatis逆向工程中使用Mysql8.0版本驅(qū)動遇到的問題,感興趣的小伙伴們可以參考一下
    2018-10-10
  • java關(guān)于字符串的常用API

    java關(guān)于字符串的常用API

    字符串其實就是一串連續(xù)的字符,它是由許多單個字符連接而成的。如多個英文字母所組成的一個英文單詞。字符串中可以包含任意字符,這些字符必須包含在一對雙引號之內(nèi),今天就來介紹字符串常用的API
    2023-05-05
  • jwt生成token和token解析基礎(chǔ)詳解

    jwt生成token和token解析基礎(chǔ)詳解

    這篇文章主要為大家介紹了jwt生成token和token解析基礎(chǔ),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • log4j使用詳細(xì)解析

    log4j使用詳細(xì)解析

    Log4j 除了可以記錄程序運行日志信息外還有一重要的功能就是用來顯示調(diào)試信息。下面通過本文給大家介紹log4j使用詳細(xì)解析,感興趣的朋友一起看看吧
    2017-10-10
  • 使用lombok@Data啟動項目報錯問題及解決

    使用lombok@Data啟動項目報錯問題及解決

    在使用Lombok時,可能會遇到實體類中的@Data注解不生效,導(dǎo)致get方法找不到的問題,解決這一問題通常需要三個步驟:首先,檢查項目設(shè)置中編譯規(guī)則是否勾選;其次,確認(rèn)IDE中是否安裝了Lombok插件
    2024-10-10

最新評論

高州市| 虎林市| 江城| 咸阳市| 建瓯市| 陕西省| 凌源市| 泰和县| 龙陵县| 威信县| 衡山县| 武汉市| 海丰县| 绥江县| 闽侯县| 福清市| 海原县| 商都县| 牙克石市| 沾化县| 洪湖市| 长治市| 介休市| 宣武区| 山西省| 滦南县| 留坝县| 德令哈市| 榆林市| 密山市| 四会市| 新平| 监利县| 区。| 邹平县| 华宁县| 商城县| 科技| 南通市| 沙湾县| 丹江口市|