《Spring Cloud Alibaba實戰》系列-集成Seata分佈式事務

前言

本文演示如何使用 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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章