天天看點

Feign Ribbon Hystrix 三者關系 | 史上最全, 深度解析

文章很長,建議收藏起來,慢慢讀! 備注:持續更新中.....

  • 瘋狂創客圈 經典圖書 : 《Netty Zookeeper Redis 高并發實戰》 面試必備 + 大廠必備 + 漲薪必備
  • 瘋狂創客圈 經典圖書 : 《SpringCloud、Nginx高并發核心程式設計》 面試必備 + 大廠必備 + 漲薪必備
  • 瘋狂創客圈 價值1000元 百度網盤資源大禮包,免費拿 【部落格園總入口 】

價值連城:2021春招月薪過5萬 面試題 總系列

搞定下面這些面試題,2021春招月薪過5萬(猛!) 阿裡、京東、美團、頭條.... 随意挑、橫着走!!!
Java基礎
1: JVM面試題(史上最強、持續更新、吐血推薦) https://www.cnblogs.com/crazymakercircle/p/14365820.html
2:Java基礎面試題(史上最全、持續更新、吐血推薦) https://www.cnblogs.com/crazymakercircle/p/14366081.html
3:死鎖面試題(史上最強、持續更新) [https://www.cnblogs.com/crazymakercircle/p/14323919.html]
4:設計模式面試題 (史上最全、持續更新、吐血推薦) https://www.cnblogs.com/crazymakercircle/p/14367101.html
5:架構設計面試題 (史上最全、持續更新、吐血推薦) https://www.cnblogs.com/crazymakercircle/p/14367907.html
還有 10 幾篇 篇價值連城 的面試題 具體..... 請參見【 瘋狂創客圈 高并發 總目錄 】

萬字長文: 瘋狂創客圈 springCloud 高并發系列

springCloud 高品質 博文
nacos 實戰(史上最全) sentinel (史上最全+入門教程)
springcloud + webflux 高并發實戰 Webflux(史上最全)
SpringCloud gateway (史上最全)
還有 10 幾篇 萬字長文 的高品質 博文

本文,是《Feign Ribbon Hystrix 三者關系 , 史上最全 深度解析》篇,為大家解讀如果Feign Ribbon Hystrix 三者關系,大家可以藏好,一定有用的到時候。

Springcloud 高并發 配置 簡介

在微服務架構的應用中, Feign、Hystrix,Ribbon三者都是必不可少的,可以說已經成為鐵三角。

瘋狂創客圈(筆者尼恩建立的高并發研習社群)中,有不少小夥伴問到尼恩,關于Feign、Hystrix,Ribbon三者之間的關系,以及三者的逾時配置。截止目前,全網沒有篇文章介紹清楚的,故,尼恩特寫一篇詳細一點的文章,剖析一下。

Feign介紹

Feign是一款Java語言編寫的HttpClient綁定器,在Spring Cloud微服務中用于實作微服務之間的聲明式調用。Feign 可以定義請求到其他服務的接口,用于微服務間的調用,不用自己再寫http請求,在用戶端實作,調用此接口就像遠端調用其他服務一樣,當請求出錯時可以調用接口的實作類來傳回

Feign是一個聲明式的web service用戶端,它使得編寫web service用戶端更為容易。建立接口,為接口添加注解,即可使用Feign。Feign可以使用Feign注解或者JAX-RS注解,還支援熱插拔的編碼器和解碼器。Spring Cloud為Feign添加了Spring MVC的注解支援,并整合了Ribbon和Eureka來為使用Feign時提供負載均衡。

feign源碼的github位址:

https://github.com/OpenFeign/feign

Ribbon介紹

Ribbon 作為負載均衡,在用戶端實作,服務段可以啟動兩個端口不同但servername一樣的服務

Ribbon是Netflix釋出的開源項目,主要功能是提供用戶端的軟體負載均衡算法,将Netflix的中間層服務連接配接在一起。Ribbon用戶端元件提供一系列完善的配置項如連接配接逾時,重試等。簡單的說,就是在配置檔案中列出Load Balancer後面所有的機器,Ribbon會自動的幫助你基于某種規則(如簡單輪詢,随機連接配接等)去連接配接這些機器。我們也很容易使用Ribbon實作自定義的負載均衡算法。簡單地說,Ribbon是一個用戶端負載均衡器。

Ribbon工作時分為兩步:第一步先選擇 Eureka Server, 它優先選擇在同一個Zone且負載較少的Server;第二步再根據使用者指定的政策,在從Server取到的服務注冊清單中選擇一個位址。其中Ribbon提供了多種政策,例如輪詢、随機、根據響應時間權重等。

ribbon源碼的github位址:

https://github.com/Netflix/ribbon

Hystrix介紹

Hystrix作為熔斷流量控制,在用戶端實作,在方法上注解,當請求出錯時可以調用注解中的方法傳回

Hystrix熔斷器,容錯管理工具,旨在通過熔斷機制控制服務和第三方庫的節點,進而對延遲和故障提供更強大的容錯能力。在Spring Cloud Hystrix中實作了線程隔離、斷路器等一系列的服務保護功能。它也是基于Netflix的開源架構 Hystrix實作的,該架構目标在于通過控制那些通路遠端系統、服務和第三方庫的節點,進而對延遲和故障提供更強大的容錯能力。Hystrix具備了服務降級、服務熔斷、線程隔離、請求緩存、請求合并以及服務監控等強大功能。

Hystrix源碼的github位址:

https://github.com/Netflix/hystrix

重點: 三者之間的關系圖

如果微服務項目加上了spring-cloud-starter-netflix-hystrix依賴,那麼,feign會通過代理模式, 自動将所有的方法用 hystrix 進行包裝。

在Spring Cloud微服務體系下,微服務之間的互相調用可以通過Feign進行聲明式調用,在這個服務調用過程中Feign會通過Ribbon從服務注冊中心擷取目标微服務的伺服器位址清單,之後在網絡請求的過程中Ribbon就會将請求以負載均衡的方式打到微服務的不同執行個體上,進而實作Spring Cloud微服務架構中最為關鍵的功能即服務發現及用戶端負載均衡調用。

另一方面微服務在互相調用的過程中,為了防止某個微服務的故障消耗掉整個系統所有微服務的連接配接資源,是以在實施微服務調用的過程中我們會要求在調用方實施針對被調用微服務的熔斷邏輯。而要實作這個邏輯場景在Spring Cloud微服務架構下我們是通過Hystrix這個架構來實作的。

調用方會針對被調用微服務設定調用逾時時間,一旦逾時就會進入熔斷邏輯,而這個故障名額資訊也會傳回給Hystrix元件,Hystrix元件會根據熔斷情況判斷被調微服務的故障情況進而打開熔斷器,之後所有針對該微服務的請求就會直接進入熔斷邏輯,直到被調微服務故障恢複,Hystrix斷路器關閉為止。

三者之間的關系圖,大緻如下:

Feign Ribbon Hystrix 三者關系 | 史上最全, 深度解析

Feign典型配置說明

Feign自身可以支援多種HttpClient工具包,例如OkHttp及Apache HttpClient,針對Apache HttpClient的典型配置如下:

feign:
  #替換掉JDK預設HttpURLConnection實作的 Http Client
  httpclient:
    enabled: true
  hystrix:
    enabled: true
  client:
    config:
      default:
       #連接配接逾時時間
        connectTimeout: 5000
       #讀取逾時時間
        readTimeout: 5000
           

Hystrix配置說明

在Spring Cloud微服務體系中Hystrix主要被用于實作實作微服務之間網絡調用故障的熔斷、過載保護及資源隔離等功能。

hystrix:
  propagate:
    request-attribute:
      enabled: true
  command:
    #全局預設配置
    default:
      #線程隔離相關
      execution:
        timeout:
          #是否給方法執行設定逾時時間,預設為true。一般我們不要改。
          enabled: true
        isolation:
          #配置請求隔離的方式,這裡是預設的線程池方式。還有一種信号量的方式semaphore,使用比較少。
          strategy: threadPool
          thread:
            #方式執行的逾時時間,預設為1000毫秒,在實際場景中需要根據情況設定
            timeoutInMilliseconds: 10000
            #發生逾時時是否中斷方法的執行,預設值為true。不要改。
            interruptOnTimeout: true
            #是否在方法執行被取消時中斷方法,預設值為false。沒有實際意義,預設就好!
            interruptOnCancel: false
  circuitBreaker:   #熔斷器相關配置
    enabled: true   #是否啟動熔斷器,預設為true,false表示不要引入Hystrix。
    requestVolumeThreshold: 20     #啟用熔斷器功能視窗時間内的最小請求數,假設我們設定的視窗時間為10秒,
    sleepWindowInMilliseconds: 5000    #是以此配置的作用是指定熔斷器打開後多長時間内允許一次請求嘗試執行,官方預設配置為5秒。
    errorThresholdPercentage: 50   #視窗時間内超過50%的請求失敗後就會打開熔斷器将後續請求快速失敗掉,預設配置為50


           

Ribbon配置說明

Ribbon在Spring Cloud中對于支援微服之間的通信發揮着非常關鍵的作用,其主要功能包括用戶端負載均衡器及用于中間層通信的用戶端。在基于Feign的微服務通信中無論是否開啟Hystrix,Ribbon都是必不可少的,Ribbon的配置參數主要如下:

ribbon:
  eager-load:
    enabled: true
  #說明:同一台執行個體的最大自動重試次數,預設為1次,不包括首次
  MaxAutoRetries: 1
  #說明:要重試的下一個執行個體的最大數量,預設為1,不包括第一次被調用的執行個體
  MaxAutoRetriesNextServer: 1
  #說明:是否所有的操作都重試,預設為true
  OkToRetryOnAllOperations: true
  #說明:從注冊中心重新整理伺服器清單資訊的時間間隔,預設為2000毫秒,即2秒
  ServerListRefreshInterval: 2000
  #說明:使用Apache HttpClient連接配接逾時時間,機關為毫秒
  ConnectTimeout: 3000
  #說明:使用Apache HttpClient讀取的逾時時間,機關為毫秒
  ReadTimeout: 3000

           

如上圖所示,在Spring Cloud中使用Feign進行微服務調用分為兩層:Hystrix的調用和Ribbon的調用,Feign自身的配置會被覆寫。

而如果開啟了Hystrix,那麼Ribbon的逾時時間配置與Hystrix的逾時時間配置則存在依賴關系,因為涉及到Ribbon的重試機制,是以一般情況下都是Ribbon的逾時時間小于Hystrix的逾時時間,否則會出現以下錯誤:

2019-10-12 21:56:20,208   111231 [http-nio-8084-exec-2] WARN    o.s.c.n.z.f.r.s.AbstractRibbonCommand - The Hystrix timeout of 10000ms   for the command operation is set lower than the combination of the Ribbon   read and connect timeout, 24000ms. 
           

Ribbon和Hystrix的逾時時間配置的關系

那麼Ribbon和Hystrix的逾時時間配置的關系具體是什麼呢?如下:

Hystrix的逾時時間=Ribbon的重試次數(包含首次) * (ribbon.ReadTimeout + ribbon.ConnectTimeout)
           

而Ribbon的重試次數的計算方式為:

Ribbon重試次數(包含首次)= 1 + ribbon.MaxAutoRetries  +  ribbon.MaxAutoRetriesNextServer  +  (ribbon.MaxAutoRetries * ribbon.MaxAutoRetriesNextServer)
           

以上圖中的Ribbon配置為例子,Ribbon的重試次數=1+(1+1+1)=4,是以Hystrix的逾時配置應該>=4*(3000+3000)=24000毫秒。在Ribbon逾時但Hystrix沒有逾時的情況下,Ribbon便會采取重試機制;而重試期間如果時間超過了Hystrix的逾時配置則會立即被熔斷(fallback)。

如果不配置Ribbon的重試次數,則Ribbon預設會重試一次,加上第一次調用Ribbon,總的的重試次數為2次,以上述配置參數為例,Hystrix逾時時間配置為2*6000=12000,由于很多情況下,大家一般不會主動配置Ribbon的重試次數,是以這裡需要注意下!強調下,以上逾時配置的值隻是示範,逾時配置有點大不太合适實際的線上場景,大家根據實際情況設定即可!

說明下,如果不啟用Hystrix,Feign的逾時時間則是Ribbon的逾時時間,Feign自身的配置也會被覆寫。

最後,介紹一下瘋狂創客圈:瘋狂創客圈,一個Java 高并發研習社群 【部落格園 總入口 】

瘋狂創客圈,傾力推出:面試必備 + 面試必備 + 面試必備 的基礎原理+實戰 書籍 《Netty Zookeeper Redis 高并發實戰》

Feign Ribbon Hystrix 三者關系 | 史上最全, 深度解析

瘋狂創客圈 Java 死磕系列

  • Java (Netty) 聊天程式【 億級流量】實戰 開源項目實戰
  • Netty 源碼、原理、JAVA NIO 原理
  • Java 面試題 一網打盡
  • 瘋狂創客圈 【 部落格園 總入口 】