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

史上最全: Feign Ribbon Hystrix 三者關係 | 深度解析

瘋狂創客圈 Java 分佈式聊天室【 億級流量】實戰系列之 -25【 博客園 總入口html


前言

瘋狂創客圈(筆者尼恩建立的高併發研習社羣)Springcloud 高併發系列文章,將爲你們介紹三個版本的 高併發秒殺:java

1、版本1 :springcloud + zookeeper 秒殺git

2、版本2 :springcloud + redis 分佈式鎖秒殺github

3、版本3 :springcloud + Nginx + Lua 高性能版本秒殺web

以及有關Springcloud 幾篇核心、重要的文章面試

1、Springcloud 配置, 史上最全 一文全懂redis

2、Springcloud 中 SpringBoot 配置全集 , 收藏版算法

3、Feign Ribbon Hystrix 三者關係 , 史上最全 深度解析spring

4、SpringCloud gateway 詳解 , 史上最全緩存

本文,是《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典型配置說明

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 高併發實戰

img


瘋狂創客圈 Java 死磕系列

  • Java (Netty) 聊天程序【 億級流量】實戰 開源項目實戰

  • Netty 源碼、原理、JAVA NIO 原理
  • Java 面試題 一網打盡
  • 瘋狂創客圈 【 博客園 總入口 】

相關文章
相關標籤/搜索