學(xué)習(xí)記錄之Nacos及Seata
Seata?是一款開源的分布式事務(wù)解決方案,致力于在微服務(wù)架構(gòu)下提供高性能和簡單易用的分布式事務(wù)服務(wù)
也是Spring Cloud Alibaba提供的組件
Seata官方文檔
https://seata.io/zh-cn/
更多信息可以通過官方文檔獲取
為什么需要Seata
我們之前學(xué)習(xí)了單體項目中的事務(wù)
使用的技術(shù)叫Spring聲明式事務(wù)
能夠保證一個業(yè)務(wù)中所有對數(shù)據(jù)庫的操作要么都成功,要么都失敗,來保證數(shù)據(jù)庫的數(shù)據(jù)完整性
但是在微服務(wù)的項目中,業(yè)務(wù)邏輯層涉及遠程調(diào)用,當前模塊發(fā)生異常,無法操作遠程服務(wù)器回滾
這時要想讓遠程調(diào)用也支持事務(wù)功能,就需要使用分布式事務(wù)組件Seata
事務(wù)的4個特性:ACID特性
原子性
一致性
隔離性
永久性
Seata保證微服務(wù)遠程調(diào)用業(yè)務(wù)的原子性
Seata將為用戶提供了 AT、TCC、SAGA 和 XA 事務(wù)模式,為用戶打造一站式的分布式解決方案。
Seata的運行原理(AT模式)

上面結(jié)構(gòu)是比較典型的遠程調(diào)用結(jié)構(gòu)
如果account操作數(shù)據(jù)庫失敗需要讓order模塊和storage模塊撤銷(回滾)操作
聲明式事務(wù)不能完成這個操作
需要使用Seata來解決

Seata構(gòu)成部分包含
事務(wù)協(xié)調(diào)器TC
事務(wù)管理器TM
資源管理器RM
AT模式運行過程
1.事務(wù)的發(fā)起方(TM)會向事務(wù)協(xié)調(diào)器(TC)申請一個全局事務(wù)id,并保存
2.Seata會管理事務(wù)中所有相關(guān)的參與方的數(shù)據(jù)源,將數(shù)據(jù)操作之前和之后的鏡像都保存在undo_log表中,這個表是seata組件規(guī)定的表,沒有它就不能實現(xiàn)效果,依靠它來實現(xiàn)提交(commit)或回滾(roll back)的操作
3.事務(wù)的發(fā)起方(TM)會連同全局id一起通過遠程調(diào)用運行資源管理器(RM)中的方法
4.RM接收到全局id,去運行指定方法,并將運行結(jié)果的狀態(tài)發(fā)送給TC
5.如果所有分支運行都正常,事務(wù)管理器(TM)會通過事務(wù)協(xié)調(diào)器通知所有模塊執(zhí)行數(shù)據(jù)庫操作,真正影響數(shù)據(jù)庫內(nèi)容,反之如果有任何一個分支模塊運行異常,都會通知TC,再由TC通知所有分支將數(shù)據(jù)庫操作回滾,恢復(fù)成運行之前的樣子
AT模式的運行有一個非常明顯的前提條件,這個條件不滿足,就無法使用AT模式
這個條件就是事務(wù)分支都必須是操作關(guān)系型數(shù)據(jù)庫(mysql\MariaDB\Oracle)
但是如果我們在業(yè)務(wù)過程中有一個節(jié)點操作的是Redis或前天非關(guān)系型數(shù)據(jù)庫時,就無法使用AT模式
除了AT模式之外還有TCC、SAGA 和 XA 事務(wù)模式
TCC模式
簡單來說,TCC模式就是自己編寫代碼完成事務(wù)的提交和回滾
TCC模式要求我們在每個參與事務(wù)的業(yè)務(wù)中編寫一組共3個方法
(prepare\commit\rollback)
prepare:準備?commit:提交?rollback:回滾
prepare方法是無論事務(wù)成功與否都會運行的代碼
commit當整體事務(wù)運行成功時運行的方法
rollback當整體事務(wù)運行失敗是運行的方法
優(yōu)點:雖然代碼是自己寫的,但是事務(wù)整體提交或回滾的機制仍然可用(仍然由TC來調(diào)度)
缺點:每個業(yè)務(wù)都要編寫3個方法來對應(yīng),代碼冗余,而且業(yè)務(wù)入侵量大
SAGA模式:
SAGA模式的思想是對應(yīng)每個業(yè)務(wù)邏輯層編寫一個新的類,可以設(shè)置指定的業(yè)務(wù)邏輯層方法發(fā)生異常時,運行當新編寫的類中的代碼
這樣編寫代碼不影響已經(jīng)編寫好的業(yè)務(wù)邏輯代碼
一般用于修改已經(jīng)編寫完成的老代碼
缺點是每個事務(wù)分支都要編寫一個類來回滾業(yè)務(wù),
會造成類的數(shù)量較多,開發(fā)量比較大
XA模式:
支持XA協(xié)議的數(shù)據(jù)庫分布式事務(wù),使用比較少
使用Seata
配置Seata,添加seata依賴<dependency> ? ?<groupId>io.seata</groupId> ? ?<artifactId>seata-spring-boot-starter</artifactId></dependency><!-- Seata完成分布式事務(wù)需要的兩個相關(guān)依賴(Seata需要下面兩個依賴中的資源) --><dependency> ? ?<groupId>com.github.pagehelper</groupId> ? ?<artifactId>pagehelper-spring-boot-starter</artifactId></dependency><dependency> ? ?<groupId>com.alibaba</groupId> ? ?<artifactId>fastjson</artifactId></dependency>
修改application.yml
注意同一個事務(wù)必須在同一個tx-service-group中,同時指定相同的seata地址和端口
要想啟動Seata非常簡單,只要在啟動業(yè)務(wù)的業(yè)務(wù)邏輯方法上添加專用的注解即可
下載Seata
https://github.com/seata/seata/releases
https://github.com/seata/seata/releases/download/v1.4.2/seata-server-1.4.2.zip
啟動seata
seata也是java開發(fā)的,啟動方式和nacos很像,它要求配置環(huán)境變量中Path屬性值有java的bin目錄路徑
解壓后路徑不要用中文,不要用空格,也是解壓之后的bin目錄下

在路徑上輸入cmd進入dos窗口:
F:\tools\seata\seata-server-1.4.2\bin>seata-server.bat -h 127.0.0.1 -m file
要想啟動測試,先啟動Nacos,在seata不關(guān)閉的前提下:利用knife4j訪問business模塊,否則無法觸發(fā)事務(wù)效果,business模塊是seata事務(wù)的起點
在windows系統(tǒng)中運行seata可能出現(xiàn)不穩(wěn)定的情況,重啟seata即可解決
根據(jù)是否發(fā)生隨機異常,來判斷seata是否有效:
如果seata啟動時發(fā)送內(nèi)存不足的錯誤,可以參考下面的文章解決:
https://blog.csdn.net/he_lei/article/details/116229467