Spring Cloud Alibaba之負載均衡組件Ribbon

一、什么是負載均衡?

(1)概念:

在基于微服務架構開發的系統里,為了能夠提升系統應對高并發的能力,開發人員通常會把具有相同業務功能的模塊同時部署到多臺的服務器中,并把訪問業務功能的請求均攤到這些服務器上,這種將請求均攤的做法便叫做負載均衡。

(2)負載均衡分為硬件負載均衡和軟件負載均衡兩種:

  • 硬件負載均衡的解決方案就是直接在服務器和外部網絡間安裝負載均衡設備,通常這種設備稱為負載均衡器。由專門的設備完成專門的任務,獨立于操作系統,整體性能得到大量提高,加上多樣化的負載均衡策略,智能化的流量統計,可達到最佳的負載均衡效果。
  • 軟件負載均衡的解決方案是指在一臺或多臺服務器相應的操作系統上安裝一個或多個附加軟件來實現負載均衡,如DNS Load Balance,CheckPoint Firewall-1 ConnectControl等,它的優點是基于特定環境,配置簡單,使用靈活,成本低廉,可以滿足一般的負載均衡需求。

那么如何才能實現把訪問業務功能的請求均攤到這些服務器上呢?這里就要用到Ribbon組件了。

二、什么是Ribbon組件?

簡單來說,Ribbon是一個客戶端負載均衡器,提供多種負載均衡策略,以便在客戶端選擇最佳的服務實例。同時也是Spring Cloud Alibaba 體系中負責負載均衡的組件,是一組類庫的集合。

它在Spring Cloud體系中扮演著以下幾個角色:

(1)客戶端負載均衡:

Ribbon在客戶端進行負載均衡,而不是依賴服務器端的負載均衡器。

(2)服務調用:

與Eureka等服務發現組件集成,通過服務名稱來調用不同的服務實例。可以保留服務結點訪問的相關統計信息,這樣可以避免向高延遲或低高故障的節點發送請求。

(3)定制策略:

允許用戶定制負載均衡策略,如隨機策略、輪詢策略等。系統便會根據指定的負載均衡算法,從多個服務節點中選取一個結點出來發送請求得到對應的服務。

三、Ribbon的工作原理:

使用Ribbon實現負載均衡時,基本用法是注入一個RestTemplate,并使用@LoadBalanced注解標注RestTemplate,從而使RestTemplate具備負載均衡的能力。

  • 當Spring容器啟動時,使用@LoadBalanced注解修飾的RestTemplate會被添加攔截器,攔截器中使用了LoadBalancerClient處理請求,從而達到負載均衡的目的。
  • LoadBalancerClient是Spring Cloud提供的一個非常重要的接口,它繼承ServiceInstanceChooser接口,該接口的實現類是RibbonLoadBalanceClient,它們之間的關系如下圖所示。

  • LoadBalancerClient提供的兩個execute()方法用于執行請求, reconstructURI()方法用于重構URL。
  • RibbonLoadBalanceClient是LoadBalancerClient的實現類,它用來執行最終的負載均衡請求。其中,RibbonLoadBalanceClient的一個choose()方法用于選擇具體的服務實例,其內部是通過getServer()方法交給ILoadBalancer完成的。
  • ILoadBalancer是一個接口,該接口定義了一系列實現負載均衡的方法。ILoadBalancer接口的實現類結果如下圖所示。

?默認情況下,Ribbon使用的負載均衡策略是輪詢,實際上,Ribbon提供了很多負載均衡算法,其中IRule接口就是所有負載均衡算法的父接口。

四、Ribbon在處理負載均衡時的核心組件:

(1)IRule:定義負載均衡規則的接口,不同的實現類提供不同的負載均衡策略。

(2)IPing:用于定期檢查服務實例的健康狀況,確保請求不會發送到不可用的實例。

(3)ServerList:維護可用服務實例的列表,可以從服務注冊中心(如Eureka)動態獲取。

(4)ServerListFilter:用于過濾服務實例列表,確保負載均衡器僅考慮健康和可用的實例。

(5)ILoadBalancer:管理服務實例列表,并根據負載均衡規則選擇一個實例來處理請求。

