Ribbon實戰

一、前置知識

1.1 負載均衡定義

負載均衡指的是將網絡請求通過不同的算法分配到不同的服務器上的技術,從而提升系統的性能。

1.2 負載均衡工具

負載均衡工具可以分分為客戶端負載均衡工具和服務端負載均衡工具,它們的區別如下。

表1-1 負載均衡工具分類[1]

?維度??客戶端負載均衡工具??服務端負載均衡工具?
?決策位置?客戶端代碼中實現中間層(如Nginx、負載均衡器)
?靈活性?高(支持自定義算法,如業務哈希)較低(依賴中間層配置)
?性能開銷?客戶端需計算實例選擇,可能增加延遲額外網絡跳轉,可能成為瓶頸
?容錯性?客戶端需處理重試/降級中間層自動剔除故障節點
?服務發現?強依賴注冊中心(如Eureka)可靜態配置或動態集成
?適用協議?HTTP、gRPC、RPCHTTP、TCP、UDP
1.3 負載均衡算法

表1-2 負載均衡算法[2]

?算法??工作原理??適用場景??優點??缺點?
?輪詢(Round Robin)??按順序依次分配請求(如A->B->C->A->B)服務器性能相近、無狀態服務(如靜態資源)簡單公平,易于實現忽略服務器負載差異,性能不均時效率低
?加權輪詢(Weighted RR)??根據服務器性能分配權重(如5:3:2),高權重服務器獲得更多請求服務器性能差異明顯(如新舊硬件混合)按能力分配資源,優化利用率需手動配置權重,無法動態響應負載變化
?最少連接(Least Connections)??優先選擇當前連接數最少的服務器長連接服務(數據庫、視頻流)動態適應負載,避免服務器過載忽略服務器處理能力差異
?加權最少連接(Weighted LC)??結合服務器權重和當前連接數,選擇(連接數/權重)最小的服務器高性能異構集群(如混合云環境)兼顧性能與實時負載,資源利用率高算法復雜,需實時監控服務器狀態
?源IP哈希(IP Hash)??根據客戶端IP計算哈希值,固定分配到同一服務器需會話保持的應用(如購物車、登錄狀態)保證會話一致性服務器故障時關聯用戶受影響
?隨機(Random)??完全隨機分配請求測試環境或簡單負載場景實現簡單,無狀態依賴分配不可控,可能造成負載不均
?最快響應時間(Fastest Response)??選擇響應時間最短的服務器對延遲敏感的應用(如金融交易)提升用戶體驗需持續監控服務器響應時間
?一致性哈希(Consistent Hashing)??哈希環映射請求,服務器擴容/縮容時僅影響少量請求分布式緩存(Redis集群)減少節點變動的影響實現復雜度較高
?動態性能分配(Dynamic Ratio)??根據CPU、內存等實時指標動態調整流量分配服務器性能波動大的場景精準匹配當前負載需高性能監控系統支持

二、Ribbon實戰

2.1 項目結構

本項目使用Eureka作為注冊中心,使用方法參見:Ereka實戰。

圖2-1 項目結構?

服務列表如下。其中SpringCloudEurekaProductApplication02和SpringCloudEurekaProductApplication為product服務的實例,創建步驟見:IDEA中一個服務創建多個實例。

圖2-2 服務實例?

2.2 order模塊新建以下代碼

創建RestTemplate對象,并添加@LoadBalanced注解開啟負載均衡。

@Configuration
public class LoadBalanceConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
}

創建控制器訪問product服務。

@RestController
@RequestMapping("/loadBalance")
public class LoadBalanceController {@Autowiredprivate RestTemplate restTemplate;@RequestMapping("/test")public String test(){String url = String.format("http://%s/loadTest", "spring-cloud-eureka-product");ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class);return forEntity.getBody();}
}
2.2 product模塊新建代碼
@RequestMapping
@RestController
public class LoadBalanceController {// order在配置文件中設置@Value("${order}")private Integer order;@RequestMapping("/loadTest")public String loadTest(){return "服務器:" + order;}
}
2.3 運行

分別啟動server、product、product02、order服務,啟動成功后,訪問注冊中http://localhost:8080/,結果如下圖所示。

圖2-3 注冊中心?

訪問兩次http://localhost:9003/loadTest,分別得到以下結果。后面的數字是兩個product服務激活的配置文件中配置的order的值,分別為1和2。

