最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringCloud Netflix Ribbon源碼解析(推薦)

 更新時間:2021年03月22日 14:43:12   作者:碼上代碼  
這篇文章主要介紹了SpringCloud Netflix Ribbon源碼解析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

SpringCloud Netflix Ribbon源碼解析

首先會介紹Ribbon 相關的配置和實例的初始化過程,然后講解Ribbon 是如何與OpenFeign 集成的,接著講解負載均衡器LoadBalancerCli ent , 最后依次講解ILoadB alancer的實現(xiàn)和負載均衡策略Rule 的實現(xiàn)。

在這里插入圖片描述

配置和實例初始化

@RibbonClient 注解可以聲明Ribbon 客戶端,設置Ribbon 客戶端的名稱和配置類,configuration 屬性可以指定@Configuration 的配置類,進行Ribbon 相關的配置。@RibbonClient還會導入( import ) RibbonClientConfigurationRegistrar 類來動態(tài)注冊Ribbon 相關的BeanDefinition。
RibbonClientConfigurationRegistrar 是ImportBeanDefinitionRegistrar 的實現(xiàn)類,ImportBeanDefinitionRegistrar 是Spring 動態(tài)注冊BeanDefinition 的接口, 可以用來注冊Ribbon 所需的BeanD的iition , 比如說Ribbon客戶端實例( Ribbon Client ) lmportBeanDefinitionRegistrar的registerBeanDefinitions 方法可以注冊Ribbon 客戶端的配置類, 也就是@RibbonClient 的configuration 屬性值

與OpenFeign 的集成

FeignCJientFactoryBean 是創(chuàng)造FeignClient 的工廠
類,在其getObject 方法中有一個分支判斷,當請求URL 不為空時, 就會生成一個具有負載均衡的FeignClient 。在這個過程中, OpenFeign 就默認引入了Ribbon 的負載均衡實現(xiàn).

在這里插入圖片描述

LoadBalancerFeignClient#execute 方法會將普通的Request 對象轉(zhuǎn)化為RibbonRequest , 并使用FeignLoadBalancer 實例來發(fā)送RibbonRequest。execute 方法會首先將Request 的URL轉(zhuǎn)化為對應的服務名稱,然后構(gòu)造出RibbonRequest 對象,接著調(diào)用lbClient 方法來生成FeignLoadBalancer 實例,最后調(diào)用FeignLoadBalancer 實例的executeWithLoadBalancer 方法來處理網(wǎng)絡請求。

