線程隔離與容錯處理
本視頻主要講解了在購物車業務中,因商品微服務響應慢導致的問題及解決方案,重點介紹了線程隔離后查詢購物車業務不可用的情況,以及如何通過Fallback邏輯進行緩解,包括配置Feign調用為簇點資源、添加Fallback邏輯的步驟及驗證過程。
1. 線程隔離問題回顧與解決方案引出
問題分析
- 購物車業務需查詢商品信息,商品微服務響應慢,并發高時會拖慢購物車服務,故對購物車業務做線程隔離,限制使用少量線程資源。
- 隔離后查詢購物車業務不可用,直接報錯,前端無法獲取最新數據,雖保護了微服務,但被隔離業務資源耗盡后不可用影響用戶體驗。
解決方案
使用Fallback邏輯,給查詢購物車中查商品的邏輯添加Fallback,當資源耗盡被拒絕時,走Fallback邏輯,提供默認數據或友好提示給用戶,提升用戶體驗。
2. 配置Feign調用成為簇點資源及添加Fallback方式
配置Feign調用為簇點資源
在application.yml中配置feign.sentinel.enabled = true(默認false),開啟Feign的Sentinel監控,使Feign調用成為鏈路中的資源,以便對其進行限流或線程隔離操作。
添加Fallback邏輯
-
方式選擇:Feign客戶端添加Fallback有
Fallback class
和Fallback Factory
兩種方式,推薦使用FALLBACKFACTORY,因其更靈活,可提前處理異常,較為優雅。 -
具體步驟
-
- 定義Fallback factory:實現FallbackFactory接口,泛型指定為要處理的Feign客戶端,如user client。在create方法中創建對應Feign客戶端的Fallback對象,實現Feign客戶端接口方法,編寫失敗處理邏輯,如返回默認數據、記錄日志等。
- 注冊Fallback factory為bean:在配置類中聲明一個bean,類型為定義的Fallback factory,返回new的factory對象。
- 指定Fallback factory屬性:在對應的Feign客戶端注解里,將fallbackFactory屬性指定為定義好的Fallback factory。
3. 定義item client的Fallback factory及相關處理
定義item client的Fallback factory
- fallback包中創建ItemClientFallbackFactory類,實現FallbackFactory接口,泛型為ItemClient。
- 實現create方法創建ItemClient的Fallback對象,編寫查商品接口失敗處理邏輯,如查商品失敗返回空集合兜底,減庫存業務先拋出異常后續處理。
將Fallback factory設為對象并應用
- 在API模塊的DefaultConfig配置類中注冊ItemClientFallbackFactory為bean。
- 在ItemClient的注解中指定fallbackFactory為定義的ItemClientFallbackFactory,完成Fallback邏輯定義。
4. 測試與總結
測試過程
- 完成改造后重啟購物車服務,添加流控規則(如限制線程數為5或6),對查商品的遠程Feign調用做線程隔離。
- 高并發請求購物車服務,查詢不拋異常但商品信息可能查不到(查失敗返回空信息),修改不受影響,說明查詢失敗時走了Fallback邏輯,給用戶友好結果。
實現Fallback步驟總結
- 開啟Feign客戶端資源監控,將Feign遠程調用作為簇點鏈路資源。
- 編寫Fallback邏輯,包括定義Fallback factory、注冊為bean、在Feign客戶端指定factory屬性。
知識拓展
Fallback不僅可結合限流使用,后續還可結合熔斷使用
服務熔斷
服務熔斷的作用與需求
回顧服務中斷與線程隔離
在購物車微服務查詢購物車業務中,上節課實現了對查詢商品服務遠程調用的線程隔離,限制其使用線程數量,防止商品服務故障耗盡購物車服務線程資源,避免拖垮購物車服務。
線程隔離存在的問題與熔斷需求
盡管做了線程隔離,但每次請求仍進行耗時遠程調用,若服務掛掉還繼續請求會浪費資源。因此,需要服務熔斷,即當服務故障或異常比例高時,拒絕發起遠程調用,直接走Fallback,避免資源浪費。同時,服務恢復正常后應取消熔斷。
斷路器概念引入
實現熔斷和恢復涉及復雜邏輯,斷路器可幫助實現該功能,其原理類似電路中的保險絲和空氣開關。
斷路器原理
斷路器狀態機
斷路器內部有狀態機,包含close、open和half open三個狀態。默認處于close狀態,此時所有請求正常訪問,同時監控請求的異常比例或慢請求比例(可配置)。
狀態切換機制
- 若異常比例或慢請求比例過高達到閾值,從close狀態進入open狀態,攔截所有請求,直接快速失敗走Fallback。open狀態為臨時狀態,持續時間可配置。
- open狀態到期后進入half open狀態,放行一次請求檢查服務是否恢復。若請求依然異常或慢,則切回open狀態;若成功,則進入close狀態放行請求并進行下一輪統計。
配置方式
在Sentinel控制臺進行配置,找到要設置的資源(如遠程調用),點擊后面的熔斷按鈕,在彈出窗口填寫熔斷規則。
熔斷策略及參數
熔斷策略介紹
有慢調用比例、異常比例、異常數三種策略。
慢調用比例策略參數
選定慢調用比例后,需設置最大響應時間(如200ms,超過此時間算慢)、慢調用比例閾值(如0.5,即50%)、熔斷時長(如20秒,熔斷期間所有請求走Fallback)、最小請求數量(如5次,統計這5次內的比例是否達標)、統計時長(如1秒,在1秒內請求達到一定次數進行統計)。異常比例和異常數策略類似,異常數策略是固定數量達到閾值就熔斷。
熔斷測試
測試準備
打開JMETER查看未加熔斷時的請求情況,如最大響應時長590ms,最小22ms,平均63ms,準備加入熔斷后對比效果。
配置熔斷規則
按慢調用配置熔斷規則,以500ms為慢調用判斷標準(超過200ms算慢),閾值0.5,熔斷時長20秒(方便觀測效果),最小請求數量5,統計時長1秒,可同時配置多個策略。
測試過程與結果
每秒發100個請求,因超時請求會被熔斷。熔斷后響應速度快,如price為空、狀態為舊,未查到最新商品信息,因為根本未進行查商品的遠程調用。熔斷結束后(超過20秒會放行一次請求)再次查詢能查到商品最新信息,若放行請求發現服務仍不好則再次熔斷,如此循環,可大大降低響應時間。
熔斷總結與拓展
熔斷總結
服務熔斷是對服務的保護,降低服務消耗和資源浪費,配置方式是在控制臺找到資源點擊熔斷按鈕填寫規則,包括基于慢調用、異常、異常數等設置比例、熔斷時間、請求數量、統計數量和時長等,其余工作由系統自動完成。
Sentinel其他功能提及
Sentinel功能不止于此,瀏覽器中還顯示有熱點規則、系統規則、授權規則等多種控制功能,雖強大但使用相對較少。