SpringCloud_Ribbon負載均衡

概述

SpringCloud底層其實是利用了一個名為Ribbon的組件,來實現負載均衡功能的。
在這里插入圖片描述

源碼

LoadBalancerInterceptor

其中含有intercept方法,攔截用戶的HttpRequest請求:

  1. request.getURI()
    獲取請求uri,即http://userservice/user/

  2. originalUri.getHost()
    獲取uir路徑的主機名,即服務id:userservice

  3. this.loadBalancer.execute()
    處理服務id和用戶請求
    其中loadBalancer類型為LoadBalancerClient,如下

LoadBalancerClient

execute()

  • getLoadBalancer(serviceId):根據服務id獲取ILoadBalancer(負載均衡器),該ILoadBalancer會用serviceId去eureka獲取服務列表并保存
  • getServer(loadBalancer):利用內置的負載均衡算法,從服務列表中選擇一個
  • 隨后再訪問并跟蹤,就能獲得對應的 ip:port

IRule負載均衡策略

上述類中使用getServer進行負載均衡,該方法中實際上調用了ILoadBalancer(負載均衡器)的chooseServer方法,而該方法中則又調用了IRule.choose()方法;IRule類的默認新建對象是RoundRobinRule,即輪詢

總結

在這里插入圖片描述
基本流程如下:

  • 攔截我們的RestTemplate請求http://userservice/user/1
  • RibbonLoadBalancerClient會從請求url中獲取服務名稱,也就是user-service
  • DynamicServerListLoadBalancer根據user-service到eureka拉取服務列表
  • eureka返回列表,localhost:8081、localhost:8082
  • IRule利用內置負載均衡規則,從列表中選擇一個,例如localhost:8081
  • RibbonLoadBalancerClient修改請求地址,用localhost:8081替代userservice,得到http://localhost:8081/user/1,發起真實請求

負載均衡策略

Ribbon中自帶的負載均衡策略

負載均衡的規則定義在IRule接口中,IRule又有不同的實現類,實現不同的負載均衡策略

內置負載均衡規則類規則描述
RoundRobinRule簡單輪詢服務列表來選擇服務器。它是Ribbon默認的負載均衡規則
AvailabilityFilteringRule對以下兩種服務器進行忽略: (1)在默認情況下,這臺服務器如果3次連接失敗,這臺服務器就會被設置為“短路”狀態。短路狀態將持續30秒,如果再次連接失敗,短路的持續時間就會幾何級地增加。 (2)并發數過高的服務器。如果一個服務器的并發連接數過高,配置了AvailabilityFilteringRule規則的客戶端也會將其忽略。并發連接數的上限,可以由客戶端的..ActiveConnectionsLimit屬性進行配置。
WeightedResponseTimeRule為每一個服務器賦予一個權重值。服務器響應時間越長,這個服務器的權重就越小。這個規則會隨機選擇服務器,這個權重值會影響服務器的選擇。
ZoneAvoidanceRule以區域可用的服務器為基礎進行服務器的選擇。使用Zone對服務器進行分類,這個Zone可以理解為一個機房、一個機架等。而后再對Zone內的多個服務做輪詢。
BestAvailableRule忽略那些短路的服務器,并選擇并發數較低的服務器。
RandomRule隨機選擇一個可用的服務器。
RetryRule重試機制的選擇邏輯

默認的實現就是ZoneAvoidanceRule,是一種輪詢方案

自定義負載均衡策略

在服務消費者的啟動類中定義新的IRule

@Bean
public IRule randomRule(){return new RandomRule();
}

并在對應service模塊的application.yml中添加新的配置

# 給某個微服務配置負載均衡規則,這里是userservice服務
userservice: ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 負載均衡規則 

注意,一般用默認的負載均衡規則,不做修改。

饑餓加載

Ribbon默認采用懶加載,即第一次訪問時才會去創建LoadBalancerClient,請求時間比較長
饑餓加載會在項目啟動時創建,降低第一次訪問的耗時
開啟饑餓加載:

ribbon:eager-load:enabled: trueclients: userservice

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

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

相關文章

3D Gaussian Splatting代碼中的Gaussian_Module和Cameras兩個類的代碼解讀

Gaussian_model 討論Gaussian_model這個類,是因為里面包含了三維高斯分布的基本信息,里面定義了各種參量的構建方式、用于優化學習的激活函數、學習率設置方法和高斯點優化過程中的增加與刪除方式及對應優化器的處理方法。這個類定義在scene文件夾中的g…

反激開關電源反饋電路相關參數選型

Vb的電壓正常變化范圍是:0-1V(最低0V,由于有穩壓管,最高不會超過1V) Vb的電壓越高,則輸出占空比越大,Vb電壓越低,則輸出占空比越小 那么Va的正常變化范圍應該是:1.4-4.…

怎么配置electron-builder

electron-builder 是一個用于 Electron 應用程序打包和發布的工具,它支持 macOS、Windows 和 Linux 平臺。以下是一個清晰且詳細的 electron-builder 配置指南,包括分點表示和歸納,并參考了相關文章中的信息。 一、安裝 electron-builder 首先,你需要在你的 Electron 項目…

云卓SKYDROID-H30——科技改變未來

云卓H30采用高通處理器、搭載安卓嵌入式系統,擁有三個工作頻率,讓圖像更清晰、延遲更低、距離遠、抗干擾性強,支持多種接口,更有10.1寸高清工業級陽光可視屏,防塵耐磨,結構強度高,適用于各種嚴苛…

Python和tkinter單詞游戲

Python和tkinter單詞游戲 數據字典文本文件,文件名為Dictionary.txt,保存編碼格式為:utf-8。文本內容:每行一個 單詞 ,單詞和解釋用空格分隔,如 a art.一(個);每一(個) ability n.能力&#…

