springcloud整合seata的實(shí)現(xiàn)代碼
一、背景
在上一篇文章中,我們使用Seata整合了SpringBoot,在這篇文章中我們使用Seata整合SpringCloud。同時(shí)有了上一篇文章的基礎(chǔ),此處我們簡(jiǎn)單實(shí)現(xiàn)。
二、項(xiàng)目結(jié)構(gòu)

三、實(shí)現(xiàn)功能:
完成用戶下單操作,下單分為調(diào)用 賬戶服務(wù) 扣除余額,調(diào)用訂單服務(wù)創(chuàng)建訂單。

四、項(xiàng)目使用到的技術(shù)
Spring Cloud 、eureka、openfeign、seata 、nacos、druid、mybatis-plus
五、整合步驟
1、引入spring-cloud-starter-alibaba-seata jar包
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<version>2021.1</version>
<exclusions>
<exclusion>
<artifactId>seata-spring-boot-starter</artifactId>
<groupId>io.seata</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.4.2</version>
</dependency>
參考文檔: https://seata.io/zh-cn/docs/ops/deploy-guide-beginner.html
2、涉及到的業(yè)務(wù)庫(kù)操作
1、業(yè)務(wù)庫(kù)需要存在 undo_log 表
CREATE TABLE IF NOT EXISTS `undo_log`
(
`branch_id` BIGINT NOT NULL COMMENT 'branch transaction id',
`xid` VARCHAR(128) NOT NULL COMMENT 'global transaction id',
`context` VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization',
`rollback_info` LONGBLOB NOT NULL COMMENT 'rollback info',
`log_status` INT(11) NOT NULL COMMENT '0:normal status,1:defense status',
`log_created` DATETIME(6) NOT NULL COMMENT 'create datetime',
`log_modified` DATETIME(6) NOT NULL COMMENT 'modify datetime',
UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
) ENGINE = InnoDB COMMENT ='AT transaction mode undo table';2、業(yè)務(wù)表主鍵
業(yè)務(wù)表中必須包含單列主鍵,如果存在多列主鍵,則目前只有mysql支持。
3、頁(yè)面中自動(dòng)更新時(shí)間戳
業(yè)務(wù)表中最好不要自動(dòng)更新時(shí)間戳,使用手動(dòng)更新,更新數(shù)據(jù),只更新用到的數(shù)據(jù)。
比如:
表中存在10個(gè)字段,當(dāng)前業(yè)務(wù)只需要更新3個(gè)字段,此時(shí)我們更新3個(gè)字段即可,不要更新10個(gè)字段,如果update_time字段是默認(rèn)更新的,則使用手動(dòng)更新。
3、開(kāi)啟數(shù)據(jù)源代理
1、自動(dòng)配置數(shù)據(jù)源代理
seata: enabled: true # 是否自動(dòng)開(kāi)啟數(shù)據(jù)源代理 enable-auto-data-source-proxy: true # 數(shù)據(jù)源代理模式,使用AT模式 data-source-proxy-mode: AT
2、手動(dòng)配置AT模式數(shù)據(jù)源代理
1、配置文件關(guān)閉自動(dòng)數(shù)據(jù)源代理
seata: # 是否自動(dòng)開(kāi)啟數(shù)據(jù)源代理 enable-auto-data-source-proxy: false
2、配置配置數(shù)據(jù)源
AT模式下返回的數(shù)據(jù)源一定需要是 DataSourceProxy
@Bean
public DataSource dataSourceProxy() {
// 某一個(gè)數(shù)據(jù)源
XxxDataSource xxxDataSource = new XxxDataSource();
// 設(shè)置數(shù)據(jù)源的各種配置屬性
xxxDataSource.setXXX("");
// 使用 DataSourceProxy 來(lái)包裝一下
return new DataSourceProxy(xxxDataSource);
}4、傳遞 xid
在引入了 spring-cloud-starter-alibaba-seata 后,很多都已經(jīng)實(shí)現(xiàn)了自動(dòng)傳遞 xid 。同時(shí)在分布式事務(wù)結(jié)束后,需要清除xid的值。
默認(rèn)實(shí)現(xiàn)了 feign、rest和web3種方式的 xid的傳遞。

5、事務(wù)分組和seata server對(duì)應(yīng)上

6、注冊(cè)中心和配置中心
應(yīng)用程序中 seata 的配置中心和 注冊(cè)中心 需要和 seata server 的保持一致。

