【微服務】6、限流 熔斷

線程隔離與容錯處理

本視頻主要講解了在購物車業務中,因商品微服務響應慢導致的問題及解決方案,重點介紹了線程隔離后查詢購物車業務不可用的情況,以及如何通過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 classFallback 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功能不止于此,瀏覽器中還顯示有熱點規則、系統規則、授權規則等多種控制功能,雖強大但使用相對較少。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/65433.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65433.shtml
英文地址,請注明出處:http://en.pswp.cn/web/65433.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

springboot+vue使用easyExcel實現導出功能

vue部分 // 導出計算數據exportDataHandle(id) {this.$http({url: this.$http.adornUrl(/xxx/xxx/exportCalDataExcel),method: post,data: this.$http.adornData({id: id}),responseType: blob, // 重要:告訴axios我們希望接收二進制數據}).then(({data}) > {c…

25年01月HarmonyOS應用基礎認證最新題庫

判斷題 “一次開發,多端部署”指的是一個工程,一次開發上架,多端按需部署。為了實現這一目的,HarmonyOS提供了多端開發環境,多端開發能力以及多端分發機制。 答案:正確 《鴻蒙生態應用開發白皮書》全面闡釋…

ELK實戰(最詳細)

一、什么是ELK ELK是三個產品的簡稱:ElasticSearch(簡稱ES) 、Logstash 、Kibana 。其中: ElasticSearch:是一個開源分布式搜索引擎Logstash :是一個數據收集引擎,支持日志搜集、分析、過濾,支持大量數據…

Dubbo-筆記隨記一

一、實戰 1 . Springboot整合 1.1 服務提供者 1.1.1 依賴 <dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>3.2.10</version></dependency><dependency&g…

git tag

文章目錄 1.簡介2.格式3.選項4.示例參考文獻 1.簡介 同大多數 VCS 一樣&#xff0c;Git 也可以對某一時間點的版本打上標簽&#xff0c;用于版本的發布管理。 一個版本發布時&#xff0c;我們可以為當前版本打上類似于 v.1.0.1、v.1.0.2 這樣的 Tag。一個 Tag 指向一個 Commi…

ETCD滲透利用指南

目錄 未指定使用put操作報錯 未指定操作版本使用get報錯 首先etcd分為兩個版本v2和v3&#xff0c;不同的API結果無論是訪問URL還是使用etcdctl進行通信&#xff0c;都會導致問題&#xff0c;例如使用etcdctl和v3進行通信&#xff0c;如果沒有實名ETCDCTL_API3指定API版本會直接…

使用VUE3創建個人靜態主頁

使用VUE3創建個人靜態主頁 &#x1f31f; 前言&#x1f60e;體驗&#x1f528; 具體實現? 核心功能&#x1f3d7;? 項目結構&#x1f680; 用這個項目部署 Git Page &#x1f4d6; 參考 &#x1f31f; 前言 作為開發者或者內容創作者&#xff0c;我們經常需要創建靜態網頁&a…

Lua語言中常用的字符串操作函數

string.sub(s, i, j) 功能: 截取字符串 s 中從位置 i 到位置 j 的子字符串。 local s "Hello, Lua!" print(string.sub(s, 1, 5)) -- 輸出 "Hello" print(string.sub(s, 8, 11)) -- 輸出 "Lua!" string.len(s) 功能&#xff1a;將字符串長度…

llm大模型學習

llm大模型 混合專家模型&#xff08;MoE&#xff09;MoE結構路由router專家expertSwitch Transformer的典型MOE模型最后MoE總結 混合專家模型&#xff08;MoE&#xff09; 模型規模是提升LLM大語言模型性能的關鍵因素&#xff0c;但也會增加計算成本。Mixture of Experts (MoE…

Linux入門攻堅——43、keepalived入門-1

Linux Cluster&#xff08;Linux集群的類型&#xff09;&#xff1a;LB、HA、HPC&#xff0c;分別是負載均衡集群、高可用性集群、高性能集群。 LB&#xff1a;lvs&#xff0c;nginx HA&#xff1a;keepalived&#xff0c;heartbeat&#xff0c;corosync&#xff0c;cman HP&am…

HTML5 動畫效果:淡入淡出(Fade In/Out)詳解

