微服務雪崩問題、Sentinel(請求限流、線程隔離、服務熔斷)、Seata分布式事務

文章目錄

  • 前言
  • 一、微服務保護
  • 二、Sentinel
    • 2.1 微服務整合
    • 2.2 簇點鏈路
    • 2.3 請求限流
    • 2.4 線程隔離
    • 2.5 服務熔斷
  • 三、分布式事務
    • 3.1 Seata
      • 3.1.1 Seata架構
      • 3.1.2 部署TC服務
      • 3.1.3 微服務集成Seata
    • 3.2 XA模式
    • 3.3 AT模式


前言

微服務之間為什么會雪崩?怎么解決雪崩問題?
如何采用Sentiel整合微服務實現請求限流、線程隔離以及服務熔斷問題。
怎么集成Seata解決微服務之間引發的分布式事務問題?


一、微服務保護

在這里插入圖片描述
在這里插入圖片描述
1、請求限流
限制訪問微服務的請求的并發量,避免服務因流量激增出現故障。
在這里插入圖片描述
2、線程隔離
艙壁模式,模擬船艙隔板的防水原理。通過限定每個業務能使用的線程數量而將故障業務隔離,避免故障擴散。
例如:查詢購物車的時候需要查詢商品,為了避免因商品服務出現故障導致購物車服務級聯失敗,我們可以把購物車業務中查詢商品的部分隔離起來,限制可用的線程資源,即便商品服務出現故障,最多導致查詢購物車業務故障,并且可用的線程資源也被限定在一定范圍,不會導致整個購物車服務崩潰。
在這里插入圖片描述

3、服務熔斷
由斷路器統計請求的異常比例或慢調用比例,如果超出閾值則會熔斷該業務,則攔截該接口的請求。
熔斷期間,所有請求快速失敗,全都走fallback邏輯。
在這里插入圖片描述

4、失敗處理
給業務編寫一個調用失敗時的處理的邏輯,稱為fallback。當調用出現故障(比如無線程可用)時,按照失敗處理邏輯執行業務并返回,而不是直接拋出異常。
在這里插入圖片描述

二、Sentinel

Sentinel是阿里巴巴開源的一款服務保護框架。
在這里插入圖片描述

2.1 微服務整合

1、引入sentinel依賴

<!--sentinel-->
<dependency><groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

2、配置控制臺。

spring:cloud: sentinel:transport:dashboard: localhost:8090  #訪問地址

3、訪問微服務塊的任意斷點,如訪問查詢購物車接口,sentinel的客戶端就會將服務訪問的信息提交到sentinel-dashboard控制臺

2.2 簇點鏈路

單機調用鏈路。是一次請求進入服務后經過的每一個被Sentinel監控的資源鏈。默認Sentinel會監控SpringMVC的每一個Endpoint(http接口)。限流、熔斷等都是針對簇點鏈路中的資源設置的。而資源名默認就是接口的請求路徑。
打開Sentinel的請求方式前綴,把請求方式 + 請求路徑作為簇點資源名。
在這里插入圖片描述

2.3 請求限流

在簇點鏈路后面點擊流控按鈕,即可對其做限流配置。
簇點資源的流量限制在了每秒6個,也就是最大QPS為6.在這里插入圖片描述

2.4 線程隔離

解決服務故障
實現步驟
1、OpenFeign整合Sentinel,為了開啟遠程調用feignclient作為簇點,可以被流量監控。

feign:sentinel:enabled: true # 開啟feign對sentinel的支持

2、配置線程隔離
在這里插入圖片描述

2.5 服務熔斷

請求失敗不應該拋異常,為了讓用戶體驗更好,可以返回一些默認數據或者友好提示,查詢失敗設置一個降級處理邏輯。
對于這種不太健康的接口,應該直接停止調用,避免影響到當前服務。也就是將接口熔斷。
實現步驟
1、編寫降級邏輯
給FeignClient編寫失敗后的降級邏輯兩種方式:

  • 方式一:FallbackClass,無法對遠程調用的異常做處理
  • 方式二:FallbackFactory,可以對遠程調用的異常做處理,我們一般選擇這種方式。
    步驟1:定義一個降級處理類ItemClientFallback,實現FallbackFactory。