7、業(yè)務(wù)方法加上@GlobalTransactional 注解
在需要開(kāi)啟分布式事務(wù)的方法上加入 @GlobalTransactional 注解,開(kāi)啟分布式事務(wù)。
public class BusinessServiceImpl implements BusinessService {
private final OrderService orderService;
private final AccountClient accountClient;
@Override
// 開(kāi)啟分布式事務(wù)
@GlobalTransactional(rollbackFor = Exception.class)
public void createAccountOrder(Integer accountId, Long amount, boolean hasException) {
System.out.println("xid:" + RootContext.getXID());
// 1、遠(yuǎn)程扣減賬戶余額
remoteDebit(accountId, amount);
// 2、下訂單
orderService.createOrder(accountId, amount);
if (hasException) {
throw new RuntimeException("發(fā)生了異常,分布式事物需要會(huì)滾");
}
}
private void remoteDebit(Integer accountId, Long amount) {
String result = accountClient.debit(accountId, amount);
log.info("遠(yuǎn)程扣減庫(kù)存結(jié)果:[{}]", result);
}
}六、演示
分布式事務(wù)發(fā)生異常,事務(wù)回滾

七、完整代碼
https://gitee.com/huan1993/spring-cloud-parent/tree/master/seata/seata-springcloud-mybatis-plus
八、參考文檔
1、新人文檔
到此這篇關(guān)于springcloud整合seata的文章就介紹到這了,更多相關(guān)springcloud整合seata內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 關(guān)于SpringCloud整合RabbitMQ的實(shí)例
- 一文詳解gRPC快速整合SpringCloud
- SpringSecurit鹽值加密的密碼驗(yàn)證以及強(qiáng)密碼驗(yàn)證過(guò)程
- springcloud-gateway整合jwt+jcasbin實(shí)現(xiàn)權(quán)限控制的詳細(xì)過(guò)程
- springcloud?整合?openfeign的方法
- SpringCloud?Stream?整合RabbitMQ的基本步驟
- springcloud整合到項(xiàng)目中無(wú)法啟動(dòng)報(bào)錯(cuò)Failed to start bean 'eurekaAutoServiceRegistration'
相關(guān)文章
一文教會(huì)你使用jmap和MAT進(jìn)行堆內(nèi)存溢出分析
本文介紹關(guān)于jmap和MAT的使用來(lái)進(jìn)行堆內(nèi)存溢出分析,因?yàn)檫@個(gè)內(nèi)存溢出是我們手動(dòng)構(gòu)造出來(lái)的,查找比較簡(jiǎn)單,真的到了生產(chǎn)上面需要我們仔細(xì)排除2021-09-09
Java發(fā)送http請(qǐng)求的示例(get與post方法請(qǐng)求)
這篇文章主要介紹了Java發(fā)送http請(qǐng)求的示例(get與post方法請(qǐng)求),幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2021-01-01
java 在file的尾部添加數(shù)據(jù)的兩種方法總結(jié)
這篇文章主要介紹了java 在file的尾部添加數(shù)據(jù)的兩種方法總結(jié)的相關(guān)資料,這里提供了兩種在file尾部添加數(shù)據(jù)的方法,希望能幫助到大家,需要的朋友可以參考下2017-09-09
Spring的@RequestParam對(duì)象綁定方式
這篇文章主要介紹了Spring的@RequestParam對(duì)象綁定方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
java中對(duì)象轉(zhuǎn)json字符串的幾種常用方式舉例
這篇文章主要給大家介紹了關(guān)于java中對(duì)象轉(zhuǎn)json字符串的幾種常用方式,在Java中可以使用許多庫(kù)將對(duì)象轉(zhuǎn)換為JSON字符串,其中最常用的是Jackson和Gson,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10
解決Mybatis映射文件mapper.xml中的注釋問(wèn)題
這篇文章主要介紹了解決Mybatis映射文件mapper.xml中的注釋問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。2022-01-01
Java 基礎(chǔ)全面講解StringBuffer類的使用
當(dāng)對(duì)字符串進(jìn)行修改的時(shí)候,需要使用 StringBuffer 和 StringBuilder類,和String類不同的是,StringBuffer和 StringBuilder類的對(duì)象能夠被多次的修改,并且不產(chǎn)生新的未使用對(duì)象2022-01-01

