国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Java】微服務(wù)——Ribbon負載均衡(跟進源碼分析原理)

這篇具有很好參考價值的文章主要介紹了【Java】微服務(wù)——Ribbon負載均衡(跟進源碼分析原理)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

添加@LoadBalanced注解,即可實現(xiàn)負載均衡功能,這是什么原理

1.負載均衡原理

SpringCloud底層其實是利用了一個名為Ribbon的組件,來實現(xiàn)負載均衡功能的。
【Java】微服務(wù)——Ribbon負載均衡(跟進源碼分析原理),Spring Cloud,java,微服務(wù),ribbon

2.源碼跟蹤

為什么我們只輸入了service名稱就可以訪問了呢?之前還要獲取ip和端口。

顯然有人幫我們根據(jù)service名稱,獲取到了服務(wù)實例的ip和端口。它就是LoadBalancerInterceptor,這個類會在對RestTemplate的請求進行攔截,然后從Eureka根據(jù)服務(wù)id獲取服務(wù)列表,隨后利用負載均衡算法得到真實的服務(wù)地址信息,替換服務(wù)id。

我們進行源碼跟蹤:

1)LoadBalancerIntercepor

【Java】微服務(wù)——Ribbon負載均衡(跟進源碼分析原理),Spring Cloud,java,微服務(wù),ribbon

可以看到這里的intercept方法,攔截了用戶的HttpRequest請求,然后做了幾件事:

  • request.getURI():獲取請求uri,本例中就是 http://user-service/user/8
  • originalUri.getHost():獲取uri路徑的主機名,其實就是服務(wù)id,user-service
  • this.loadBalancer.execute():處理服務(wù)id,和用戶請求。

這里的this.loadBalancerLoadBalancerClient類型,我們繼續(xù)跟入。

2)LoadBalancerClient

繼續(xù)跟入execute方法:
【Java】微服務(wù)——Ribbon負載均衡(跟進源碼分析原理),Spring Cloud,java,微服務(wù),ribbon

代碼是這樣的:

  • getLoadBalancer(serviceId):根據(jù)服務(wù)id獲取ILoadBalancer,而ILoadBalancer會拿著服務(wù)id去eureka中獲取服務(wù)列表并保存起來。
  • getServer(loadBalancer):利用內(nèi)置的負載均衡算法,從服務(wù)列表中選擇一個。本例中,可以看到獲取了8082端口的服務(wù)

放行后,再次訪問并跟蹤,發(fā)現(xiàn)獲取的是8081:
【Java】微服務(wù)——Ribbon負載均衡(跟進源碼分析原理),Spring Cloud,java,微服務(wù),ribbon實現(xiàn)了負載均衡。

3)負載均衡策略IRule

在剛才的代碼中,可以看到獲取服務(wù)使通過一個getServer方法來做負載均衡:
【Java】微服務(wù)——Ribbon負載均衡(跟進源碼分析原理),Spring Cloud,java,微服務(wù),ribbon
這里的rule默認值是一個RoundRobinRule,看類的介紹:
【Java】微服務(wù)——Ribbon負載均衡(跟進源碼分析原理),Spring Cloud,java,微服務(wù),ribbon
就是輪詢的意思

4)總結(jié)

SpringCloudRibbon的底層采用了一個攔截器,攔截了RestTemplate發(fā)出的請求,對地址做了修改。用一幅圖來總結(jié)一下:

【Java】微服務(wù)——Ribbon負載均衡(跟進源碼分析原理),Spring Cloud,java,微服務(wù),ribbon

基本流程如下:

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

3.負載均衡策略

3.1.負載均衡策略

負載均衡的規(guī)則都定義在IRule接口中,而IRule有很多不同的實現(xiàn)類:
不同規(guī)則的含義如下:

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

默認的實現(xiàn)就是ZoneAvoidanceRule,是一種輪詢方案

3.2.自定義負載均衡策略

