Spring Cloud同步场景分布式事务怎样做?试试Seata

简介: 在微服务架构下,虽然我们会尽量避免分布式事务,但是只要业务复杂的情况下这是一个绕不开的问题,如何保证业务数据一致性呢?本文主要介绍同步场景下使用Seata的AT模式来解决一致性问题。

封面.png

一、概述

在微服务架构下,虽然我们会尽量避免分布式事务,但是只要业务复杂的情况下这是一个绕不开的问题,如何保证业务数据一致性呢?本文主要介绍同步场景下使用SeataAT模式来解决一致性问题。

Seata阿里巴巴 开源的 一站式分布式事务解决方案 中间件,以 高效 并且对业务 0 侵入 的方式,解决 微服务 场景下面临的分布式事务问题

二、Seata介绍

整体事务逻辑是基于 两阶段提交 的模型,核心概念包括以下3个角色:

  • TM:事务的发起者。用来告诉 TC,全局事务的开始,提交,回滚。
  • RM:具体的事务资源,每一个 RM 都会作为一个分支事务注册在 TC。
  • TC:事务的协调者seata-server,用于接收我们的事务的注册,提交和回滚。

目前的Seata有两种模式可使用分别对应不同业务场景

2.1. AT模式

该模式适合的场景:

  • 基于支持本地 ACID 事务的关系型数据库。
  • Java 应用,通过 JDBC 访问数据库。

mark

一个典型的分布式事务过程:

  1. TMTC 申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的 XID
  2. XID 在微服务调用链路的上下文中传播。
  3. RMTC 注册分支事务,将其纳入 XID 对应全局事务的管辖。
  4. TMTC 发起针对 XID 的全局提交或回滚决议。
  5. TC 调度 XID 下管辖的全部分支事务完成提交或回滚请求。

2.2. MT模式

该模式逻辑类似TCC,需要 自定义实现 preparecommitrollback的逻辑,适合 非关系型数据库 的场景
mark

三、Seata场景样例

模拟一个简单的用户下单场景,4个子工程分别是 Bussiness(事务发起者)Order(创建订单)Storage(扣减库存)Account(扣减账户余额)
mark

3.1. 部署Seata的Server端

mark
Discover注册、Config配置和Store存储模块默认都是使用file只能适用于单机,我们安装的时候分别改成使用nacosMysql以支持server端集群

3.1.1. 下载最新版本并解压

https://github.com/seata/seata/releases

3.1.2. 修改 conf/registry.conf 配置

注册中心和配置中心默认是file这里改为nacos;设置 registryconfig 节点中的typenacos,修改serverAddr为你的nacos节点地址。

registry {
  type = "nacos"

  nacos {
    serverAddr = "192.168.28.130"
    namespace = "public"
    cluster = "default"
  }
}

config {
  type = "nacos"

  nacos {
    serverAddr = "192.168.28.130"
    namespace = "public"
    cluster = "default"
  }
}

3.1.3. 修改 conf/nacos-config.txt配置

mark

  • 修改 service.vgroup_mapping 为自己应用对应的名称;如果有多个服务,添加相应的配置

默认组名为${spring.application.name}-fescar-service-group,可通过spring.cloud.alibaba.seata.tx-service-group配置修改

  • 修改 store.modedb,并修改数据库相关配置

3.1.4. 初始化seata的nacos配置

cd conf
sh nacos-config.sh 192.168.28.130

成功后在nacos的配置列表中能看到seata的相关配置

mark

3.1.5. 初始化数据库

执行conf/db_store.sql中的脚本

3.1.6. 启动seata-server

sh bin/seata-server.sh -p 8091 -h 192.168.28.130

3.2. 应用配置

3.2.1. 初始化数据库

执行脚本 seata-demo.sql

需在业务相关的数据库中添加 undo_log 表,用于保存需要回滚的数据

3.2.2. 添加registry.conf配置

直接把 seata-server 中的registry.conf复制到每个服务中去即可,不需要修改
mark

3.2.3. 修改配置

demo中的每个服务各自修改配置文件

  • bootstrap.yml 修改nacos地址
  • application.yml 修改数据库配置

3.2.4. 配置数据源代理

Seata是通过代理数据源实现分布式事务,所以需要配置io.seata.rm.datasource.DataSourceProxyBean,且是@Primary默认的数据源,否则事务不会回滚,无法实现分布式事务

public class DataSourceProxyConfig {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DruidDataSource druidDataSource() {
        return new DruidDataSource();
    }

    @Primary
    @Bean
    public DataSourceProxy dataSourceProxy(DruidDataSource druidDataSource) {
        return new DataSourceProxy(druidDataSource);
    }
}

因为使用了mybatis的starter所以需要排除DataSourceAutoConfiguration,不然会产生循环依赖

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})

