微服務負載均衡器Ribbon

1.什么是Ribbon
目前主流的負載方案分為以下兩種:
????????集中式負載均衡,在消費者和服務提供方中間使用獨立的代理方式進行負載,有硬件的(比如 F5),也有軟件的(比如 Nginx)。
????????客戶端根據自己的請求情況做負載均衡,Ribbon 就屬于客戶端自己做負載均衡。
????????Spring Cloud Ribbon是基于Netflix Ribbon 實現的一套 客戶端的負載均衡工具, Ribbon客戶端組件提供一系列的完善的配置,如超 時,重試等。通過 Load Balancer 獲取到服務提供的所有機器實例,Ribbon會自動基于某種規則(輪詢,隨機)去調用這些服務。Ribbon也 可以實現我們自己的負載均衡算法。
1.1 客戶端的負載均衡
????????例如spring cloud中的ribbon,客戶端會有一個服務器地址列表,在發送請求前通過負載均衡算法選擇一個服務器,然后進行訪問,這是 客戶端負載均衡;即在客戶端就進行負載均衡算法分配。
1.2 服務端的負載均衡
????????例如Nginx,通過Nginx進行負載均衡,先發送請求,然后通過負載均衡算法,在多個服務器之間選擇一個進行訪問;即在服務器端再進 行負載均衡算法分配。
1.3 常見負載均衡算法
????????隨機,通過隨機選擇服務進行執行,一般這種方式使用較少;
????????輪訓,負載均衡默認實現方式,請求來之后排隊處理;
????????加權輪訓,通過對服務器性能的分型,給高配置,低負載的服務器分配更高的權重,均衡各個服務器的壓力;
????????地址Hash,通過客戶端請求的地址的HASH值取模映射進行服務器調度。 ip --->hash
????????最小鏈接數,即使請求均衡了,壓力不一定會均衡,最小連接數法就是根據服務器的情況,比如請求積壓數等參數,將請求分配到當前壓力最小的服務器上。 最小活躍數
2. Nacos使用Ribbon
nacos-discovery依賴了ribbon,可以不用再引入ribbon依賴
2) 添加 @LoadBalanced 注解
@Configurationpublic class RestConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}}
3) 修改controller
@Autowiredprivate RestTemplate restTemplate;@RequestMapping(value = "/findOrderByUserId/{id}")public R findOrderByUserId(@PathVariable("id") Integer id) {// RestTemplate調用//String url = "http://localhost:8020/order/findOrderByUserId/"+id;//模擬ribbon實現//String url = getUri("mall‐order")+"/order/findOrderByUserId/"+id;
// 添加@LoadBalanced
String url = "http://mall‐order/order/findOrderByUserId/"+id;
R result = restTemplate.getForObject(url,R.class);return result;
}
3 Ribbon負載均衡策略
IRule
這是所有負載均衡策略的父接口, 里邊的核心方法就是 choose 方法,用來選擇一個服務實例
AbstractLoadBalancerRule
AbstractLoadBalancerRule 是一個抽象類,里邊主要定義了一個 ILoadBalancer ,這里定義它的目的主要是 輔助負責均衡策略選取合適的服務端實 例。
RandomRule
看名字就知道,這種負載均衡策略就是 隨機選擇一個服務實例 ,看源碼我們知道,在 RandomRule 的無參構造方法中初始化了一個 Random 對象, 然后在它重寫的choose 方法又調用了 choose(ILoadBalancer lb, Object key) 這個重載的 choose 方法,在這個重載的 choose 方法中,每次利用 random對象生成一個不大于服務實例總數的隨機數,并將該數作為下標所以獲取一個服務實例。
RoundRobinRule
RoundRobinRule 這種負載均衡策略叫做線性 輪詢負載均衡策略 。這個類的 choose(ILoadBalancer lb, Object key) 函數整體邏輯是這樣的:開啟 一個計數器count ,在 while 循環中遍歷服務清單,獲取清單之前先通過 incrementAndGetModulo 方法獲取一個下標,這個下標是一個不斷自增長 的數先加1 然后和服務清單總數取模之后獲取到的(所以這個下標從來不會越界),拿著下標再去服務清單列表中取服務,每次循環計數器都會加
1 ,如果連續 10 次都沒有取到服務,則會報一個警告 No available alive servers after 10 tries from load balancer: XXXX
RetryRule (在輪詢的基礎上進行重試)
看名字就知道這種負載均衡策略帶有 重試 功能。首先 RetryRule 中又定義了一個 subRule ,它的實現類是 RoundRobinRule ,然后在 RetryRule
choose(ILoadBalancer lb, Object key) 方法中,每次還是采用 RoundRobinRule 中的 choose 規則來選擇一個服務實例,如果選到的實例正常就返
回,如果選擇的服務實例為 null 或者已經失效,則在失效時間 deadline 之前不斷的進行重試(重試時獲取服務的策略還是 RoundRobinRule 中定義的
策略),如果超過了 deadline 還是沒取到則會返回一個 null
WeightedResponseTimeRule 權重 —nacos 的NacosRule ,Nacos還擴展了一個自己的基于配置的權重擴展 WeightedResponseTimeRule是 RoundRobinRule 的一個子類,在 WeightedResponseTimeRule 中對 RoundRobinRule 的功能進行了擴展,
WeightedResponseTimeRule 中會根據每一個實例的運行情況來給計算出該實例的一個 權重 ,然后在挑選實例的時候則根據權重進行挑選,這樣能 夠實現更優的實例調用。WeightedResponseTimeRule 中有一個名叫 DynamicServerWeightTask 的定時任務,默認情況下每隔 30 秒會計算一次 各個服務實例的權重,權重的計算規則也很簡單, 如果一個服務的平均響應時間越短則權重越大,那么該服務實例被選中執行任務的概率也就越大
ClientConfigEnabledRoundRobinRule
ClientConfigEnabledRoundRobinRule 選擇策略的實現很簡單,內部定義了 RoundRobinRule choose 方法還是采用了 RoundRobinRule 的 choose方法,所以它的選擇策略 RoundRobinRule 的選擇策略一致 ,不贅述。
BestAvailableRule
BestAvailableRule 繼承自 ClientConfigEnabledRoundRobinRule ,它在 ClientConfigEnabledRoundRobinRule 的基礎上主要增加了根據 loadBalancerStats中保存的服務實例的狀態信息來 過濾掉失效的服務實例的功能,然后順便找出并發請求最小的服務實例來使用。 然而 loadBalancerStats有可能為 null ,如果 loadBalancerStats null ,則 BestAvailableRule 將采用它的父類即 ClientConfigEnabledRoundRobinRule的服務選取策略(線性輪詢)。
ZoneAvoidanceRule
默認規則 ,復合判斷server所在區域的性能和server的可用性選擇服務器。
ZoneAvoidanceRule PredicateBasedRule 的一個實現類,只不過這里多一個過濾條件, ZoneAvoidanceRule 中的過濾條件是以
ZoneAvoidancePredicate 為主過濾條件和以
AvailabilityPredicate 為次過濾條件組成的一個叫做 CompositePredicate 的組合過濾條件,過濾成功之后,繼續采用線性輪詢
( RoundRobinRule ) 的方式從過濾結果中選擇一個出來。 AvailabilityFilteringRule (先過濾掉故障實例,再選擇并發較小的實例) 過濾掉一直連接失敗的被標記為circuit tripped的后端Server,并過濾掉那些高并發的后端Server或者使用一個AvailabilityPredicate來 包含過濾server的邏輯,其實就是檢查status里記錄的各個Server的運行狀態。
3.2.1 修改默認負載均衡策略
@Configurationpublic class RibbonConfig {/*** 全局配置* 指定負載均衡策略* @return*/@Bean
public IRule iRule() {// 指定使用Nacos提供的負載均衡策略(優先調用同一集群的實例,基于隨機權重)
return new NacosRule();
}
}
注意:此處有坑。 不能寫在@SpringbootApplication注解的@CompentScan掃描得到的地方,否則自定義的配置類就會被所有的 RibbonClients共享。 不建議這么使用,推薦yml方式
利用@RibbonClient指定微服務及其負載均衡策略。
 @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,DruidDataSourceAutoConfigure.class})//@RibbonClient(name = "mall‐order",configuration = RibbonConfig.class)//配置多個 RibbonConfig不能被@SpringbootApplication的@CompentScan掃描到,否則就是全局配置的效果@RibbonClients(value = {// 在SpringBoot主程序掃描的包外定義配置類@RibbonClient(name = "mall‐order",configuration = RibbonConfig.class),@RibbonClient(name = "mall‐account",configuration = RibbonConfig.class)})