springboot實驗報告管理系統-計算機畢業設計源碼10596

目錄 1 緒論 1.1 選題背景與意義 1.2國內外研究現狀 1.3論文結構與章節安排 2系統分析 2.1 可行性分析 2.2 系統流程分析 2.2.1系統開發流程 2.2.2 用戶登錄流程 2.2.3 系統操作流程 2.2.4 添加信息流程 2.2.5 修改信息流程 2.2.6 刪除信息流程 2.3 系統功能分析 …

HarmonyOS Next開發學習手冊——單選框 (Radio)

Radio是單選框組件,通常用于提供相應的用戶交互選擇項,同一組的Radio中只有一個可以被選中。具體用法請參考 Radio 。 創建單選框 Radio通過調用接口來創建,接口調用形式如下: Radio(options: {value: string, group: string})…

高考不是終點:如何利用教育資源實現人生躍遷?普魯士教育的利弊,你了解嗎?從科舉到高考,中國教育的變遷!鏈接上層,獲取核心資源的途徑

高考已經結束,這兩天分數將會陸續出來,無論結果好壞,我都希望你明白一些道理。這些道理在學校老師不會教你,但是非常重要。 一、中國的科舉制度 科舉制度是為王朝服務的。 科舉制度是中國古代通過考試選拔官員的制度&#xff0c…

C++類型轉換可調用對象

目錄 C的四種可視性類型轉換 1.static_cast 2.reinterpret_cast 3.const_cast 4.dynamic_cast C中的可調用對象 普通函數 函數指針 仿函數 Lambda表達式 包裝器function bind C的四種可視性類型轉換 C語言中的類型轉換是不安全、不明確的,于是C就出了更…

MQTT QoS 0, 1, 2

目錄 # 開篇 1. 精細MQS TT QoS的行為 1.1 QoS 0: 最多交付一次(At Most Once) 1.2 QoS 1: 至少交付一次(At Least Once) 1.3 QoS 2: 只交付一次(Exactly Once) 1.4 傳輸過程圖示 1.5 總結 2. MQTT…

HTTP協議頭中X-Forwarded-For是能做什么?

X-Forwarded-For和相關幾個頭部的理解 $remote_addr 是nginx與客戶端進行TCP連接過程中,獲得的客戶端真實地址. Remote Address 無法偽造,因為建立 TCP 連接需要三次握手,如果偽造了源 IP,無法建立 TCP 連接,更不會有后…

javascript 的 屬性、方法、事件

使用 javascript 設計一個學生類、(屬性:ID、姓名、性別,方法:學習、休息、,事件:上學、放學、上課、下課)學校有定時器每1秒鐘觸發一次時鐘事件,每節課45分鐘,課間15分鐘 var Stud…

13. Lammps入門in文件簡介-1

來源: “碼農不會寫詩”公眾號 鏈接:Lammps入門in文件簡介-1 文章目錄 01 in文件簡介02 in文件命令解析規則 書回正文 Lammps通過一次一行地從輸入腳本(文本文件,通常稱in文件)中讀取命令來執行計算,當輸入…

7-1作業

1.實驗目的:完成字符收發 led.h #ifndef __GPIO_H__ #define __GPIO_H__#include "stm32mp1xx_rcc.h" #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_uart.h"//RCC,GPIO,UART初始化 void init();//字符數據發送 void set_tt…

Web端登錄頁和注冊頁源碼

前言&#xff1a;登錄頁面是前端開發中最常見的頁面&#xff0c;下面是登錄頁面效果圖和源代碼&#xff0c;CV大法直接拿走。 1、登錄頁面 源代碼&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>登錄</ti…

Django 和 Django REST framework 創建對外 API

1. 環境準備 確保你已經安裝了 Python 和 Django。如果尚未安裝 Django REST framework&#xff0c;通過 pip 安裝它&#xff1a; pip install djangorestframework 2. 創建 Django 項目 如果你還沒有 Django 項目&#xff0c;可以通過以下命令創建&#xff1a; django-ad…

每日復盤-20240701

今日關注&#xff1a; 20240701 六日漲幅最大: ------1--------301182--------- 凱旺科技 五日漲幅最大: ------1--------300977--------- 深圳瑞捷 四日漲幅最大: ------1--------300977--------- 深圳瑞捷 三日漲幅最大: ------1--------300461--------- 田中精機 二日漲幅最…

Lua實現鏈表(面向對象應用)

Lua實現面向對象 面向對象核心三要素Lua面向對象大致原理面向對象示例繼承與多態示例 面向對象核心三要素 1.封裝&#xff1a;對一個事物的抽象為一些屬性和行為動作的集合&#xff0c;封裝將屬性和行為動作&#xff08;操作數據的方法&#xff09;綁定在一起&#xff0c;并隱藏…

快錢支付股東全部股權已被質押!

根據近期工商信息&#xff0c;第三方支付機構快錢支付清算信息有限公司&#xff08;簡稱“快錢支付”&#xff09;實際控股方快錢金融服務&#xff08;上海&#xff09;有限公司&#xff08;簡稱“快錢金融”&#xff09;&#xff0c;作為出質股權標的企業&#xff0c;被出質給…

【SGX系列教程】(三)Intel-SGX 官方示例分析(SampleCode)——SampleEnclave

文章目錄 一. 引言二. README2.1 項目目的2.2 構建和執行示例代碼的步驟2.3 配置參數解釋2.4 配置文件分析2.5 啟動令牌初始化 三. 重點代碼分析3.1 App文件夾3.1.1 App/App.cpp3.1.2 App/Edger8rSyntax文件夾3.1.2.1 App/Edger8rSyntax/Arrays.cpp3.1.2.2 App/Edger8rSyntax/F…