1. 程式人生 > 實用技巧 >Spring Cloud - ribbon、hystrix、gateway

Spring Cloud - ribbon、hystrix、gateway

目錄

1 ribbon 負載均衡元件

實現原理

攔截器

攔截了 openfeign,篡改了請求的訪問地址,獲取了被訪問服務叢集下面的所有節點的例項資訊,執行一個載入輪詢策略的方法,通過這個輪詢策略從所有獲取的例項資訊當中,選擇一個例項。

IRule 介面

客戶端負載均衡和服務端負載均衡的區別

客戶端負載均衡 訪問由請求發起者決定

服務端負載均衡 訪問由 gateway、nginx 決定

如何配置不同的輪詢策略

在 application.yml 中進行輪詢規則的配置,而且可以給不同的服務指定不同的策略。

常見的負載均衡演算法

  1. 隨機演算法,顧名思義就是從可用的服務節點中,隨機挑選一個節點來訪問。

  2. 輪詢演算法,顧名思義就是按照固定的順序,把可用的服務節點,挨個訪問一次。

  3. 輪詢演算法能夠保證所有節點被訪問的概率相同,而加權輪詢演算法是在此基礎上,給每個節點賦予一個權重,從而使每個節點被訪問到的概率不同,權重大的節點被訪問的概率就高,權重小的節點被訪問的概率就小。

  4. 最少活躍連線演算法,顧名思義就是每一次訪問都選擇連線數最少的節點。因為不同節點處理請求的速度不同,使得同一個服務消費者同每一個節點的連線數都不相同。連線數大的節點,可以認為是處理請求慢,而連線數小的節點,可以認為是處理請求快。所以在挑選節點時,可以以連線數為依據,選擇連線數最少的節點訪問。

2 hystrix

基本介紹

豪豬

斷路器:在分散式體系下起到一個服務保護的作用。

服務降級

當 A 服務呼叫 B 服務時,B 服務發生 500 伺服器異常,A 服務的斷路器檢測到 500 之後,會給出一個正確的響應結果(商品查詢失敗來代替不友好的 500 伺服器錯誤資訊)。

服務質量的降級,並不是說 B 服務不可用了。

程式碼實現

openfeign 已經集成了 hystrix 斷路器功能

  1. feign 客戶端註解裡面增加 fallback 屬性
  2. 在同級包下實現一個 feignFallBack 類,作為服務降級的處理類,並實現 feign 的介面,不要忘記加 component 註解進行例項化。
  3. 在 application.xml 中開啟服務降級的配置

熔斷機制

在一定時間範圍內,請求錯誤的次數佔總請求數的百分比,超過了一定的閾值(85%),開啟熔斷開關,開關一旦開啟以後,後面所有的請求都發不過去了,會在一定時間內熔斷開關處於一個半開狀態,讓一部分請求可以傳送過去,如果失敗的請求數比例依然很高,就從半開變為全開,所有的請求都過不去。如果請求失敗比例恢復正常,就從半開變為關閉。

工作流程

請求 -> 是否使用快取 -> 是否啟用斷路器 -> 訊號量/執行緒池限流 -> 執行服務

快取 之後的 流程 可能會出現 服務降級。

快取機制

相同的請求直接返回快取中的資料

限流

訊號量限流

有 10 個訊號量,一個請求傳送需要消耗一個訊號量,直到訊號量變為 0,後面的請求拿不到訊號量,就直接返回降級訊息,請求執行完畢以後,訊號量加 1。

執行緒池限流

hystrix 會建立一個工作執行緒池,初始有 10 個執行緒可以使用,一個請求需要佔用一個執行緒,請求完畢之後會釋放這個執行緒,如果執行緒池沒有空閒執行緒了,就返回降級訊息。

應用場景

請求錯誤,丟擲異常,異常過多對伺服器的壓力開銷比較大。

防止出現服務雪崩,導致整個服務的呼叫鏈路全部癱瘓.

3 gateway

基本介紹

第一代閘道器 zuul,效能較差,同步呼叫的方式

第二代閘道器 gateway,效能不錯,非同步呼叫的方式

支援動態路由

動態路由配置:lower-case-service-id

服務名大小寫配置:locator.enabled

開啟閘道器日誌:loggin.level.springframework.cloud.gateway=debug

自定義全域性過濾器

實現網關同一鑑權

閘道器限流(需要配合 redis 一起使用)

服務叢集級別
介面級別
使用者級別
ip級別