springcloud整合seata


Posted in Java/Android onMay 20, 2022

一、背景

上一篇文章中,我们使用Seata整合了SpringBoot,在这篇文章中我们使用Seata整合SpringCloud。同时有了上一篇文章的基础,此处我们简单实现。

二、项目结构

springcloud整合seata

三、实现功能:

完成用户下单操作,下单分为调用 账户服务 扣除余额,调用订单服务创建订单。

springcloud整合seata

四、项目使用到的技术

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>

springcloud整合seata

参考文档: https://seata.io/zh-cn/docs/ops/deploy-guide-beginner.html

2、涉及到的业务库操作

1、业务库需要存在 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、业务表主键

业务表中必须包含单列主键,如果存在多列主键,则目前只有mysql支持。

3、页面中自动更新时间戳

业务表中最好不要自动更新时间戳,使用手动更新,更新数据,只更新用到的数据。
比如:
表中存在10个字段,当前业务只需要更新3个字段,此时我们更新3个字段即可,不要更新10个字段,如果update_time字段是默认更新的,则使用手动更新。

3、开启数据源代理

1、自动配置数据源代理

seata:
  enabled: true
  # 是否自动开启数据源代理
  enable-auto-data-source-proxy: true
  # 数据源代理模式,使用AT模式
  data-source-proxy-mode: AT

2、手动配置AT模式数据源代理

1、配置文件关闭自动数据源代理

seata:
  # 是否自动开启数据源代理
  enable-auto-data-source-proxy: false

2、配置配置数据源

AT模式下返回的数据源一定需要是 DataSourceProxy

@Bean
    public DataSource dataSourceProxy() {
        // 某一个数据源
        XxxDataSource xxxDataSource = new XxxDataSource();
        // 设置数据源的各种配置属性
        xxxDataSource.setXXX("");
        // 使用 DataSourceProxy 来包装一下
        return new DataSourceProxy(xxxDataSource);
    }

4、传递 xid

在引入了 spring-cloud-starter-alibaba-seata 后,很多都已经实现了自动传递 xid 。同时在分布式事务结束后,需要清除xid的值。

默认实现了 feignrestweb3种方式的 xid的传递。

springcloud整合seata

5、事务分组和seata server对应上

springcloud整合seata

6、注册中心和配置中心

应用程序中 seata 的配置中心和 注册中心 需要和 seata server 的保持一致。

springcloud整合seata

7、业务方法加上@GlobalTransactional 注解

在需要开启分布式事务的方法上加入 @GlobalTransactional 注解,开启分布式事务。

public class BusinessServiceImpl implements BusinessService {
    private final OrderService orderService;
    private final AccountClient accountClient;
    @Override
    // 开启分布式事务
    @GlobalTransactional(rollbackFor = Exception.class)
    public void createAccountOrder(Integer accountId, Long amount, boolean hasException) {
        System.out.println("xid:" + RootContext.getXID());
        // 1、远程扣减账户余额
        remoteDebit(accountId, amount);
        // 2、下订单
        orderService.createOrder(accountId, amount);
        if (hasException) {
            throw new RuntimeException("发生了异常,分布式事物需要会滚");
        }
    }
    private void remoteDebit(Integer accountId, Long amount) {
        String result = accountClient.debit(accountId, amount);
        log.info("远程扣减库存结果:[{}]", result);
    }
}

六、演示

分布式事务发生异常,事务回滚

springcloud整合seata

七、完整代码

https://gitee.com/huan1993/spring-cloud-parent/tree/master/seata/seata-springcloud-mybatis-plus

八、参考文档

1、新人文档

2、seata常见问题

到此这篇关于springcloud整合seata的文章就介绍到这了!


Tags in this post...

