激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - SpringCloud Netflix Ribbon源碼解析(推薦)

SpringCloud Netflix Ribbon源碼解析(推薦)

2021-08-27 11:11碼上代碼 Java教程

這篇文章主要介紹了SpringCloud Netflix Ribbon源碼解析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

springcloud netflix ribbon源碼解析

首先會介紹ribbon 相關的配置和實例的初始化過程,然后講解ribbon 是如何與openfeign 集成的,接著講解負載均衡器loadbalancercli ent , 最后依次講解iloadb alancer的實現和負載均衡策略rule 的實現。

SpringCloud Netflix Ribbon源碼解析(推薦)

配置和實例初始化

@ribbonclient 注解可以聲明ribbon 客戶端,設置ribbon 客戶端的名稱和配置類,configuration 屬性可以指定@configuration 的配置類,進行ribbon 相關的配置。@ribbonclient還會導入( import ) ribbonclientconfigurationregistrar 類來動態注冊ribbon 相關的beandefinition。
ribbonclientconfigurationregistrar 是importbeandefinitionregistrar 的實現類,importbeandefinitionregistrar 是spring 動態注冊beandefinition 的接口, 可以用來注冊ribbon 所需的beand的iition , 比如說ribbon客戶端實例( ribbon client ) lmportbeandefinitionregistrar的registerbeandefinitions 方法可以注冊ribbon 客戶端的配置類, 也就是@ribbonclient 的configuration 屬性值

與openfeign 的集成

feigncjientfactorybean 是創造feignclient 的工廠
類,在其getobject 方法中有一個分支判斷,當請求url 不為空時, 就會生成一個具有負載均衡的feignclient 。在這個過程中, openfeign 就默認引入了ribbon 的負載均衡實現.

SpringCloud Netflix Ribbon源碼解析(推薦)

