前言:
對比了很多分佈式事務的框架(LCN,TCC-transaction,等等)決定還是採用seata來寫篇文章,採用的是SpringCloud微服務編碼
分佈式事務產生的歷史和背景這邊就不多敘述了,不太瞭解的朋友可以看我之前的文章,理論寫的比較多(2PC,TCC,本地消息事務都有)。今天主要是帶大家用阿里開源框架去解決微服務中的核心問題,分佈式事務,以前同事公司也是用的這套框架,也因爲是阿里的產品,所以比較放心。
seata介紹:
簡易可擴展的自治式分佈式事務管理框架。阿里巴巴中間件團隊發起了開源項目 Fescar(Fast & EaSy Commit And Rollback, Fescar),和社區一起共建分佈式事務解決方案。爲了達到適用於所有的分佈式事務業務場景的目標,也爲了社區更中立、更開放、生態更加豐富,社區核心成員們決定進行品牌升級,改名 Seata。Seata 意爲:Simple Extensible Autonomous Transaction Architecture,是一套一站式分佈式事務解決方案。
seata組件:
Transaction Coordinator(TC):管理全局的分支事務的狀態,用於全局性事務的提交和回滾。
Transaction Manager(TM):事務管理器,用於開啓全局事務、提交或者回滾全局事務,是全局事務的開啓者。
Resource Manager(RM):資源管理器,用於分支事務上的資源管理,向TC註冊分支事務,上報分支事務的狀態,接受TC的命令來提交或者回滾分支事務
原理分析:
Seata的原理可以用2PC去理解,通過seata組件我們大概就能理解它嗯嗯意思,事務的最終提交或者回滾由事務管理器來監聽,解釋一下2PC,比如:你週末約着和兩朋友去吃火鍋,然後你問朋友A有時間沒有,A說有時間,再問B朋友,B朋友說:我也想去呀,項目上線,週末要加班,沒時間。這時候可能你就不太想去了。所有就取消活動了。這裏就可以把你自己當做事務管理器TM,也是事務的發起方.你朋友可以當做RM 資源管理器。兩階段也就是指的 : 第一階段你去問看看他們有沒有時間,然後他們反饋消息給你,第二階段就是你收到所有人的消息後,如果有不同意的,那麼就取消活動。
原理圖如下:
seata集成Springcloud:
-
1.seata服務器的搭建:大家可以去git上下載 :
-
https://github.com/seata/seata/releases,
國外鏡像比較慢,我這邊提供了CSDN地址:
https://download.csdn.net/download/zzxwx/12113503
-
2.進入解壓包的bin目錄啓動服務 命令: sh seata-server.sh -9 8091 -m file 控制檯輸出成功啓動server的字樣代表啓動成功
-
3.業務代碼的集成, 我這邊測試的項目結構如下:
5.rueka 作爲註冊中心,goods商品模塊,order訂單模塊,這邊我模擬用戶下單減商品庫存的操作。所以這邊發起方就可以理解爲訂單模塊,訂單模塊調用商品模塊,訂單記錄表插入一條記錄,商品模塊扣減商品庫存
6.引入seata jar包
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-seata</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
7.換數據源爲阿里的代理數據源,因爲失敗了,需要記錄日誌回滾
源碼查看DataSourceConfig.java
8.主要是作爲錯誤記錄日誌,改寫原有數據源的方式
9.項目resource路徑下添加 registry.conf 和 file.conf regist.conf 中的
type=file 其實也支持 redis zk等等
10.文件file.conf 文件中的server 裏的屬性修改爲:vgroup_mappgin.自己的項目名-fesacar-service-group="default"
11.數據庫添加表 undo_log 用來記錄日誌,事務處理失敗後,用來回滾的日誌
12.然後發起方的service添加主鍵 @GlobalTransactional
13.至此所有集成完畢,可以開始愉快地測試代碼了訪問 order模塊 /userDownUser 可以測試下單 num爲100時候爲異常測試 查看order 和goods表的數據是否同時成功和失敗
最後感謝大家的閱讀,祝大家新年快樂,相親的能成功~
天冷碼字不易,你們的支持是我最大的動力,年後會給大家帶來面試題分析,敬請期待~