Java/Android 相关文章推荐
JVM入门之类加载与字节码技术(类加载与类的加载器)
Jun 15 Java/Android
java Nio使用NioSocket客户端与服务端交互实现方式
Jun 15 Java/Android
Spring Security使用单点登录的权限功能
Apr 03 Java/Android
Java中Quartz高可用定时任务快速入门
Apr 03 Java/Android
Android Flutter实现3D动画效果示例详解
Apr 07 Java/Android
Java 超详细讲解hashCode方法
Apr 07 Java/Android
java中为什么说子类的构造方法默认访问的是父类的无参构造方法
Apr 13 Java/Android
Elasticsearch Recovery 详细介绍
Apr 19 Java/Android
Android开发实现极为简单的QQ登录页面
Apr 24 Java/Android
Spring Data JPA框架持久化存储数据到数据库
Apr 28 Java/Android
Spring IOC容器Bean的作用域及生命周期实例
May 30 Java/Android
SpringBoot详解整合Redis缓存方法
Jul 15 Java/Android
springboot读取nacos配置文件
May 20 #Java/Android
Android studio 简单计算器的编写
May 20 #Java/Android
mybatis 获取更新记录的id
May 20 #Java/Android
Android Studio 计算器开发
May 20 #Java/Android
Android Studio实现简易进制转换计算器
May 20 #Java/Android
Spring 使用注解开发
May 20 #Java/Android
MyBatis核心源码深度剖析SQL语句执行过程
You might like
10 个经典PHP函数
2013/10/17 PHP
Linux下安装PHP MSSQL扩展教程
2014/10/24 PHP
php操作mongodb封装类与用法实例
2018/09/01 PHP
PHP7数组的底层实现示例
2019/08/25 PHP
PHP7 安装event扩展的实现方法
2019/10/08 PHP
基于jquery的实现简单的表格中增加或删除下一行
2010/08/01 Javascript
博客侧边栏模块跟随滚动条滑动固定效果的实现方法(js+jquery等)
2013/03/24 Javascript
intro.js 页面引导简单用法 分享
2013/08/06 Javascript
JS和函数式语言的三特性
2014/03/05 Javascript
javaScript如何处理从java后台返回的list
2014/04/24 Javascript
jQuery实现瀑布流的取巧做法分享
2015/01/12 Javascript
js实现简单的可切换选项卡效果
2015/04/10 Javascript
javascript实时获取鼠标坐标值并显示的方法
2015/04/30 Javascript
javaScript 逻辑运算符使用技巧整理
2017/05/03 Javascript
JavaScript编写棋盘覆盖代码详解
2017/08/28 Javascript
微信小程序实现点击按钮修改view标签背景颜色功能示例【附demo源码下载】
2017/12/06 Javascript
JS实现的文字间歇循环滚动效果完整示例
2018/02/13 Javascript
vue数据控制视图源码解析
2018/03/28 Javascript
nuxt框架中路由鉴权之Koa和Session的用法
2018/05/09 Javascript
详解从NodeJS搭建中间层再谈前后端分离
2018/11/13 NodeJs
更优雅的微信小程序骨架屏实现详解
2019/08/07 Javascript
vue从后台渲染文章列表以及根据id跳转文章详情详解
2020/12/14 Vue.js
[27:08]完美世界DOTA2联赛PWL S2 SZ vs Rebirth 第二场 11.21
2020/11/23 DOTA
浅析Python中的join()方法的使用
2015/05/19 Python
Python中的rfind()方法使用详解
2015/05/19 Python
pandas DataFrame 根据多列的值做判断,生成新的列值实例
2018/05/18 Python
Python爬虫设置代理IP(图文)
2018/12/23 Python
python matplotlib画盒图、子图解决坐标轴标签重叠的问题
2020/01/19 Python
python实现简单飞行棋
2020/02/06 Python
python批量修改文件名的示例
2020/09/27 Python
加拿大最大的相机店:Henry’s
2017/05/17 全球购物
迪卡侬印尼体育用品商店:Decathlon印尼
2020/03/11 全球购物
Wiggle新西兰:自行车、跑步、游泳
2020/05/06 全球购物
大学本科毕业生的自我鉴定
2013/11/26 职场文书
保护环境倡议书100字
2014/05/19 职场文书
uniapp开发打包多端应用完整方法指南
2022/12/24 Javascript