loadbalancerfeignclient#execute 方法會將普通的request 對象轉化為ribbonrequest , 并使用feignloadbalancer 實例來發送ribbonrequest。execute 方法會首先將request 的url轉化為對應的服務名稱,然后構造出ribbonrequest 對象,接著調用lbclient 方法來生成feignloadbalancer 實例,最后調用feignloadbalancer 實例的executewithloadbalancer 方法來處理網絡請求。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//loadbalancerfeignclient java
public response execute(reqest reqi且est, request .options options) throws 工oexception {
try {
// :負載均衡時, host 就是需要調用的服務的名稱
uri asurn= uri . create(request.url()) ;
string clientname = asur. gethost();
uri ur 工withouthost = cleanurl(reqi且est . url(), cl 工entname) ;
//構造ribbonrequest,delegate 一般就是真正發送網絡請求的客戶端,比如說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) {
//調用cachingspringloadbalancerfactory 類的create方法。
return this . lbclientfactory . create(clientname) ;

lbclientfactory 的參數是cachingspringloadbalancerfactory 的實例, 它是帶有緩存機制的feignloadbalancer 的工廠類。

create 方法的clientname 參數是指http 請求對應的服務端名稱, 它會首先使用這個名稱去緩存中查找是否已經存在對應的實例。如果沒有, 再根據系統是否支持請求重試來創建出不同的f eignloadbalancer 實例, 最后將該實例存儲到緩存中.

SpringCloud Netflix Ribbon源碼解析(推薦)

feignloadbalancer 是openfeign 在不需要重試機制的情況下默認的負載均衡實現。它的execute 方法的實現很簡單,使用ribbonrequest 對象的客戶端來發送網絡請求,然后
將response 包裝成ribbonresponse 進行返回。ribbonrequest 的request 方法返回的對象就是構造ribbonrequest 對象時傳入的delegate 參數。該參數是client 接口的實例, client接口是openfeign 真正發送網絡請求的客戶端, 比如說okhttpclient 和apacheclient 。feignloadbalancer 的execute 方法如下所示:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
//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方法會首先創建一個loadbalancercommand 實例,然后在該實例的submit 方法的回調中調用子類的execute方法

SpringCloud Netflix Ribbon源碼解析(推薦)

其中, buildloadb a lan cercommand 方法使用了loadbalancercommand.builder 來創建loadbalancercornmand 實例,并將abstractloadbalancerawarec!ient 作loadbalancercontext接口的實例設置給loadbalancercommand 實例

loadbalancercontext 的getserverfromloadbalancer 方法調用了iloadbalancer 的chooseserver方法,從而完成了負載均衡中服務器的選擇。

負載均衡器loadbalancerclient

loadbalancerclient是ribbon 項目的核心類之一,可以在resttemplate 發送網絡請求時替代resttemplate 進行網絡調用

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

ribbonloadbalancerclient 是loadbalancerclient 的實現類之一, 它的execute 方法會首先使用iloadba lancer 來選擇服務器實例( server ),然后將該服務器實例封裝成ribbonserver 對象, 最后再調用loadbalancerrequest 的apply 方法進行網絡請求的處理。

iloadbalancer

iloadbalancer 是ribbon 的關鍵類之二, 它是定義負載均衡操作過程的接口。ribbon通過springclientfactory 工廠類的getloadbalancer 方法可以獲取iloadbalancer 實例。根據ribbon 的組件實例化機制, iloadbalnacer 實例是在ribbonautoconfiguration 中被創建生成的。

springclientfactory 中的實例都是ribbonclientconfiguration 或者自定義c onfiguration配置類創建的bean 實例。ribbonclientconfiguration 還創建了rule 、iping 和s e rver list
等相關組件的實例。使用者可以通過自定義配置類給出上述幾個組件的不同實例。

負載均衡策略實現

lrule 是定義ribbon 負載均衡策略的接口,你可以通過實現該接口來自定義自己的負載均衡策略, ribbon clientconfiguration 配置類則會給出!rule 的默認實例,rule 接口的choose 方法就是從一堆服務器中根據一定規則選出一個服務器。rule 有很多默認的實現類,這些實現類根據不同的算法和邏輯來進行負載均衡。

SpringCloud Netflix Ribbon源碼解析(推薦)

在大多數情況下, 這些默認的實現類是可以滿足需求的,如果有特殊需求,可以自己實現。ribbon 內置的rule 子類如下所示。

  • bestavailablerule :選擇最小請求數的服務器。
  • clientconfigenabledroundrobinrule :使用randomrobinrule 隨機選擇一個服務器。
  • roundrobinrul e :以randonrobin 方法輪詢選擇服務器。
  • retryrule : 在選定的負載均衡策略上添加重試機制。
  • weightedresponsetimerule :根據響應時間去計算一個權重( we ight ) ,響應時間越
  • 長,權重越低,權重越低的服務器,被選擇的可能性就越低。
  • zoneavoidancerule :根據服務器所屬的服務區的整體運行狀況來輪詢選擇。

到此這篇關于springcloud netflix ribbon源碼解析(推薦)的文章就介紹到這了,更多相關springcloud netflix ribbon源碼內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/weixin_44302240/article/details/112213459

延伸 · 閱讀

精彩推薦
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7472021-02-04
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
主站蜘蛛池模板: 亚洲国产女同久久 | 国产毛片在线看 | 欧美wwwwww| 久久国产精品二国产精品 | 黄色网址电影 | 91亚洲精品一区二区福利 | 久久久成人精品视频 | 91精品国产综合久久青草 | 奇米影视亚洲精品一区 | 国产成人精品一区二区仙踪林 | 国产黄网 | 欧美一区黄色 | 国产日产精品久久久久快鸭 | 久久电影一区二区 | 99久久视频 | 国产jjizz一区二区三区视频 | 成年免费网站 | 在线视频1区 | 成人在线第一页 | 看一级毛片 | 最新se94se在线欧美 | 一本一本久久a久久精品综合小说 | 91社区在线观看 | 49vv看片免费| 免费h片 | 麻豆小视频在线观看 | 91精品国产综合久久久动漫日韩 | 美女黄色毛片免费看 | 欧美精品1区 | 免费国产自久久久久三四区久久 | 免费香蕉成视频成人网 | 夜夜夜操操操 | 精品亚洲视频在线观看 | h网站在线观看 | 韩国草草影院 | 国产精品免费一区二区三区都可以 | 久久99国产精品久久 | 亚洲影视中文字幕 | 亚洲成人福利网站 | 亚洲一级网站 | 青青国产在线视频 |