//LoadBalancerFeignClient java
public Response execute(Reqest reqi且est, Request .Options options) throws 工OException {
try {
// :負載均衡時, host 就是需要調(diào)用的服務的名稱
URI asurn= URI . create(request.url()) ;
String clientName = asur. getHost();
URI ur 工WithoutHost = cleanUrl(reqi且est . url(), cl 工entName) ;
//構(gòu)造RibbonRequest,delegate 一般就是真正發(fā)送網(wǎng)絡請求的客戶端,比如說OkHttpClient
和ApacheClient
Fe 工gnLoadBalancer . R 工bbonRequest ribbonRequest = new FeignLoadBalancer .
RibbonRequest(
this . delegate , re 守uest , ur 工WithoutHost) ;
IClientConfig requestConfig = getClientConfig(options, clientName) ;
//executeWithLoadBalancer是進行負載均衡的關鍵
return lbClient(clientName) . executeWithLoadBalancer(ribbonRequest ,
requestConfig) . toResponse () ;
catch (ClientException e) {
IOException io = findIOException(e) ;
if ( io ! = null) {
throw io;
throw new RuntimeException(e) ;
private FeignLoadBalancer lbCl 工ent(Str 工ng cl 工entName) {
//調(diào)用CachingSpringLoadBalancerFactory 類的create方法。
return this . lbClientFactory . create(clientName) ;

lbClientFactory 的參數(shù)是CachingSpringLoadBalancerFactory 的實例, 它是帶有緩存機制的FeignLoadBalancer 的工廠類。

create 方法的clientName 參數(shù)是指HTTP 請求對應的服務端名稱, 它會首先使用這個名稱去緩存中查找是否已經(jīng)存在對應的實例。如果沒有, 再根據(jù)系統(tǒng)是否支持請求重試來創(chuàng)建出不同的F eignLoadBalancer 實例, 最后將該實例存儲到緩存中.

在這里插入圖片描述

FeignLoadBalancer 是OpenFeign 在不需要重試機制的情況下默認的負載均衡實現(xiàn)。它的execute 方法的實現(xiàn)很簡單,使用RibbonRequest 對象的客戶端來發(fā)送網(wǎng)絡請求,然后
將Response 包裝成RibbonResponse 進行返回。RibbonRequest 的request 方法返回的對象就是構(gòu)造RibbonRequest 對象時傳入的delegate 參數(shù)。該參數(shù)是Client 接口的實例, Client接口是OpenFeign 真正發(fā)送網(wǎng)絡請求的客戶端, 比如說OkHttpClient 和ApacheClient 。FeignLoadBalancer 的execute 方法如下所示:

//Fe i gnLoadBalancer. ] ava
public RibbonResponse execute(RibbonRequest request , IClientConfig configOverride)
throws IOException {
Request.Options options ;
if (configOverride ! = null) {
RibbonPropert 工es override = RibbonPropertes . from(configOverride);
options = new Request.Options(
else {
override . connectTimeout(th 工s . connect Timeout),
override . readTimeout(this . readT 工meout));
options = new Request . Options(th 工s.connectTimeout, this readTimeout);
Response response = request . client() . execute(request . toReqest(), options) ;
return new RibbonResponse(request . getUri() , response) ;

FeignLoadBalancer 是AbstractLoadBalancerAwareC!ient 的子類,其executeWithLoadBalance方法會首先創(chuàng)建一個LoadBalancerCommand 實例,然后在該實例的submit 方法的回調(diào)中調(diào)用子類的execute方法

在這里插入圖片描述

其中, buildLoadB a lan cerCommand 方法使用了LoadBalancerCommand.Builder 來創(chuàng)建LoadBalancerCornmand 實例,并將AbstractLoadBalancerAwareC!ient 作LoadBalancerContext接口的實例設置給LoadBalancerCommand 實例

LoadBalancerContext 的getServerFromLoadBalancer 方法調(diào)用了ILoadBalancer 的chooseServer方法,從而完成了負載均衡中服務器的選擇。

負載均衡器LoadBalancerClient

LoadBalancerClient是Ribbon 項目的核心類之一,可以在RestTemplate 發(fā)送網(wǎng)絡請求時替代RestTemplate 進行網(wǎng)絡調(diào)用

LoadBalancerClient 接口繼承了ServicelnstanceChooser 接口,其choose 方法可以從服務器列表中依據(jù)負載均衡策略選出一個服務器實例

RibbonLoadBalancerClient 是LoadBalancerClient 的實現(xiàn)類之一, 它的execute 方法會首先使用ILoadBa lancer 來選擇服務器實例( Server ),然后將該服務器實例封裝成RibbonServer 對象, 最后再調(diào)用LoadBalancerRequest 的apply 方法進行網(wǎng)絡請求的處理。

ILoadBalancer

ILoadBalancer 是Ribbon 的關鍵類之二, 它是定義負載均衡操作過程的接口。Ribbon通過SpringClientFactory 工廠類的getLoadBalancer 方法可以獲取ILoadBalancer 實例。根據(jù)Ribbon 的組件實例化機制, ILoadBalnacer 實例是在RibbonAutoConfiguration 中被創(chuàng)建生成的。

SpringClientFactory 中的實例都是RibbonClientConfiguration 或者自定義C onfiguration配置類創(chuàng)建的Bean 實例。RibbonClientConfiguration 還創(chuàng)建了Rule 、IPing 和S e rver List
等相關組件的實例。使用者可以通過自定義配置類給出上述幾個組件的不同實例。

負載均衡策略實現(xiàn)

lRule 是定義Ribbon 負載均衡策略的接口,你可以通過實現(xiàn)該接口來自定義自己的負載均衡策略, Ribbon ClientConfiguration 配置類則會給出!Rule 的默認實例,Rule 接口的choose 方法就是從一堆服務器中根據(jù)一定規(guī)則選出一個服務器。Rule 有很多默認的實現(xiàn)類,這些實現(xiàn)類根據(jù)不同的算法和邏輯來進行負載均衡。

在這里插入圖片描述

在大多數(shù)情況下, 這些默認的實現(xiàn)類是可以滿足需求的,如果有特殊需求,可以自己實現(xiàn)。Ribbon 內(nèi)置的Rule 子類如下所示。

  • BestAvailableRule :選擇最小請求數(shù)的服務器。
  • ClientConfigEnabledRoundRobinRule :使用RandomRobinRule 隨機選擇一個服務器。
  • RoundRobinRul e :以RandonRobin 方法輪詢選擇服務器。
  • RetryRule : 在選定的負載均衡策略上添加重試機制。
  • WeightedResponseTimeRule :根據(jù)響應時間去計算一個權重( we ight ) ,響應時間越
  • 長,權重越低,權重越低的服務器,被選擇的可能性就越低。
  • ZoneAvoidanceRule :根據(jù)服務器所屬的服務區(qū)的整體運行狀況來輪詢選擇。

到此這篇關于SpringCloud Netflix Ribbon源碼解析(推薦)的文章就介紹到這了,更多相關SpringCloud Netflix Ribbon源碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 淺談Java模板引擎性能對比

    淺談Java模板引擎性能對比

    本篇文章主要介紹了淺談Java模板引擎性能對比 ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • springboot關閉druid監(jiān)控 druid2改配置文件無效的解決

    springboot關閉druid監(jiān)控 druid2改配置文件無效的解決

    這篇文章主要介紹了springboot關閉druid監(jiān)控 druid2改配置文件無效的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 全面解析java final關鍵字

    全面解析java final關鍵字

    這篇文章主要介紹了java final關鍵字的使用,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2021-01-01
  • JWT登錄認證Springboot詳解

    JWT登錄認證Springboot詳解

    文章主要介紹了如何在Java項目中使用JWT進行用戶認證和授權,通過定義一個常量,編寫JWT工具類來生成和解析token,登錄時在服務端生成token并返回給客戶端,客戶端使用攔截器攔截請求,驗證token的有效性,從而實現(xiàn)權限控制,文章旨在分享個人經(jīng)驗,為開發(fā)者提供參考
    2024-11-11
  • 搭建公司私有MAVEN倉庫的方法

    搭建公司私有MAVEN倉庫的方法

    這篇文章主要介紹了搭建公司私有MAVEN倉庫的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • Java打包ZIP文件的使用

    Java打包ZIP文件的使用

    本文詳細介紹了如何使用Java語言進行ZIP文件的創(chuàng)建、讀取和操作,通過java.util.zip包和第三方庫,可以高效地處理ZIP文件,并應用密碼保護和注釋等高級功能,在實際應用中,遵循最佳實踐可以提高程序的健壯性和安全性
    2025-02-02
  • SpringBoot實現(xiàn)分布式任務調(diào)度的詳細步驟

    SpringBoot實現(xiàn)分布式任務調(diào)度的詳細步驟

    隨著互聯(lián)網(wǎng)應用的規(guī)模和復雜度不斷增加,單節(jié)點任務調(diào)度系統(tǒng)已經(jīng)難以滿足高并發(fā)、大數(shù)據(jù)量的處理需求,分布式任務調(diào)度成為了解決這一問題的重要手段,本文將介紹如何在Spring Boot中實現(xiàn)分布式任務調(diào)度,需要的朋友可以參考下
    2024-08-08
  • 利用SpringBoot解決多個定時任務阻塞的問題

    利用SpringBoot解決多個定時任務阻塞的問題

    當我們在Spring Boot應用中使用多個定時任務時,任務之間的阻塞可能是一個常見的問題,這可能會因任務之間的依賴、執(zhí)行時間過長或資源爭用等原因而發(fā)生,本文讓我們深入探討如何利用Spring Boot來解決多個定時任務阻塞的問題,感興趣的小伙伴跟著小編一起來看看吧
    2024-01-01
  • Spring Data JPA例子代碼[基于Spring Boot、Mysql]

    Spring Data JPA例子代碼[基于Spring Boot、Mysql]

    這篇文章主要介紹了Spring Data JPA例子代碼[基于Spring Boot、Mysql],小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • JPA之EntityManager踩坑及解決:更改PersistenceContext

    JPA之EntityManager踩坑及解決:更改PersistenceContext

    這篇文章主要介紹了JPA之EntityManager踩坑及解決:更改PersistenceContext方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02

最新評論

克拉玛依市| 富锦市| 黎川县| 昭通市| 综艺| 营口市| 牡丹江市| 夏津县| 辉县市| 青神县| 稻城县| 三原县| 花莲市| 涞源县| 那曲县| 随州市| 琼结县| 玉林市| 浦东新区| 奈曼旗| 保山市| 安陆市| 上高县| 宁波市| 米林县| 吴川市| 故城县| 宾阳县| 深州市| 应城市| 阿合奇县| 霍城县| 兰坪| 四会市| 道真| 宜城市| 连南| 周口市| 克什克腾旗| 游戏| 尼玛县|