Spring Cloud Ribbon 客戶端負載均衡

来源:https://www.cnblogs.com/Alandre/archive/2020/06/04/13041113.html
-Advertisement-
Play Games

Ribbon客戶端組件提供一系列完善的配置選項,比如連接超時、重試、重試演算法等,內置可插拔、可定製的負載均衡組件。下麵是用到的一些負載均衡策略: 簡單輪詢負載均衡 加權輪詢負載均衡 區域感知輪詢負載均衡 隨機負載均衡 先寫一個類模擬一個IP列表: public class IpMap { // 待路 ...


file

Ribbon客戶端組件提供一系列完善的配置選項,比如連接超時、重試、重試演算法等,內置可插拔、可定製的負載均衡組件。下麵是用到的一些負載均衡策略:

  • 簡單輪詢負載均衡
  • 加權輪詢負載均衡
  • 區域感知輪詢負載均衡
  • 隨機負載均衡

先寫一個類模擬一個IP列表:

public class IpMap
{
    // 待路由的Ip列表,Key代表Ip,Value代表該Ip的權重
    public static HashMap<String, Integer> serverWeightMap = 
            new HashMap<String, Integer>();
    
    static
    {
        serverWeightMap.put("192.168.1.100", 1);
        serverWeightMap.put("192.168.1.101", 1);
        // 權重為4
        serverWeightMap.put("192.168.1.102", 4);
        serverWeightMap.put("192.168.1.103", 1);
        serverWeightMap.put("192.168.1.104", 1);
        // 權重為3
        serverWeightMap.put("192.168.1.105", 3);
        serverWeightMap.put("192.168.1.106", 1);
        // 權重為2
        serverWeightMap.put("192.168.1.107", 2);
        serverWeightMap.put("192.168.1.108", 1);
        serverWeightMap.put("192.168.1.109", 1);
        serverWeightMap.put("192.168.1.110", 1);
    }
}

區域感知負載均衡

在選擇伺服器時,該負載均衡器會採取如下步驟:

區域感知負載均衡器內置電路跳閘邏輯,可被配置基於區域同源關係(Zone Affinity,也就是更傾向於選擇發出調用的服務所在的托管區域內,這樣可用降低延遲,節省成本)選擇目標服務實例。它監控每個區域中運行的實例的運維行為,而且能夠實時快速丟棄一整個區域。在面對整個區域的故障時,這幫我們提升了彈性。

1、負載均衡器會檢查、計算所有可用區域的狀態。如果某個區域中平均每個伺服器的活躍請求已經達到配置的閾值,該區域將從活躍伺服器列表中排除。如果多於一個區域已經到達閾值,平均每伺服器擁有最多活躍請求的區域將被排除。
2、最差的區域被排除後,從剩下的區域中,將按照伺服器實例數的概率抽樣法選擇一個區域。
3、從選定區域中,將會根據給定負載均衡策略規則返回一個伺服器。

簡單輪詢演算法

將請求按順序輪流地分配到後端伺服器上,它均衡地對待後端的每一臺伺服器,而不關心伺服器實際的連接數和當前的系統負載。代碼實現大致如下:

public class RoundRobin
{
    private static Integer pos = 0;
    
    public static String getServer()
    {
        // 重建一個Map,避免伺服器的上下線導致的併發問題
        Map<String, Integer> serverMap = 
                new HashMap<String, Integer>();
        serverMap.putAll(IpMap.serverWeightMap);
        
        // 取得Ip地址List
        Set<String> keySet = serverMap.keySet();
        ArrayList<String> keyList = new ArrayList<String>();
        keyList.addAll(keySet);
        
        String server = null;
        synchronized (pos)
        {
            if (pos > keySet.size())
                pos = 0;
            server = keyList.get(pos);
            pos ++;
        }
        
        return server;
    }
}
  • 優點:試圖做到請求轉移的絕對均衡。
  • 缺點:為了做到請求轉移的絕對均衡,必須付出相當大的代價,因為為了保證pos變數修改的互斥性,需要引入重量級的悲觀鎖synchronized,這將會導致該段輪詢代碼的併發吞吐量發生明顯的下降。

加權輪詢演算法

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

public class WeightRoundRobin
{
    private static Integer pos;
    
    public static String getServer()
    {
        // 重建一個Map,避免伺服器的上下線導致的併發問題
        Map<String, Integer> serverMap = 
                new HashMap<String, Integer>();
        serverMap.putAll(IpMap.serverWeightMap);
        
        // 取得Ip地址List
        Set<String> keySet = serverMap.keySet();
        Iterator<String> iterator = keySet.iterator();
        
        List<String> serverList = new ArrayList<String>();
        while (iterator.hasNext())
        {
            String server = iterator.next();
            int weight = serverMap.get(server);
            for (int i = 0; i < weight; i++)
                serverList.add(server);
        }
        
        String server = null;
        synchronized (pos)
        {
            if (pos > keySet.size())
                pos = 0;
            server = serverList.get(pos);
            pos ++;
        }
        
        return server;
    }
}

隨機負載均衡

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

public class Random
{
    public static String getServer()
    {
        // 重建一個Map,避免伺服器的上下線導致的併發問題
        Map<String, Integer> serverMap = 
                new HashMap<String, Integer>();
        serverMap.putAll(IpMap.serverWeightMap);
        
        // 取得Ip地址List
        Set<String> keySet = serverMap.keySet();
        ArrayList<String> keyList = new ArrayList<String>();
        keyList.addAll(keySet);
        
        java.util.Random random = new java.util.Random();
        int randomPos = random.nextInt(keyList.size());
        
        return keyList.get(randomPos);
    }
}

文末福利

Java 資料大全 鏈接:https://pan.baidu.com/s/1pUCCPstPnlGDCljtBVUsXQ 密碼:b2xc
更多資料: 2020 年 精選阿裡 Java、架構、微服務精選資料等,加 v ❤ :qwerdd111

轉載,請保留原文地址,謝謝 ~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 以下只是其中一種方法: .figure { height: 1400px; width: calc(100% - 200px); background: white; float: left; } .figure_side { height: 1400px; width: 200px; backgr ...
  • 以下只是其中一種方法: .left { height: 1600px; width: 300px; background: rgb(235,235,235); float: left; } .middle { height: 1600px; background: skyblue; margin-l ...
  • 登高遠眺 滄海拾遺,積跬步以至千里 基礎技術 StackOverFlow 2020 年開發者報告 技術問答社區 StackOverFlow 的年度報告,本次報告統計了來自於全球各地共 65000 名開發者。有幾項數據令人震驚: 2020 年 jQuery 仍然是最受歡迎的 Web 開發者框架; Ru ...
  • 一、Overview Angular 入坑記錄的筆記第六篇,介紹 Angular 路由模塊中關於路由守衛的相關知識點,瞭解常用到的路由守衛介面,知道如何通過實現路由守衛介面來實現特定的功能需求,以及實現對於特性模塊的惰性載入 對應官方文檔地址: 路由與導航 配套代碼地址:angular-practi ...
  • 理解面向對象編程及面向對象編程語言的關鍵就是理解其四大特性:封裝、抽象、繼承、多態。不過,對於這四大特性,光知道它們的定義是不夠的,我們還要知道每個特性存在的意義和目的,以及它們能解決哪些編程問題 ...
  • Microsoft在2015年4月30日Build 開發者大會上正式宣佈了 Visual Studio Code 項目:一個運行於 Mac OS X、Windows和 Linux 之上的,針對於編寫現代 Web 和雲應用的跨平臺源代碼編輯器。現在的很多程式員也在利用VScode進行開發。接下來介紹如 ...
  • Java生鮮電商平臺-微服務生鮮電商系統設計(小程式/APP) 說明:本文章主要是講解-微服務生鮮電商系統設計與架構,希望對大家有所幫助 在實際業務場景中如何設計一套電商系統呢? 我們簡單想象一下,既然是一個電商系統,有用戶去購買,就肯定得有一個用戶模塊,購買什麼東西總不是西北風吧,購買肯定是商品吧 ...
  • 見到女朋友每次修改代碼都傻乎乎的重啟伺服器~~~你累不累,氣的我上去給了她一巴掌~~~。什麼時候了熱部署都不會,上教程!!! 1、idea設置自動編譯(設置在哪我就不說了) 2、ctrl+shift+alt+/,然後進去regist enter之後,找到這三個配置項,配置運行自動編譯和延遲更新毫秒數 ...
一周排行
    -Advertisement-
    Play Games
  • C#TMS系統代碼-基礎頁面BaseCity學習 本人純新手,剛進公司跟領導報道,我說我是java全棧,他問我會不會C#,我說大學學過,他說這個TMS系統就給你來管了。外包已經把代碼給我了,這幾天先把增刪改查的代碼背一下,說不定後面就要趕鴨子上架了 Service頁面 //using => impo ...
  • 委托與事件 委托 委托的定義 委托是C#中的一種類型,用於存儲對方法的引用。它允許將方法作為參數傳遞給其他方法,實現回調、事件處理和動態調用等功能。通俗來講,就是委托包含方法的記憶體地址,方法匹配與委托相同的簽名,因此通過使用正確的參數類型來調用方法。 委托的特性 引用方法:委托允許存儲對方法的引用, ...
  • 前言 這幾天閑來沒事看看ABP vNext的文檔和源碼,關於關於依賴註入(屬性註入)這塊兒產生了興趣。 我們都知道。Volo.ABP 依賴註入容器使用了第三方組件Autofac實現的。有三種註入方式,構造函數註入和方法註入和屬性註入。 ABP的屬性註入原則參考如下: 這時候我就開始疑惑了,因為我知道 ...
  • C#TMS系統代碼-業務頁面ShippingNotice學習 學一個業務頁面,ok,領導開完會就被裁掉了,很突然啊,他收拾東西的時候我還以為他要旅游提前請假了,還在尋思為什麼回家連自己買的幾箱飲料都要叫跑腿帶走,怕被偷嗎?還好我在他開會之前拿了兩瓶芬達 感覺感覺前面的BaseCity差不太多,這邊的 ...
  • 概述:在C#中,通過`Expression`類、`AndAlso`和`OrElse`方法可組合兩個`Expression<Func<T, bool>>`,實現多條件動態查詢。通過創建表達式樹,可輕鬆構建複雜的查詢條件。 在C#中,可以使用AndAlso和OrElse方法組合兩個Expression< ...
  • 閑來無聊在我的Biwen.QuickApi中實現一下極簡的事件匯流排,其實代碼還是蠻簡單的,對於初學者可能有些幫助 就貼出來,有什麼不足的地方也歡迎板磚交流~ 首先定義一個事件約定的空介面 public interface IEvent{} 然後定義事件訂閱者介面 public interface I ...
  • 1. 案例 成某三甲醫預約系統, 該項目在2024年初進行上線測試,在正常運行了兩天後,業務系統報錯:The connection pool has been exhausted, either raise MaxPoolSize (currently 800) or Timeout (curren ...
  • 背景 我們有些工具在 Web 版中已經有了很好的實踐,而在 WPF 中重新開發也是一種費時費力的操作,那麼直接集成則是最省事省力的方法了。 思路解釋 為什麼要使用 WPF?莫問為什麼,老 C# 開發的堅持,另外因為 Windows 上已經裝了 Webview2/edge 整體打包比 electron ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...