五、Ribbon負載均衡策略:

  1. Round Robin Rule(輪詢策略)按順序循環選擇每個服務實例,均衡地分配請求。實現了按照線性輪詢的方式依次選擇服務的功能。
  2. Weighted Response Time Rule(權重響應時間策略): 根據每個實例的響應時間和權重進行分配,響應時間越快,服務權重越大,被選中的概率越高,獲得的請求也會越多。
  3. Availability Filtering Rule(可用性過濾策略): 簡單來說就是,過濾掉不可用的或并發請求超過閾值的實例,選擇健康的實例。使用Availability Predicate過濾由于多次訪問故障而處于斷路器跳閘狀態的服務,還有并發的連接數超過閥值的服務,然后對剩余的服務列表進行輪詢。
  4. Random Rule(隨機策略)該策略實現了從服務清單中隨機選擇一個服務的功能。
  5. Least Concurrent Connections(最少并發策略)選擇當前并發請求最少的實例,減輕高負載實例的壓力。

  6. Best Available Rule(最佳可用策略)用于先過濾掉多次訪問故障而處于斷路跳閘狀態的服務,然后選擇一個并發量最小的服務。
  7. Client Config Enable Round Robin Rule(客戶端配置啟用輪詢策略):該類是一個抽象類,該類本身沒有實現什么特殊的處理邏輯,我們也不會直接使用該策略,但是通過BestAvailableRule和繼承該策略默認實現了線性輪詢,它的內部定義了一個RoundRobinRule策略,
  8. Zone Avoidance Rule(區域感知策略):它是PredicateBasedRule的具體實現類,其內部通過使用ZoneAvoidancePredicate和AvailabilityPredicate判斷是否選擇某一個服務,前者用于判斷服務所在區域的性能是否可用,后者用于過濾掉連接數過多的服務。
  9. Predicate Based Rule:繼承了ClientConfigEnableRoundRobinRule,其內部會先通過chooseRoundRobinAfterFiltering()方法篩選服務清單,然后以線性輪詢的方式從過濾后的服務清單中選擇一個服務。

六、實練操作:

Ribbon實現負載均衡:

(1)創建名為ServiceProvider1的服務項目:

  • 添加依賴到pom文件.
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>
</dependencies>
  • 在resources目錄編寫application.properties配置文件.
nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=ServiceProvider
server.port=1111
  • 編寫啟動類,加入注解,說明本項目所包含的服務方法是需要注冊到Nacos注冊中心.
@EnableDiscoveryClient
@SpringBootApplication
public class SpringBootApp {public static void main(String[] args) {SpringApplication.run(SpringBootApp.class, args);}
}
  • 編寫Controller.java控制類,編寫對外提供服務方法.
@RestController
public class Controller {@RequestMapping("/callServiceByRibbon")public String callServiceByRibbon(){return "return in Service1.";}
}

(2)創建名為ServiceProvider2的服務項目:

  • 修改pom文件.
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>
</dependencies>
  • 修改application.properties配置文件.
nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=ServiceProvider
server.port=2222
  • 修改控制類的方法.
@RestController
public class Controller {@RequestMapping("/callServiceByRibbon")public String callServiceByRibbon(){return "return in Service2.";}
}

(3)創建名為ServiceWithRibbon的maven項目:

  • 添加依賴到pom文件.
 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId></dependency>
</dependencies>
  • 在啟動類添加注解.
@EnableDiscoveryClient
@SpringBootApplication
public class SpringBootApp {public static void main(String[] args) {SpringApplication.run(SpringBootApp.class, args);}@LoadBalanced@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}}
  • 修改配置文件.
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
server.port=8080
spring.application.name=ServiceWithRibbon
ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RoundRibbonRule
  • 編寫controller控制類.
@RestController
public class Controller {@Resourceprivate RestTemplate restTemplate;@RequestMapping("/callFuncByRibbon")public String callFuncByRibbon(){return restTemplate.getForObject("http://ServiceProvider/callServiceByRibbon", String.class);}
}

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

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

相關文章

談談WebComponents | 前端開發