3.2.5. 事务发起者添加全局事务注解

事务发起者 business-service 添加 @GlobalTransactional 注解

@GlobalTransactional
public void placeOrder(String userId) {
    ......
}

3.3. 测试

提供两个接口测试

  1. 事务成功:扣除库存成功 > 创建订单成功 > 扣减账户余额成功
    http://localhost:9090/placeOrder
  2. 事务失败:扣除库存成功 > 创建订单成功 > 扣减账户余额失败,事务回滚
    http://localhost:9090/placeOrderFallBack

3.4. demo下载地址

https://gitee.com/zlt2000/microservices-platform/tree/master/zlt-demo/seata-demo

目录
相关文章
|
21天前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
定时任务在企业应用中至关重要,常用于异步数据处理、自动化运维等场景。在单体应用中,利用Java的`java.util.Timer`或Spring的`@Scheduled`即可轻松实现。然而,进入微服务架构后,任务可能因多节点并发执行而重复。Spring Cloud Alibaba为此发布了Scheduling模块,提供轻量级、高可用的分布式定时任务解决方案,支持防重复执行、分片运行等功能,并可通过`spring-cloud-starter-alibaba-schedulerx`快速集成。用户可选择基于阿里云SchedulerX托管服务或采用本地开源方案(如ShedLock)
|
24天前
|
Java 微服务 Spring
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
文章介绍了如何利用Spring Cloud Alibaba快速构建大型电商系统的分布式微服务,包括服务限流降级等主要功能的实现,并通过注解和配置简化了Spring Cloud应用的接入和搭建过程。
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
|
2月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
Spring Cloud Alibaba 发布了 Scheduling 任务调度模块 [#3732]提供了一套开源、轻量级、高可用的定时任务解决方案,帮助您快速开发微服务体系下的分布式定时任务。
14578 23
|
1月前
|
关系型数据库 MySQL 数据库
SpringCloud2023中使用Seata解决分布式事务
对于分布式系统而言,需要保证分布式系统中的数据一致性,保证数据在子系统中始终保持一致,避免业务出现问题。分布式系统中对数据的操作要么一起成功,要么一起失败,必须是一个整体性的事务。Seata简化了这个使用过程。
39 2
|
1月前
|
Java 关系型数据库 MySQL
(二十七)舞动手指速写一个Seata-XA框架解决棘手的分布式事务问题
相信大家对于事务问题都不陌生,在之前《MySQL事务篇》中曾详解过MySQL的事务机制,在传统的单库环境下开发,咱们可依赖于MySQL所提供的事务机制,来确保单个事务内的一组操作,要么全部执行成功,要么全部执行失败。
|
22天前
|
存储 运维 监控
在Linux中,在分布式环境中如何实现文件系统冗余和同步?(例如DRBD、GlusterFS)
在Linux中,在分布式环境中如何实现文件系统冗余和同步?(例如DRBD、GlusterFS)
|
23天前
|
Dubbo Java 调度
揭秘!Spring Cloud Alibaba的超级力量——如何轻松驾驭分布式定时任务调度?
【8月更文挑战第20天】在现代微服务架构中,Spring Cloud Alibaba通过集成分布式定时任务调度功能解决了一致性和可靠性挑战。它利用TimerX实现任务的分布式编排与调度,并通过`@SchedulerLock`确保任务不被重复执行。示例代码展示了如何配置定时任务及其分布式锁,以实现每5秒仅由一个节点执行任务,适合构建高可用的微服务系统。
44 0
|
27天前
|
Java Nacos Docker
"揭秘!Docker部署Seata遇上Nacos,注册成功却报错?这些坑你不得不防!一网打尽解决秘籍,让你的分布式事务稳如老狗!"
【8月更文挑战第15天】在微服务架构中,Nacos搭配Seata确保数据一致性时,Docker部署Seata后可能出现客户端连接错误,如“can not connect to services-server”。此问题多由网络配置不当、配置文件错误或版本不兼容引起。解决策略包括:调整Docker网络设置确保可达性;检查并修正`file.conf`和`registry.conf`中的Nacos地址和端口;验证Seata与Nacos版本兼容性;修改配置后重启服务;参考官方文档和最佳实践进行配置。通过这些步骤,能有效排除故障,保障服务稳定运行。
34 0
|
2月前
|
消息中间件 Java 开发者
Spring Cloud微服务框架:构建高可用、分布式系统的现代架构
Spring Cloud是一个开源的微服务框架,旨在帮助开发者快速构建在分布式系统环境中运行的服务。它提供了一系列工具,用于在分布式系统中配置、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态等领域的支持。
137 5
|
2月前
|
存储 安全 Java
实现基于Spring Cloud的分布式配置管理
实现基于Spring Cloud的分布式配置管理