圖2-4 訪問結果?

三、總結

核心點就是創建RestTemplate,然后添加@LoadBalance注解,使用RestTemplate對象方法時自動實現負載均衡。

參考

[1][2] 騰訊元寶

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/914492.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/914492.shtml
英文地址,請注明出處:http://en.pswp.cn/news/914492.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

cs285學習筆記(一):課程總覽

根據 Fall 2023 學期的官方課程日程&#xff0c;這里是 CS?285 全課程的 Lecture 大綱及內容摘要&#xff0c;詳細對應周次和主題&#xff0c;方便你快速定位每節課要點、相關作業與視頻資源 &#x1f3af; 官方課程地址 YouTobe 視頻地址 blibli視頻(帶中文字幕) &#x…

OkHttp SSE 完整總結(最終版)

1. SSE 基礎概念 什么是 SSE&#xff1f; SSE&#xff08;Server-Sent Events&#xff09;是一種 Web 標準&#xff0c;允許服務器向客戶端推送實時數據。 核心特點 單向通信&#xff1a;服務器 → 客戶端 基于 HTTP 協議&#xff1a;使用 GET 請求 長連接&#xff1a;連…

聚寬sql數據庫傳遞

自建數據庫從聚寬到Q-MT自動化交易實戰 從接觸聚寬以來一直都是手動跟單&#xff0c;在網上看到許多大佬的自動交易文章&#xff0c;心里也不禁十分癢癢。百說不如一練&#xff0c;千講不如實干。經過一番努力&#xff0c;終于成功實盤了&#xff0c;效果還可以&#xff0c;幾…

es里為什么node和shard不是一對一的關系

提問&#xff1a; 既然多個shard會被分配到同一個node上&#xff0c;那么為什么不把多個shard合并成一個然后存在當前node上呢&#xff0c;簡而言之也就是讓node和shard形成一對一的關系呢 &#xff1f;非常好的問題&#xff0c;這正是理解Elasticsearch分片&#xff08;shard…

淺談npm,cnpm,pnpm,npx,nvm,yarn之間的區別

首先做一個基本的分類 名稱描述npm,cnpm,yarn,pnpm都是Javascript包管理器nvm是Node.js版本控制器npx命令行工具 I.npm,cnpm,yarn,pnpm npm (Node Package Manager) npm是Node.js默認的包管理器&#xff0c;隨Node.js的安裝會一起安裝。使用npm可以安裝&#xff0c;發布&…

滑動窗口-76.最小覆蓋子串-力扣(LeetCode)

一、題目解析1.不符合要求則返回空串("")2.子串中重復字符的數量要不少于t中該字符的數量二、算法原理解法1&#xff1a;暴力枚舉哈希表這里的暴力枚舉也可以優化&#xff0c;即在包含t中元素處枚舉&#xff0c;如在A、B和C處開始枚舉&#xff0c;減少不必要的枚舉 解…

從零構建搜索引擎 build demo search engine from scratch

從零構建搜索引擎 build demo search engine from scratch 我們每天都會使用搜索引擎&#xff1a;打開google等搜索引擎&#xff0c;輸入關鍵詞&#xff0c;檢索出結果&#xff0c;這是一次搜索&#xff1b;當打開歷史記錄旁邊的&#x1f50d;按鈕&#xff0c;輸入關鍵詞&#…

pytorch小記(二十九):深入解析 PyTorch 中的 `torch.clip`(及其別名 `torch.clamp`)

pytorch小記&#xff08;二十九&#xff09;&#xff1a;深入解析 PyTorch 中的 torch.clip&#xff08;及其別名 torch.clamp&#xff09;深入解析 PyTorch 中的 torch.clip&#xff08;及其別名 torch.clamp&#xff09;一、函數簽名二、簡單示例三、廣播支持四、與 Autograd…

快速分頁wpf

/*沒有在xaml設置上下文window.context是因為 命名空間一直對應不上 所以在xaml.cs 里面綁定*/ <Window x:Class"DataGrid.views.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft…

如何徹底禁用 Chrome 自動更新

如何徹底禁用 Chrome 自動更新 隨著谷歌將 Chrome 瀏覽器版本升級至 138&#xff0c;它即將徹底拋棄對 Manifest V2 擴展的支持。許多用戶希望將瀏覽器版本鎖定在 138&#xff0c;以繼續使用 uBlock Origin、Tampermonkey 等常用擴展。 本文總結了四種有效方法&#xff0c;幫助…

