前言
本文演示如何使用 Seata Starter 完成 Spring Cloud 應用的分佈式事務接入,Feign遠程調用,AT 模式爲例。
Seata是 阿里巴巴 開源的分佈式事務中間件,以 高效並且對業務 0 侵入 的方式,解決 微服務 場景下面臨的分佈式事務問題。
準備
Seata服務端安裝啓動,請參考文章:《Centos7部署Seata分佈式事務系統並以nacos爲配置中心》
Feign的整合,請參考文章:《Spring Cloud Alibaba實戰》系列-Feign之遠程調用
如何開始
項目增加jar依賴
<!--Seata 分佈式事務-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
在 resource 目錄下增加註冊文件 registry.conf
registry {
# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
type = "nacos"
nacos {
serverAddr = "111.231.111.150:8848"
namespace = ""
cluster = "default"
}
}
config {
# file、nacos 、apollo、zk、consul、etcd3
type = "nacos"
nacos {
serverAddr = "111.231.111.150:8848"
namespace = ""
}
}
配置seata代理數據源,如果不配置,事務會不起作用
public class SeataAutoConfig {
private DataSourceProxy dataSourceProxy;
/**
* 主數據源
* @return
*/
@Bean
@ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.master")
public DruidDataSource druidDataSource() {
return new DruidDataSource();
}
@Bean
@Primary
public DataSource dataSource() {
dataSourceProxy = new DataSourceProxy(druidDataSource());
return dataSourceProxy;
}
@Bean
public DataSourceProxy dataSourceProxy() {
return dataSourceProxy;
}
}
業務庫中增加 undo_log 表
CREATE TABLE IF NOT EXISTS `undo_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`branch_id` bigint(20) NOT NULL,
`xid` varchar(100) NOT NULL,
`context` varchar(128) NOT NULL,
`rollback_info` longblob NOT NULL,
`log_status` int(11) NOT NULL,
`log_created` datetime NOT NULL,
`log_modified` datetime NOT NULL,
`ext` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
yml配置(可選),不配置採取默認的也可以
# seata
seata:
client:
tm:
rollback:
retry:
# 一階段全局回滾結果上報TC重試次數,默認1次,建議大於1
count: 3
commit:
retry:
# 一階段全局提交結果上報TC重試次數,默認1次,建議大於1
count: 3
案例
新建兩個springboot項目,gourd-hu(事務發起方) 和 gourd-sub,分別進行上述步驟。
接口準備
gourd-sub項目提供web接口:
gourd-hu項目準備feign調用接口,及測試方法入口:
方法入口上增加 @GlobalTransactional 註解,表示開啓全局事務。
處理業務邏輯:
測試
項目集成啓動成功標誌,項目沒有報錯,並且出現下面的日誌就可以了。
事務測試
事務異常情況:
發起者接口內通過feignClient 調用了sub 的兩個接口,本地事務內模擬異常,測試分支事務的回滾情況。
異常拋出之前,本地事務未提交,所以log表沒有記錄,分支事務一階段已結束,數據被修改,存在兩條undoLog日誌。
異常拋出之後,本地事務回滾,同時通知分支事務回滾數據,並異步刪除undoLog。
事務正常結束情況:
發起者接口內通過feignClient 調用了sub 的兩個接口,測試事務正常結束情況。
事務結束之前,本地事務未提交,所以log表沒有記錄,分支事務一階段已結束,數據被修改,存在兩條undoLog日誌。
事務結束之後,本地事務提交,通知分支事務,異步刪除undoLog。
結語
至此,springboot2.x 整合Seata 就結束啦,如果本文有錯誤的地方,歡迎評論指正。
===============================================
代碼均已上傳至本人的開源項目
葫蘆胡:https://blog.csdn.net/HXNLYW/article/details/98037354