通過定義IRule實現(xiàn)可以修改負載均衡規(guī)則,有兩種方式:

  1. 代碼方式:在order-service中的OrderApplication類中,定義一個新的IRule:
@Bean
public IRule randomRule(){
    return new RandomRule();
}
  1. 配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改規(guī)則:
userservice: # 給某個微服務(wù)配置負載均衡規(guī)則,這里是userservice服務(wù)
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 負載均衡規(guī)則 

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

4.饑餓加載

Ribbon默認是采用懶加載,即第一次訪問時才會去創(chuàng)建LoadBalanceClient,請求時間會很長。

而饑餓加載則會在項目啟動時創(chuàng)建,降低第一次訪問的耗時,通過下面配置開啟饑餓加載:文章來源地址http://www.zghlxwxcb.cn/news/detail-729151.html

ribbon:
  eager-load:
    enabled: true
    clients: userservice

到了這里,關(guān)于【Java】微服務(wù)——Ribbon負載均衡(跟進源碼分析原理)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Spring Cloud 實戰(zhàn) | 解密負載均衡Ribbon底層原理,包含實戰(zhàn)源碼

    Spring Cloud 實戰(zhàn) | 解密負載均衡Ribbon底層原理,包含實戰(zhàn)源碼

    專欄集錦,大佬們可以收藏以備不時之需 Spring Cloud實戰(zhàn)專欄:https://blog.csdn.net/superdangbo/category_9270827.html Python 實戰(zhàn)專欄:https://blog.csdn.net/superdangbo/category_9271194.html Logback 詳解專欄:https://blog.csdn.net/superdangbo/category_9271502.html tensorflow專欄:https://blog.csdn.net/superdangbo/category_869

    2024年02月08日
    瀏覽(22)
  • springcloud 中RestTemplate 是怎么和 ribbon整合,實現(xiàn)負載均衡的?源碼分析

    springcloud 中RestTemplate 是怎么和 ribbon整合,實現(xiàn)負載均衡的?源碼分析

    RestTemplate 內(nèi)置了一個 ClientHttpRequestInterceptor ,這個是一個攔截器操作,我們可以在請求的前后做一些事情。然后我們看一下這個類,這個類里面 有一個 intercept 方法。我們看下這個實現(xiàn)類,里面有一個 LoadBalancerInterceptor 實現(xiàn)類。 我們來看 LoadBalancerInterceptor 實現(xiàn)類。 然后我

    2024年02月09日
    瀏覽(21)
  • 1.3 eureka+ribbon,完成服務(wù)注冊與調(diào)用,負載均衡源碼追蹤

    1.3 eureka+ribbon,完成服務(wù)注冊與調(diào)用,負載均衡源碼追蹤

    本篇繼先前發(fā)布的1.2 eureka注冊中心,完成服務(wù)注冊的內(nèi)容 。 目錄 環(huán)境搭建 采用eureka+ribbon的方式,對多個user服務(wù)發(fā)送請求,并實現(xiàn)負載均衡 負載均衡原理 負載均衡源碼追蹤 負載均衡策略 如何選擇負載均衡策略? 饑餓加載 復(fù)制(補充) 給order模塊和user模塊建立獨立的數(shù)

    2024年02月14日
    瀏覽(19)
  • Spring Cloud - Ribbon 負載均衡原理、負載策略、懶加載

    Spring Cloud - Ribbon 負載均衡原理、負載策略、懶加載

    目錄 ?編輯 一、Ribbon 負載均衡原理 1.1、前言 1.2、負載均衡的工作流程 二、負載均衡策略 2.1、策略原理 2.2、負載均衡自定義方式 三、Ribbon 加載方式 ps:案例是上一章所講的?“根據(jù)訂單id查詢訂單的同時,把訂單所屬的用戶信息一起返回”? 。 上一章我們講到 order-servi

    2024年02月09日
    瀏覽(23)
  • Ribbon 負載均衡策略 —— 圖解、源碼級解析

    Ribbon 負載均衡策略 —— 圖解、源碼級解析

    ?? Java學(xué)習(xí):社區(qū)快速通道 ?? 深入淺出RocketMQ設(shè)計思想:深入淺出RocketMQ設(shè)計思想 ?? 絕對不一樣的職場干貨:大廠最佳實踐經(jīng)驗指南 ?? 最近更新:2023年6月4日 ?? 點贊 ?? 收藏 ?留言 ?? 都是我最大的動力! 通過本文你可以學(xué)習(xí)到: 常見的7種負載均衡策略思想 自旋鎖

    2024年02月07日
    瀏覽(24)
  • Ribbon 負載均衡服務(wù)調(diào)用

    Ribbon 負載均衡服務(wù)調(diào)用

    想要學(xué)習(xí)完整SpringCloud架構(gòu)可跳轉(zhuǎn) : SpringCloud Alibaba微服務(wù)分布式架構(gòu) Spring Cloud Ribbon是基于Netflix Ribbon實現(xiàn)的一套 客戶端負載均衡 的工具。 Ribbon是Netflix發(fā)布的開源項目,主要功能是提供 客戶端的軟件負載均衡算法和服務(wù)調(diào)用。 Ribbon客戶端組件提供一系列完善的配置項如連

    2024年02月16日
    瀏覽(23)
  • 微服務(wù)-Ribbon負載均衡

    微服務(wù)-Ribbon負載均衡

    流程 原理 @LoadBalanced 標記RestTemplate發(fā)起的http請求要被Ribbon進行攔截和處理 源碼分析 ctrl+shift+N搜索LoadBalancerInterceptor,進入。發(fā)現(xiàn)實現(xiàn)了ClientHttpRequestInterceptor(客戶端Http請求攔截器)的intercept方法 攔截方法 打一個斷點,啟動order-application,瀏覽器發(fā)送請求http://localhost:8080

    2024年02月08日
    瀏覽(25)
  • 微服務(wù)-Ribbon(負載均衡)

    微服務(wù)-Ribbon(負載均衡)

    負載均衡的面對多個相同的服務(wù)的時候,我們選擇一定的策略去選擇一個服務(wù)進行 RoundRobinRule:簡單的輪詢服務(wù)列表來選擇服務(wù)器 AvailabilityFilteringRule 對兩種情況服務(wù)器進行忽略: 1.在默認情況下,這臺服務(wù)器如果3次連接失敗,這臺服務(wù)器就會被設(shè)置為“短路狀態(tài)”,短路狀

    2024年02月12日
    瀏覽(26)
  • 【微服務(wù)】Ribbon負載均衡

    【微服務(wù)】Ribbon負載均衡

    在上文的案例中我們添加了@LoadBalanced注解,即可實現(xiàn)負載均衡功能,這是什么原理呢? 我們這里的@LoadBalanced相當于是一個標記,標記這個RestTemplate發(fā)出的請求要被我們的Ribbon攔截和處理。 SpringCloud底層其實是利用了一個名為Ribbon的組件,來實現(xiàn)負載均衡功能的。 那么我們發(fā)

    2024年01月16日
    瀏覽(18)
  • Ribbon負載均衡+Nacos服務(wù)搭建

    Ribbon負載均衡+Nacos服務(wù)搭建

    首先通過RibbonLoadBalanceerClient獲取服務(wù)名,并傳給DynamicServerListLoadBalancer——通過EureKa-server獲取服務(wù)名對應(yīng)服務(wù)列表(也就是被注冊到EureKa中的服務(wù),可能包括不同端口的),然后我們會根據(jù)IRule中的服務(wù)負載均衡-選擇某個服務(wù),然后修改url發(fā)送請求; Ribbon的負載均衡是一個叫

    2024年02月10日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包