一、 源起 讓我們以一個例子開始。 假設我們要做一個環形進度條&#xff0c;它可以&#xff1a; 1、根據進度數值的不同&#xff0c;計算出百分比&#xff0c;以渲染對應的角度值。 2、根據設置的進度不同&#xff0c;我們用不同的顏色加以區分。 3、在環的中間我們以動畫遞增的…

小程序、APP對接廣告聯盟進行廣告變現有什么區別?

小程序VS APP對接廣告聯盟有什么區別&#xff1f; 開發完成的小程序對接廣告聯盟廣告變現&#xff0c;開發完成的APP對接廣告聯盟有什么區別&#xff1f; 首先小程序對接廣告聯盟&#xff0c;無論是微信小程序還是抖音小程序都只支持對接單一的廣告聯盟接入。抖音小程序只支持…

【監控】監控平臺部署 Prometheus+Grafana

在 macOS 上部署 Grafana 和 Prometheus 來監控 Java 服務是一個非常實用的操作。以下是詳細的步驟&#xff0c;包括如何安裝和配置 Prometheus、Grafana 以及在 Java 服務中集成 Prometheus 的客戶端庫來收集指標數據。 1. 安裝 Prometheus 1.1 使用 Homebrew 安裝 Promethe…

簡單分享項目內如何快速自動生成自己的庫和更新 requirements.txt

當開發Python項目時&#xff0c;requirements.txt文件被用來清單所有所需的Python包及其版本。這個文件對于在不同環境中安裝和管理項目依賴特別方便&#xff0c;無論是在生產環境、開發環境或者CI/CD流程中。 要自動創建和更新requirements.txt文件&#xff0c;有幾種常見的方…

深入剖析 @Autowired 和 @Resource 在 Spring 中的區別

在 Spring 框架中&#xff0c;Autowired 和 Resource 是兩個常用的注解&#xff0c;用于實現依賴注入。盡管它們都能達到將依賴對象注入到目標 bean 的目的&#xff0c;但在細節上存在一些顯著的差異。本文將深入探討這兩個注解的區別&#xff0c;并結合 Spring 源碼進行分析&a…

vision mamba

Mamba 成功的關鍵在于采用了 Selective Scan Space State Sequential Model&#xff08;S6 模型&#xff09;。是用于解決自然語言處理&#xff08;NLP&#xff09;任務。與 transformer中注意力機制不同&#xff0c;Mamba的S6 將 1D 向量中的每個元素&#xff08;例如文本序列…

現代信息檢索筆記(二)——布爾檢索

目錄 信息檢索概述 IR vs數據庫: 結構化vs 非結構化數據 結構化數據 非結構化數據 半結構化數據 傳統信息檢索VS現代信息檢索 布爾檢索 倒排索引 一個例子 建立詞項&#xff08;可以是字、詞、短語、一句話&#xff09;-文檔的關聯矩陣。 關聯向量 檢索效果的評價 …

如何在Sklearn Pipeline中運行CatBoost

介紹 CatBoost的一大特點是可以很好的處理類別特征&#xff08;Categorical Features&#xff09;。當我們將其結合到Sklearn的Pipeline中時&#xff0c;會發生如下報錯&#xff1a; _catboost.CatBoostError: data is numpy array of floating point numerical type, it mea…

python-期末代碼復習

import numpy as np import pandas as pd import matplotlib.pyplot as plt import warningswarnings.filterwarnings(actionignore) plt.rcParams[font.sans-serif][SimHei] plt.rcParams[axes.unicode_minus] False你提供的這兩行代碼是Python編程語言中用于設置matplotlib庫…

大淘客api實現多多進寶的商品查詢PHP版

大家好&#xff0c;我是網創有方&#xff0c;今天教大家如何使用大淘客的api實現拼多多商品詳情信息查詢。這里用到的多多進寶&#xff0c;如果沒有多多進寶的&#xff0c;先去多多進寶注冊個賬號吧&#xff01; 第一步&#xff1a;進入大淘客官方創建應用&#xff0c;并且下載…

【PyQt5】一文向您詳細介紹 QLineEdit() 的作用