public class MallUserRibbonDemoApplication {public static void main(String[] args) {SpringApplication.run(MallUserRibbonDemoApplication.class, args);}}
配置文件 :調用指定微服務提供的服務時,使用對應的負載均衡算法
修改application.yml
 # 被調用的微服務名mall‐order:ribbon:# 指定使用Nacos提供的負載均衡策略(優先調用同一集群的實例,基于隨機&權重)NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
3.2.2 自定義負載均衡策略
通過實現 IRule 接口可以自定義負載策略,主要的選擇服務邏輯在 choose 方法中。
1) 實現基于Nacos權重的負載均衡策略
@Slf4jpublic class NacosRandomWithWeightRule extends AbstractLoadBalancerRule {@Autowiredprivate NacosDiscoveryProperties nacosDiscoveryProperties;@Overridepublic Server choose(Object key) {DynamicServerListLoadBalancer loadBalancer = (DynamicServerListLoadBalancer) getLoadBalancer();String serviceName = loadBalancer.getName();NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();try {//nacos基于權重的算法Instance instance = namingService.selectOneHealthyInstance(serviceName);return new NacosServer(instance);} catch (NacosException e) {log.error("獲取服務實例異常:{}", e.getMessage());e.printStackTrace();}return null;}@Overridepublic void initWithNiwsConfig(IClientConfig clientConfig) {}}
2) 配置自定義的策略
2.1)配置文件:
修改application.yml
# 被調用的微服務名mall‐order:ribbon:# 自定義的負載均衡策略(基于隨機&權重)NFLoadBalancerRuleClassName: com.tuling.mall.ribbondemo.rule.NacosRandomWithWeightRule
3.3 饑餓加載
在進行服務調用的時候,如果網絡情況不好,第一次調用會超時。
Ribbon默認懶加載,意味著只有在發起調用的時候才會創建客戶端。
開啟饑餓加載,解決第一次調用慢的問
 ribbon:eager‐load:# 開啟ribbon饑餓加載enabled: true# 配置mall‐user使用ribbon饑餓加載,多個使用逗號分隔clients: mall‐order
源碼對應屬性配置類:RibbonEagerLoadProperties
測試:

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

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

相關文章

多線程 02

1.線程的常見構造方法 方法說明Thread()創建線程對象Thread(Runnable target)使用 Runnable 對象創建線程對象Thread(String name)創建線程對象,并命名Thread(Runnable target, String name)使用 Runnable 對象創建線程對象,并命名【了解】Thread(Threa…

JS文字操作庫(親測可用)

使用 <template><div class"app"><li class"main_right-btn" click"selectionColor(yellow)">題干標識</li><li class"main_right-btn" click"selectionColor(transparent)">取消標識</li…

K-means算法

K-means算法 Lloyd k-means Algorithm 樣本矩陣&#xff1a; X [ x 1 , x 2 , . . . , x n ] ∈ R d n X[x_1,x_2,...,x_n] ∈R^{dn} X[x1?,x2?,...,xn?]∈Rdn&#xff0c;有n個 x i x_i xi?每個 x i x_i xi?是d維 簇集合&#xff1a; C [ C 1 , C 2 , . . . , C c …

自由飛翔之小鳥

一、創建文件、包、類、插入圖片文件 二、app包 1、Gameapp類&#xff08;運行游戲&#xff09; package app;import main.GameFrame;public class Gameapp {public static void main(String[] args) {//游戲的入口new GameFrame();} } 三、main包 1、Barrier&#xff08;障…

【實驗】配置用戶自動獲取IPv6地址的案例

【贈送】IT技術視頻教程&#xff0c;白拿不謝&#xff01;思科、華為、紅帽、數據庫、云計算等等?編輯https://xmws-it.blog.csdn.net/article/details/117297837?spm1001.2014.3001.5502https://xmws-it.blog.csdn.net/article/details/117297837?spm1001.2014.3001.5502【…

Pyqt5 設置保存上一次結果(配置文件)

效果 每次打開Pyqt5打包后的程序&#xff0c;默認顯示的是上一次的結果 例如下圖的 文件路徑、表名、類型等 大致的思路 Pyqt5自帶的方法QSettings實現保存上一次的設置&#xff0c;其思路是讀取ini文件&#xff0c;如果不存在就是程序的初始狀態&#xff0c;如果存在則可以讀取…

C++程序中dump文件生成方法詳解

最近項目中新作成了一個動態鏈接庫&#xff0c;長時間運行后&#xff0c;偶爾會崩潰。根據log分析&#xff0c;被調用的動態庫函數最外層catch到了這個異常&#xff0c;但是不能定位哪里出了問題。另外雖然上層exe是有dump文件輸出處理的&#xff0c;但是在C中&#xff0c;如果…

如何利用Python進行數據歸一化?

1. 知識簡介 數據歸一化是數據預處理的一項重要步驟&#xff0c;它對于提高模型性能、加速模型訓練、避免數值計算問題以及提高模型的泛化能力都具有重要作用。進行數據歸一化可以起到以下作用&#xff1a;消除量綱影響&#xff0c;加速模型收斂&#xff0c;提高模型性能&…

硅谷大寬服務器:引領互聯網新時代的核心技術

在當今這個信息爆炸的時代&#xff0c;數據已經成為了企業和個人的重要資產。服務器作為數據的存儲和處理中心&#xff0c;其重要性不言而喻。硅谷大寬服務器以其卓越的性能、穩定的運行和優質的服務&#xff0c;贏得了全球眾多企業和個人的信賴和選擇。 硅谷大寬服務器的特點…

圖解分庫分表

中大型項目中&#xff0c;一旦遇到數據量比較大&#xff0c;小伙伴應該都知道就應該對數據進行拆分了。有垂直和水平兩種。 垂直拆分比較簡單&#xff0c;也就是本來一個數據庫&#xff0c;數據量大之后&#xff0c;從業務角度進行拆分多個庫。如下圖&#xff0c;獨立的拆分出…

Redisson分布式鎖實現原理

Redisson主要解決一下問題 重入問題&#xff1a;重入問題是指 獲得鎖的線程可以再次進入到相同的鎖的代碼塊中&#xff0c;可重入鎖的意義在于防止死鎖&#xff0c;比如HashTable這樣的代碼中&#xff0c;他的方法都是使用synchronized修飾的&#xff0c;假如他在一個方法內&a…

解決Spring Boot應用在Kubernetes上健康檢查接口返回OUT_OF_SERVICE的問題

現象 在將Spring Boot應用部署到Kubernetes上時&#xff0c;健康檢查接口/healthcheck返回的狀態為{"status":"OUT_OF_SERVICE","groups":["liveness","readiness"]}&#xff0c;而期望的是返回正常的健康狀態。值得注意的…

VTK物體表面畫貼合線條

1、自由畫線 2、曲線擬合畫線 3、三點閉合曲線

Docker Compose部署微服務項目實戰講解

一、Docker Compose簡介 當需要在多個容器之間協調和管理應用程序時&#xff0c;Docker Compose是一個非常有用的工具。它允許通過一個配置文件來定義、配置和啟動多個 Docker 容器&#xff0c;使得整個應用程序的部署變得更加簡單和一致。以下是 Docker Compose 的一些重要概…

Linux使用寶塔面板+Discuz+cpolar內網穿透工具搭建可公網訪問論壇

Linux寶塔面板搭建Discuz論壇&#xff0c; 并內網穿透實現公網訪問 文章目錄 Linux寶塔面板搭建Discuz論壇&#xff0c; 并內網穿透實現公網訪問前言1.安裝基礎環境2.一鍵部署Discuz3.安裝cpolar工具4.配置域名訪問Discuz5.固定域名公網地址6.配置Discuz論壇 前言 Crossday Di…

【 圖片加載】Vue前端各種圖片引用

文章目錄 一、圖片作為js常量&#xff08;常作為配置項的值 &#xff09;1、在線鏈接2、本地圖片 二、圖片img標簽1、一般的src2、動態的src用require3、src可以接收二進制文件blob&#xff08;如后端返回的、a-upload傳的圖片) 三、背景圖片 一、圖片作為js常量&#xff08;常…

8款那些年救過我的數據文件恢復軟件 - 誤刪除重要文件的“后悔藥”

無論您在保存備份方面多么小心&#xff0c;災難有時還是會發生。有時您的備份軟件無法按預期運行。 如果您的外部驅動器靠近您的設備&#xff0c;發生火災/洪水/故障時&#xff0c;有時備份會與原始文件一起丟失。即使是云存儲也不能避免故障。 還有一個事實是&#xff0c;我…

C++設計模式之工廠模式(上)——簡單工廠模式

工廠模式 概述簡單工廠模式介紹示例示例使用運行結果缺點 概述 工廠模式屬于一種創建型設計模式。其可以分為簡單工廠模式&#xff0c;工廠模式和抽象工廠模式。工廠模式分為上、中、下三篇&#xff0c;本篇主要介紹簡單工廠模式。 簡單工廠模式 介紹 簡單工廠模式可以理解…

二叉樹題目:具有所有最深結點的最小子樹

文章目錄 題目標題和出處難度題目描述要求示例數據范圍 解法一思路和算法代碼復雜度分析 解法二思路和算法代碼復雜度分析 題目 標題和出處 標題&#xff1a;具有所有最深結點的最小子樹 出處&#xff1a;865. 具有所有最深結點的最小子樹 難度 5 級 題目描述 要求 給定…