流批一體的“奧卡姆剃刀”:Apache Cloudberry 增量物化視圖應用解析

引言&#xff1a;流批一體&#xff0c;理想與現實的鴻溝 在數據驅動的今天&#xff0c;“實時”二字仿佛擁有魔力&#xff0c;驅使著無數企業投身于流批一體架構的建設浪潮中。我們渴望實時洞察業務變化&#xff0c;實時響應用戶需求。以 Apache Flink 為代表的流處理引擎&…

C# 入門教程(三):詳解字段、屬性、索引器及各類參數與擴展方法

文章目錄一、字段、屬性、索引器、常量1.字段2.屬性2.1 什么是屬性2.2 屬性的聲明2.3 屬性與字段的關系3 索引器4. 常量二、傳值 輸出 引用 數組 具名 可選參數&#xff0c;擴展方法2.1 傳值參數2.1.1 值類型 傳參2.1.2 引用類型 傳參2.2 引用參數2.2.1 引用參數-值類型 傳參2.…

《美術教育研究》是什么級別的期刊?是正規期刊嗎?能評職稱嗎?

?問題解答&#xff1a;問&#xff1a;《美術教育研究》是不是核心期刊&#xff1f;答&#xff1a;不是&#xff0c;是知網收錄的第一批認定學術期刊。問&#xff1a;《美術教育研究》級別&#xff1f;答&#xff1a;省級。主管單位&#xff1a; 安徽出版集團有限責任公司 主辦…

每日算法刷題Day47:7.13:leetcode 復習完滑動窗口一章,用時2h30min

思考: 遇到子數組/子字符串可以考慮能不能用滑動窗口&#xff0c; 定長:逆向思維,答案不定 最大長度/最小長度:一般求長度 越長越合法/越短越合法/恰好:一般求數量 主要思考窗口條件成立&#xff0c; 判斷條件是符合窗口條件(最小長度/越長越合法還是不符合(最大長度/越短越合法…

電流驅動和電壓驅動的區別

理解電流驅動和電壓驅動的區別對電路設計至關重要&#xff0c;尤其在高速、高抗噪要求的場景&#xff08;如LVDS&#xff09;。以下是兩者的核心對比&#xff1a;一、電壓驅動 (Voltage Drive) 核心原理&#xff1a; 驅動器輸出一個受控的電壓&#xff08;與負載阻抗無關&#…

宿舍電費查詢——以ZUA為例

宿舍電費查詢——以ZUA為例0. 安裝抓包環境手機端桌面端1. 登錄1.1 開啟抓包后進入繳費頁面&#xff1a;1.2 分析請求1.3 編寫登錄代碼2. 獲取樓棟及房間ID2.1 獲取樓棟ID2.2 編寫獲取樓棟ID代碼2.3 獲取房間ID2.4 編寫獲取房間ID代碼3. 獲取剩余電費&#xff1a;3.1 選擇房間號…

vue中計算屬性的介紹

Vue.js 中的計算屬性是基于它的響應式系統來實現的&#xff0c;它可以根據 Vue 實例的數據狀態來動態計算出新的屬性值。在 Vue 組件中&#xff0c;計算屬性常用于對數據進行處理和轉換&#xff0c;以及動態生成一些需要的數據。一、使用方式1.定義計算屬性&#xff1a; 在Vue組…

MFC UI控件CheckBox從專家到小白

文章目錄CheckBox勾選框控件控件與變量綁定控件點擊消息映射互斥CheckBox勾選框控件 控件與變量綁定 方案一&#xff1a; BOOL m_bEnable1; BOOL m_bEnable2; void A::DoDataExchange(CDataExchange* pDX) {DDX_Check(pDX, IDC_CK_1, m_bEnable1);DDX_Check(pDX, IDC_CK_2, …

阿爾卡特ACT 250 ATP 150 AND ATP 400 分子泵控制器TURBOMOLECULAR PUMP CONTROLLER ALCATEL

阿爾卡特ACT 250 ATP 150 AND ATP 400 分子泵控制器TURBOMOLECULAR PUMP CONTROLLER ALCATEL

python的小學課外綜合管理系統

前端開發框架:vue.js 數據庫 mysql 版本不限 后端語言框架支持&#xff1a; 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 數據庫工具&#xff1a;Navicat/SQLyog等都可以 摘要 隨著…