【PyQt5】一文向您詳細介紹 QLineEdit() 的作用 下滑即可查看博客內容 &#x1f308; 歡迎蒞臨我的個人主頁 &#x1f448;這里是我靜心耕耘深度學習領域、真誠分享知識與智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主簡介&#xff1a;985高校的普通本碩&…

2239. 找到最接近 0 的數字

給你一個長度為 n 的整數數組 nums &#xff0c;請你返回 nums 中最 接近 0 的數字。如果有多個答案&#xff0c;請你返回它們中的 最大值 。 示例 1&#xff1a; 輸入&#xff1a;nums [-4,-2,1,4,8] 輸出&#xff1a;1 解釋&#xff1a; -4 到 0 的距離為 |-4| 4 。 -2 到…

開發一個微信小程序需要用到哪些技術?

開發一個微信小程序需要用到以下幾種技術&#xff1a; 1. 基礎技術 HTML: 用于定義小程序的頁面結構。CSS: 用于頁面的樣式設計。JavaScript: 用于實現頁面的交互功能。 2. 微信小程序專用技術 WXML&#xff08;WeiXin Markup Language&#xff09;: 類似于HTML&#xff0c…

計量校準溫度儀表的常見分類有哪些?

溫度儀表在計量校準中&#xff0c;可以說是比較常見的儀器&#xff0c;而溫度儀器因為用于校準的場景很多&#xff0c;應用的場合不同&#xff0c;也是有著很多不同的分類&#xff0c;今天就簡單為大家介紹一些溫度儀表的細分分類。 溫度儀表根據測溫的方式不同&#xff0c;可以…

2024華為OD機試真題- 電腦病毒感染-(C++/Python)-C卷D卷-200分

2024華為OD機試題庫-(C卷+D卷)-(JAVA、Python、C++) 題目描述 一個局域網內有很多臺電腦,分別標注為 0 ~ N-1 的數字。相連接的電腦距離不一樣,所以感染時間不一樣,感染時間用 t 表示。 其中網絡內一臺電腦被病毒感染,求其感染網絡內所有的電腦最少需要多長時間。如果…

Laravel Activity Log操作日志擴展包

Laravel Activity Log操作日志擴展包 簡介 Laravel Action Logs操作日志記錄Laravel Activity Log 很多數據管理員都想記錄他們用戶的所有活躍記錄。這個包可以很方便的記錄你的用戶何時何地的創建、更新實體的記錄。外加&#xff0c;現在這個包還可以記錄多個版本的實體間數…

【基礎篇】第3章 索引與文檔操作

在Elasticsearch的世界里&#xff0c;索引是存儲數據的地方&#xff0c;文檔則是索引中的基本單位&#xff0c;包含具體的數據信息。本章將深入探討索引和文檔操作的基礎&#xff0c;從創建到管理&#xff0c;為高效數據處理奠定基礎。 3.1 索引概念與創建 3.1.1 索引、類型與…

PyTorch之nn.Module與nn.functional用法區別

文章目錄 1. nn.Module2. nn.functional2.1 基本用法2.2 常用函數 3. nn.Module 與 nn.functional3.1 主要區別3.2 具體樣例&#xff1a;nn.ReLU() 與 F.relu() 參考資料 1. nn.Module 在PyTorch中&#xff0c;nn.Module 類扮演著核心角色&#xff0c;它是構建任何自定義神經網…

【Spring Boot 源碼學習】初識 ConfigurableEnvironment

《Spring Boot 源碼學習系列》 初識 ConfigurableEnvironment 一、引言二、主要內容2.1 Environment2.1.1 配置文件&#xff08;profiles&#xff09;2.1.2 屬性&#xff08;properties&#xff09; 2.2 ConfigurablePropertyResolver2.2.1 屬性類型轉換配置2.2.2 占位符配置2.…

wxss和css有什么區別?

WXSS&#xff08;WeiXin Style Sheets&#xff09;和CSS&#xff08;Cascading Style Sheets&#xff09;在功能和應用上有很多相似之處&#xff0c;但針對微信小程序的特殊需求&#xff0c;WXSS對CSS進行了一些擴展和修改。以下是WXSS和CSS之間的主要區別&#xff1a; 尺寸單…