阿里分散式事務seata入門(采坑)
- 2019 年 10 月 3 日
- 筆記
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. 總結
- 項目的技術思想是好的,分散式事務的模式也不止一種(雖然它的文檔就演示了這麼一種),相信它也會不斷把阿里分散式事務的優秀思想結合進來,還是值得期待的