阿里分散式事務seata入門(採坑)
1. 阿里分散式事務seata入門(採坑)
1.1. 前言
seata
是feascar
改名而來,這是阿里在19年年初開源出來的分散式事務框架,當初剛出來的時候就想研究下了,一直拖到了現在,目前是0.8.0
版本,看版本就知道這還是個比較新的專案,但現在已經有上萬個Star了,可見阿里的影響力。但是雖然有阿里背書,該挖坑還得挖,它宣稱整合它比較簡單,導致的是現在它的文件優點殘缺不全,好幾個文件標題點進去都沒內容,不知道為什麼刪了,可能是更新比較快,文件跟不上節奏索性刪了[手動滑稽]
1.2. 快速開始
1.2.1. 找Demo
- 一般來講我們要整合這種第三方中介軟體肯定要去找官方的demo,在官方文件下面,我找到了Seata Samples,看版本目前都是
0.8.0
1.2.2. 目錄分析
因為我公司用的SpringCloud那一套,沒有用dubbo,所以關於dubbo的我就沒運行了
- 看它例子的目錄結構,我們也能夠知道它大概執行的是啥
這裡首先要關注其實是文件,雖然少的可憐,但總算找到一個,可以直接點這裡
1.2.3. 執行springboot-mybatis
- 我首先執行的是依賴最少的
springboot-mybatis
,只需要開啟個服務端,配置好本地資料庫,建好表就可以運行了,這個其實沒什麼好說的,我執行的也很順利,只需要執行該目錄下sql目錄下的all_in_one.sql
裡的所有語句,就會幫你建好資料庫插入基本資料,至於服務端的下載可以點選這裡下載 - window系統直接雙擊執行上述服務端解壓包裡的
seata-server.bat
,liunx系統執行seata-server.sh
這個,它預設開啟8091
埠,配置檔案在/conf
目錄下,主要需要修改的是file.conf
和refistry.conf
,之後會講到 如下圖目錄下除了
common
不需要執行,其他四個都執行起來,然後呼叫localhost:8084/api/business/purchase/commit
,檢視資料庫會發現order表添加了資料,storage表扣減了庫存,account里扣減了錢
再是測試回滾的情況
呼叫如上介面
localhost:8084/api/business/purchase/rollback
account
系統
實際上是對特殊的使用者拋了個異常導致的回滾,你可以在拋異常之前打上斷點,執行到這時你會發現,去看資料庫,庫存已經扣了,訂單已經添加了,
undo_log
表有了記錄,這涉及到它的回滾原理了,大概說一句,通過已經執行sql進行記錄日誌,成功了刪掉日誌,失敗了通過日誌來回滾資料,再刪掉日誌,所以不管怎麼樣,日誌應該是不存在的,若存在說明系統是異常宕機,啟動後也應該會繼續回滾
1.2.4. 小總結
- 通過快速開始,我們就可以快速的執行成功它的demo了,目前還沒遇上坑,但是目前為止我們都用的預設配置,基本沒看過它的配置該如何改動,接下去看Seata的配置檔案
1.3. Seata
配置檔案
1.3.1. registry.conf
- 官方文件地址
- 他這裡特意提了句
service.vgroup_mapping這個配置,在 Spring Cloud 中預設是${spring.application.name}-fescar-service-group,可以通過指定application.properties的 spring.cloud.alibaba.seata.tx-service-group這個屬性覆蓋,但是必須要和 file.conf 中的一致,否則會提示
no available server to connect
結果我在執行
springcloud-eureak-seata
時真遇到了,這裡就體現了它文件的匱乏,我覺得每個例子下面都應該放個文件的注意事項吧,不放每個例子下面,wiki裡多寫點也好啊,我們不是開發人員,對seata並不熟,特別是對它的配置,主要的兩個配置檔案registry.conf
和file.conf
各個系統都存在,但對它的注意事項和描述只有Sample
專案裡的quick-integration-with-spring-cloud.md
檔案裡提到了一句,對剛接觸這個專案的人很不友好- 該檔案是用於指定註冊中心和配置檔案,預設情況下是本地檔案儲存,所以一開始的mybatis專案我們沒感覺需要依賴,然後上面的這句提醒也成功帶歪了我,讓我沒想到是服務端出了問題
該檔案可以選擇
file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
這些註冊中心,指定file、nacos 、apollo、zk、consul、etcd3
這些配置檔案儲存,所以提醒一句用eureka作為註冊中心的這邊的型別記得改
1.3.2. file.conf
- 用於指定TC(事務協調器)的相關屬性
- 它還寫了
如果使用註冊中心也可以將配置新增到配置中心
,我又要吐槽了,我用的apollo
作為配置中心,請問如何把這個配置檔案放apollo
裡去,同樣毫無文件,我得之後自己看原始碼去研究 這裡在demo裡重要用到的屬性
service.vgroup_mapping.my_test_tx_group
,這個key的值就相當於服務端的服務名,在Eureka的效果,相當於如下
如果沒用Eureka這種註冊中心,就一定需要填寫服務端地址,對應
service.default.grouplist
的值
至於其他還有n多的屬性,抱歉,沒有文件,除了能從字面看懂意思的,你不懂就去看原始碼吧,反正我就不寫文件
1.4. SpringCloud整合
1.4.1. 採坑
- 準備執行
springcloud-eureka-seata
,第一次我全部執行,報了no available server to connect
之後一直再檢查配置哪裡有對不上?糾結了好久,終於讓我反應過來,這是服務端不對 - 在服務端修改了
type = "eureka"
還是報錯,但我一直在debug,我知道已經不是原來的問題了,最終的解決之道是本地執行,把服務端的file.conf
中service.default.grouplist = "172.16.100.141:8091"
地址改成內網地址,不要用127.0.0.1
,踩了兩個坑總算除錯成功了,把demo是成功執行起來了,之後的挑戰是整合到自己的專案 - 這裡又該吐槽了,除了快速啟動,沒有其他的整合文件,也就是除了引用jar包還需要幹什麼唯一的參考就是
Sample
專案了,這個專案整合的坑明天有空繼續踩了
1.5. 總結
- 專案的技術思想是好的,分散式事務的模式也不止一種(雖然它的文件就演示了這麼一種),相信它也會不斷把阿里分散式事務的優秀思想結合進來,還是值得期待的