@Slf4j
public class ItemClientFallback implements FallbackFactory<ItemClient> {@Overridepublic ItemClient create(Throwable cause) {return new ItemClient() {@Overridepublic List<ItemDTO> queryItemByIds(Collection<Long> ids) {log.error("遠程調用ItemClient#queryItemByIds方法出現異常,參數:{}", ids, cause);// 查詢購物車允許失敗,查詢失敗,返回空集合return CollUtils.emptyList();}@Overridepublic void deductStock(List<OrderDetailDTO> items) {// 庫存扣減業務需要觸發事務回滾,查詢失敗,拋出異常throw new BizIllegalException(cause);}};}
}

步驟2:編寫一個配置類,在配置類中將ItemClientFallback注冊為一個Bean。

public class DefaultFeignConfig {@Beanpublic Logger.Level feginLogLevel(){return Logger.Level.FULL;}@Beanpublic ItemClientFallbackFactory itemClientFallbackFactory(){return new ItemClientFallbackFactory();}
}

步驟3:在ItemClient接口中使用ItemClientFallbackFactory

@FeignClient(value = "item-service",fallbackFactory = ItemClientFallbackFactory.class)
public interface ItemClient {...}

2、服務熔斷
由斷路器統計服務調用的異常比例、慢請求比例,如果超出閾值則會熔斷該服務。即攔截訪問該服務的一切請求;而當服務恢復時,斷路器會放行訪問該服務的請求。
斷路器的工作狀態切換有一個狀態機來控制
在這里插入圖片描述

  • closed:關閉狀態,斷路器放行所有請求,并開始統計異常比例、慢請求比例。超過閾值則切換到open狀態
  • open:打開狀態,服務調用被熔斷,訪問被熔斷服務的請求會被拒絕,快速失敗,直接走降級邏輯。Open狀態持續一段時間后會進入half-open狀態
  • half-open:半開狀態,放行一次請求,根據執行結果來判斷接下來的操作。
    • 請求成功:則切換到closed狀態
    • 請求失敗:則切換到open狀態
      點擊控制臺中簇點資源后的熔斷按鈕,即可配置熔斷策略
      在這里插入圖片描述
  • RT超過200毫秒的請求調用就是慢調用
  • 統計最近1000ms內的最少5次請求,如果慢調用比例不低于0.5,則觸發熔斷
  • 熔斷持續時長20s

三、分布式事務

如果一個業務需要多個服務合作完成,而且每一個服務都有事務,多個事務必須同時成功或失敗,這樣的事務就是分布式事務。其中的每個服務的事務就是一個分支事務。整個業務稱為全局事務。
在這里插入圖片描述

3.1 Seata

參與事務的多個分支事務互相無感知,不知道彼此的執行狀態。找一個統一的事務協調者,與多個分支事務通信,檢測每個分支事務的執行狀態,保證全局事務下的每一個分支事務同時成功或失敗即可。
在這里插入圖片描述

3.1.1 Seata架構

  • TC (Transaction Coordinator) - 事務協調者:維護全局和分支事務的狀態,協調全局事務提交或回滾。
  • TM (Transaction Manager) - 事務管理器:定義全局事務的范圍、開始全局事務、提交或回滾全局事務。
  • RM (Resource Manager) - 資源管理器:管理分支事務,與TC交談以注冊分支事務和報告分支事務的狀態,并驅動分支事務提交或回滾。
    在這里插入圖片描述

3.1.2 部署TC服務

TC服務是事務協調中心,是一個獨立的微服務,需要單獨部署。
基于數據庫持久化存儲,采用docker部署seata
具體部署不做說明。

3.1.3 微服務集成Seata

參與分布式事務的每一個微服務都需要集成Seata
實現步驟
1、引入依賴
為了方便各個微服務集成seata,需要把seata配置共享到nacos

<!--統一配置管理--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!--讀取bootstrap文件--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency><!--seata--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId></dependency>

2、在nacos中配置seata
在這里插入圖片描述
3、在微服務中添加bootstrap.yaml文件,定義nacos配置信息。
4、添加數據庫表。seata的客戶端在解決分布式事務的時候需要記錄一些中間數據,保存在數據庫中。要講數據庫表分別導入不同的微服務當中。
5、測試分布式事務
在訂單業務方法上的@Transactional注解改為Seata提供的**@GlobalTransactional**
@GlobalTransactional注解就是在標記事務的起點,將來TM就會基于這個方法判斷全局事務范圍,初始化全局事務。

3.2 XA模式

Seata支持四種不同的分布式事務解決方案: XA、TCC、 AT、SAGA
XA 規范描述了全局的TM與局部的RM之間的接口,幾乎所有主流的數據庫都對 XA 規范提供了支持。
A是規范,目前主流數據庫都實現了這種規范,實現的原理都是基于兩階段提交。
在這里插入圖片描述優點