HTML5 動畫效果&#xff1a;淡入淡出&#xff08;Fade In/Out&#xff09;詳解 淡入淡出&#xff08;Fade In/Out&#xff09;是一種常見的動畫效果&#xff0c;使元素逐漸顯現或消失&#xff0c;增強用戶體驗。以下是淡入淡出的詳細介紹及實現示例。 1. 淡入淡出的特點 平滑…

YOLOv8/YOLOv11改進 添加CBAM、GAM、SimAM、EMA、CAA、ECA、CA等多種注意力機制

目錄 前言 CBAM GAM SimAM EMA CAA ECA CA 添加方法 YAML文件添加 使用改進訓練 前言 本篇文章將為大家介紹Ultralytics/YOLOv8/YOLOv11中常用注意力機制的添加&#xff0c;可以滿足一些簡單的漲點需求。本文僅寫方法&#xff0c;原理不多講解&#xff0c;需要可跳…

Go語言的 的多態性(Polymorphism)基礎知識

Go語言的多態性&#xff08;Polymorphism&#xff09;基礎知識 在編程語言中&#xff0c;多態性是一個核心概念&#xff0c;它允許同一接口被不同的數據類型所實現&#xff0c;從而在不影響代碼結構的情況下增強代碼的靈活性和可擴展性。在Go語言中&#xff0c;多態性通過接口…

nginx運行之后顯示的是上一個項目,如何解決

重啟 Nginx 使配置生效 修改 Nginx 配置后&#xff0c;你需要重新加載或重啟 Nginx&#xff0c;以使配置生效。執行以下命令&#xff1a; sudo nginx -t # 測試配置是否正確 sudo systemctl restart nginx # 重啟 Nginxbash 復制代碼 檢查瀏覽器緩存 瀏覽器可能緩存了舊…

與 Oracle Dataguard 相關的進程及作用分析

與 Oracle Dataguard 相關的進程及作用分析 目錄 與 Oracle Dataguard 相關的進程及作用分析與 Oracle Dataguard 相關的進程及作用分析一、主庫的進程1、LGWR 進程2、ARCH進程3、LNS 進程 二、備庫的進程1、RFS 進程2、ARCH3、MRP&#xff08;Managed Recovery Process&#x…

【C語言】_指針與數組

目錄 1. 數組名的含義 1.1 數組名與數組首元素的地址的聯系 1.3 數組名與首元素地址相異的情況 2. 使用指針訪問數組 3. 一維數組傳參的本質 3.1 代碼示例1&#xff1a;函數體內計算sz&#xff08;sz不作實參傳遞&#xff09; 3.2 代碼示例2&#xff1a;sz作為實參傳遞 3…

解決“KEIL5軟件模擬仿真無法打印浮點數”之問題

在沒有外部硬件支持時&#xff0c;我們會使用KEIL5軟件模擬仿真&#xff0c;這是是仿真必須要掌握的技巧。 1、點擊“Project”&#xff0c;然后點擊“Options for target 項目名字”&#xff0c;點擊“Device”,選擇CPU型號。 2、點擊“OK” 3、點擊“Target”,勾選“Use Mi…

donet (MVC)webAPI 的接受json 的操作

直接用對象來進行接收&#xff0c;這個方法還不錯的。 public class BangdingWeiguiJiluController : ApiController{/// <summary>/// Json數據錄入錯誤信息/// </summary>/// <param name"WeiguiInfos"></param>/// <returns></r…

設計模式與游戲完美開發(3)

更多內容可以瀏覽本人博客&#xff1a;https://azureblog.cn/ &#x1f60a; 該文章主體內容來自《設計模式與游戲完美開發》—蔡升達 第二篇 基礎系統 第五章 獲取游戲服務的唯一對象——單例模式&#xff08;Singleton&#xff09; 游戲實現中的唯一對象 在游戲開發過程中…

pygame飛機大戰

飛機大戰 1.main類2.配置類3.游戲主類4.游戲資源類5.資源下載6.游戲效果 1.main類 啟動游戲。 from MainWindow import MainWindow if __name__ __main__:appMainWindow()app.run()2.配置類 該類主要存放游戲的各種設置參數。 #窗口尺寸 #窗口尺寸 import random import p…