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

SpringCloud Netflix Ribbon源碼解析(推薦)

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

SpringCloud Netflix Ribbon源碼解析

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

在這里插入圖片描述

配置和實(shí)例初始化

@RibbonClient 注解可以聲明Ribbon 客戶(hù)端,設(shè)置Ribbon 客戶(hù)端的名稱(chēng)和配置類(lèi),configuration 屬性可以指定@Configuration 的配置類(lèi),進(jìn)行Ribbon 相關(guān)的配置。@RibbonClient還會(huì)導(dǎo)入( import ) RibbonClientConfigurationRegistrar 類(lèi)來(lái)動(dòng)態(tài)注冊(cè)Ribbon 相關(guān)的BeanDefinition。
RibbonClientConfigurationRegistrar 是ImportBeanDefinitionRegistrar 的實(shí)現(xiàn)類(lèi),ImportBeanDefinitionRegistrar 是Spring 動(dòng)態(tài)注冊(cè)BeanDefinition 的接口, 可以用來(lái)注冊(cè)Ribbon 所需的BeanD的iition , 比如說(shuō)Ribbon客戶(hù)端實(shí)例( Ribbon Client ) lmportBeanDefinitionRegistrar的registerBeanDefinitions 方法可以注冊(cè)Ribbon 客戶(hù)端的配置類(lèi), 也就是@RibbonClient 的configuration 屬性值

與OpenFeign 的集成

FeignCJientFactoryBean 是創(chuàng)造FeignClient 的工廠
類(lèi),在其getObject 方法中有一個(gè)分支判斷,當(dāng)請(qǐng)求URL 不為空時(shí), 就會(huì)生成一個(gè)具有負(fù)載均衡的FeignClient 。在這個(gè)過(guò)程中, OpenFeign 就默認(rèn)引入了Ribbon 的負(fù)載均衡實(shí)現(xiàn).

在這里插入圖片描述

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

//LoadBalancerFeignClient java
public Response execute(Reqest reqi且est, Request .Options options) throws 工OException {
try {
// :負(fù)載均衡時(shí), host 就是需要調(diào)用的服務(wù)的名稱(chēng)
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)絡(luò)請(qǐng)求的客戶(hù)端,比如說(shuō)OkHttpClient
和ApacheClient
Fe 工gnLoadBalancer . R 工bbonRequest ribbonRequest = new FeignLoadBalancer .
RibbonRequest(
this . delegate , re 守uest , ur 工WithoutHost) ;
IClientConfig requestConfig = getClientConfig(options, clientName) ;
//executeWithLoadBalancer是進(jìn)行負(fù)載均衡的關(guān)鍵
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 類(lèi)的create方法。
return this . lbClientFactory . create(clientName) ;

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

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

在這里插入圖片描述

FeignLoadBalancer 是OpenFeign 在不需要重試機(jī)制的情況下默認(rèn)的負(fù)載均衡實(shí)現(xiàn)。它的execute 方法的實(shí)現(xiàn)很簡(jiǎn)單,使用RibbonRequest 對(duì)象的客戶(hù)端來(lái)發(fā)送網(wǎng)絡(luò)請(qǐng)求,然后
將Response 包裝成RibbonResponse 進(jìn)行返回。RibbonRequest 的request 方法返回的對(duì)象就是構(gòu)造RibbonRequest 對(duì)象時(shí)傳入的delegate 參數(shù)。該參數(shù)是Client 接口的實(shí)例, Client接口是OpenFeign 真正發(fā)送網(wǎng)絡(luò)請(qǐng)求的客戶(hù)端, 比如說(shuō)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 的子類(lèi),其executeWithLoadBalance方法會(huì)首先創(chuàng)建一個(gè)LoadBalancerCommand 實(shí)例,然后在該實(shí)例的submit 方法的回調(diào)中調(diào)用子類(lèi)的execute方法

在這里插入圖片描述

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

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

負(fù)載均衡器LoadBalancerClient

LoadBalancerClient是Ribbon 項(xiàng)目的核心類(lèi)之一,可以在RestTemplate 發(fā)送網(wǎng)絡(luò)請(qǐng)求時(shí)替代RestTemplate 進(jìn)行網(wǎng)絡(luò)調(diào)用

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

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

ILoadBalancer

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

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

負(fù)載均衡策略實(shí)現(xiàn)

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

在這里插入圖片描述

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

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

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

相關(guān)文章

  • 淺談Java模板引擎性能對(duì)比

    淺談Java模板引擎性能對(duì)比

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

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

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

    全面解析java final關(guān)鍵字

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

    JWT登錄認(rèn)證Springboot詳解

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

    搭建公司私有MAVEN倉(cāng)庫(kù)的方法

    這篇文章主要介紹了搭建公司私有MAVEN倉(cāng)庫(kù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Java打包ZIP文件的使用

    Java打包ZIP文件的使用

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

    SpringBoot實(shí)現(xiàn)分布式任務(wù)調(diào)度的詳細(xì)步驟

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

    利用SpringBoot解決多個(gè)定時(shí)任務(wù)阻塞的問(wèn)題

    當(dāng)我們?cè)赟pring Boot應(yīng)用中使用多個(gè)定時(shí)任務(wù)時(shí),任務(wù)之間的阻塞可能是一個(gè)常見(jiàn)的問(wèn)題,這可能會(huì)因任務(wù)之間的依賴(lài)、執(zhí)行時(shí)間過(guò)長(zhǎng)或資源爭(zhēng)用等原因而發(fā)生,本文讓我們深入探討如何利用Spring Boot來(lái)解決多個(gè)定時(shí)任務(wù)阻塞的問(wèn)題,感興趣的小伙伴跟著小編一起來(lái)看看吧
    2024-01-01
  • Spring Data JPA例子代碼[基于Spring Boot、Mysql]

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

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

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

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

最新評(píng)論

思南县| 西平县| 湟中县| 蓝田县| 紫金县| 定兴县| 临城县| 巧家县| 定陶县| 卓资县| 涞源县| 武川县| 昌宁县| 沂水县| 朝阳区| 株洲县| 霍城县| 云霄县| 揭阳市| 邵武市| 大关县| 皋兰县| 昌平区| 错那县| 朝阳县| 卢龙县| 台江县| 亚东县| 新龙县| 贺州市| 陆良县| 赤城县| 衡南县| 台湾省| 松桃| 抚宁县| 松溪县| 苍梧县| 陇南市| 革吉县| 鸡泽县|