  • 事務的強一致性,滿足ACID原則
  • 常用數據庫都支持,實現簡單,并且沒有代碼侵入

缺點:

  • 因為一階段需要鎖定數據庫資源,等待二階段結束才釋放,性能較差
  • 依賴關系型數據庫實現事務

seata中實現XA
1、Nacos中的共享shared-seata.yaml配置文件中設置

seata:data-source-proxy-mode: XA

2、@GlobalTransactional標記分布式事務的入口方法

3.3 AT模式

Seata主推的是AT模式,AT模式同樣是分階段提交的事務模型,不過缺彌補了XA模型中資源鎖定周期過長的缺陷。
在這里插入圖片描述
流程圖
在這里插入圖片描述AT模式與XA模式最大的區別是什么?
XA模式一階段不提交事務,鎖定資源;AT模式一階段直接提交,不鎖定資源。
XA模式依賴數據庫機制實現回滾;AT模式利用數據快照實現數據回滾。
XA模式強一致;AT模式最終一致

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

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

相關文章

MySQL存儲過程淺析

存儲過程 定義&#xff1a; 存儲過程是一組為了完成特定功能的SQL語句&#xff0c;是由一些SQL語句組成的代碼塊&#xff0c;這些代碼塊像方法一樣實現一些功能&#xff08;對單表或多表的增刪改查&#xff09;&#xff0c;然后給代碼塊起一個名字&#xff0c;用到的時候再調用…

Oracle體系結構初探:數據庫啟動與停止

往期內容 參數管理 控制文件添加 啟動 在啟動Oracle數據庫時&#xff0c;我們一般會使用如下命令&#xff1a; startup 雖然命令只有一個&#xff0c;但其中卻是經歷了3個階段&#xff0c;從下面執行 startup 命令返回也可以看出來。 總結為3個階段&#xff1a; nomount&…

ubuntu下python導入.so庫

ubuntu下python導入.so庫 文章目錄 ubuntu下python導入.so庫1. 什么是.so文件&#xff1f;2. 使用python腳本編譯.so庫文件Reference 最近遇到了python導入c編譯的 .so庫的問題&#xff0c;發覺挺有意思&#xff0c;于是寫下這篇blog以作記錄。 1. 什么是.so文件&#xff1f; …

【簡單介紹下深度神經網絡】

&#x1f3a5;博主&#xff1a;程序員不想YY啊 &#x1f4ab;CSDN優質創作者&#xff0c;CSDN實力新星&#xff0c;CSDN博客專家 &#x1f917;點贊&#x1f388;收藏?再看&#x1f4ab;養成習慣 ?希望本文對您有所裨益&#xff0c;如有不足之處&#xff0c;歡迎在評論區提出…

句柄降權繞過CallBacks檢查

看到前輩們相關的文章&#xff0c;不太明白什么是句柄降權&#xff0c;于是專門去學習一下&#xff0c;過程有一點波折。 句柄降權 什么是句柄 當一個進程利用名稱來創建或打開一個對象時&#xff0c;將獲得一個句柄&#xff0c;該句柄指向所創建或打開的對象。以后&#xf…

什么是DNS緩存投毒攻擊,有什么防護措施

隨著企業組織數字化步伐的加快&#xff0c;域名系統&#xff08;DNS&#xff09;作為互聯網基礎設施的關鍵組成部分&#xff0c;其安全性愈發受到重視。然而&#xff0c;近年來頻繁發生的針對DNS的攻擊事件&#xff0c;已經成為企業組織數字化發展中的一個嚴重問題。而在目前各…

go string 實現

在go中string是不可變的&#xff0c;這意味著對string發生改變的操作實際上都是通過分配新的string去實現的 在string內存分配上&#xff0c;對于小對象分配到棧&#xff0c;大對象分配到堆中 string在go中的結構其實很簡單&#xff0c;就是一個指向實際數據的指針以及字符串…

用于與 HTTP 服務器通信的函數

用于與 HTTP 服務器通信的函數 Plant Simulation 提供了許多使用 HTTP 協議與 HTTP 服務器通信的函數。可使用這些函數來發送 HTTP 請求、發送數據和從 HTTP 響應中接收數據&#xff0c;以及在 HTTP 服務器上創建和刪除資源&#xff1a; httpGetRequest 發送 GET 請求。請求…

在 Visual Studio 2022 (VS2022) 中刪除 Git 分支的步驟如下

git branch -r PS \MauiApp1> git push origin --delete “20240523備份” git push origin --delete “20240523備份”

PCL 常用小知識

文章目錄 一、時間計算二、實現類似`pcl::PointCloud::Ptr`和`pcl::PointCloud`的兩個類相互轉換三、查找點云的x,y,z的極值四、知道需要保存點的索引,從原點云中拷貝點到新點云五、從點云里刪除和添加點六、對點云進行全局或局部變換七、鏈接兩個點云字段(兩點云大小必須相…

若依 ruoyi-vue 用戶賬號前后端參數校驗密碼 手機號 郵箱

前端 <el-dialog :title"title" :visible.sync"open" width"800px" append-to-body><el-form ref"form" :model"form" :rules"rules" label-width"120px"><el-row><el-col :span…

Vue3骨架屏(Skeleton)

效果如下圖&#xff1a;在線預覽 APIs 參數說明類型默認值必傳animated是否展示動畫效果booleantruefalsebutton是否使用按鈕占位圖boolean | SkeletonButtonPropsfalsefalseavatar是否顯示頭像占位圖boolean | SkeletonAvatarPropsfalsefalseinput是否使用輸入框占位圖boolea…

SOLIDWORKS二次開發服務商 慧德敏學

SOLIDWORKS是一套三維設計軟件, 采用特征建模、變量化驅動可方便地實現三維建模、裝配和生成工程圖。SOLIDWORKS軟件本身所具有的交互方式, 可以使用戶對已生成模型的尺寸、幾何輪廓和相互約束關系隨時進行修改, 而不需要編程。但要實現設計意義上的變量化繪圖和系列化設計, 需…

java-查詢字符串當中是否包含中文

文章目錄 前言java-查詢字符串當中是否包含中文 前言 如果您覺得有用的話&#xff0c;記得給博主點個贊&#xff0c;評論&#xff0c;收藏一鍵三連啊&#xff0c;寫作不易啊^ _ ^。 ??而且聽說點贊的人每天的運氣都不會太差&#xff0c;實在白嫖的話&#xff0c;那歡迎常來啊…

軟考系統架構師一些知識點記錄-1

個人隨筆 (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu) 引言 準備去參加軟考的考試&#xff0c;但對一些概念掌握的還不夠&#xff0c;借此機會&#xff0c;整理記錄一二&#xff0c;便于自己理解掌握。 知識范圍 感覺不夠清晰的部分主要是第三篇和第四篇的部分。…

國際頂會認可!KaiwuDB 論文入選 ICDE 2024

導 讀 近日&#xff0c;KaiwuDB 與中國人民大學合作的論文 FOSS: A Self-Learned Doctor for Query Optimizer 被數據庫領域頂會The 40th IEEE International Conference on Data Engineering (ICDE 2024) 錄用啦! 論文中提出了具備自學習、自診斷能力的查詢優化器 FOSS&…

USB官方文檔怎么下載

直接登錄USB官網"https://usb.org/" 如&#xff0c;我需要查找與USB device class相關的文檔 點擊搜索后就能找到。 學習還是要以官方文檔為主&#xff0c;博客上的介紹不可信&#xff0c;USB協議規范很重要!

商品發布功能

文章目錄 1.SPU和SKU介紹1.SPU2.SKU3.兩者之間的關系 2.完成商品發布界面1.組件引入1.commoditylaunch.vue 引入到 src/views/modules/commodity下2.multiUpload.vue 引入到 src/components/upload/multiUpload.vue 2.創建菜單1.創建目錄2.創建菜單&#xff0c;注意菜單路由要匹…

go語言中同一for循環體內的多個初始變量和多個自增變量用法示例

在go語言的for循環體中&#xff0c;我們可以同時初始多個變量&#xff0c; 也可以同時多多個變量進行自增/自減操作&#xff0c; 用法如下&#xff1a; for 后面的多個初始化變量使用的是逗號分隔的批量賦值操作&#xff0c;多個變量自增自減使用 加減運算符和逗號分隔 字符…

MySQL之性能剖析和Schema與數據類型優化(一)

性能剖析總結 1.定義性能最有效的方法是響應時間2.如果無法測量就無法有效地優化&#xff0c;所以性能優化工作需要基于高質量、全方位及完整的響應時間測量3.測量的最佳開始點是應用程序&#xff0c;而不是數據庫。即使問題出在底層的數據庫&#xff0c;借助良好的測量也可以…