SpringCloud 微服务架构与 Seata 分布式事务实践

注:完整笔记可在 https://github.com/WuSangui571/cloud-demo 中的 README.md 文件浏览,此处发表的是经由 AI 润色过的精简版。

1. Seata 概述

在微服务架构中,一个业务操作(如采购)可能涉及多个服务(如库存、订单、账户),每个服务连接独立的数据库。如何确保多事务的统一提交或回滚成为关键问题。Seata(https://seata.apache.org/zh-cn/),由阿里巴巴开源的分布式事务解决方案,旨在提供高性能、易用的分布式事务管理。

1.1 示例场景

  • 业务流程:用户采购商品,库存减一,创建订单,扣减账户余额。任何环节失败需全部回滚。

  • 传统事务局限:单体服务使用 @EnableTransactionManagement@Transactional 实现本地事务,但分布式环境下的独立事务无法统一管理。

1.2 分布式事务挑战

传统本地事务(如 @Transactional)在分布式微服务中无效,因为各服务实例相互独立,无法实现跨服务回滚。Seata 通过以下三组件解决此问题:

  • TC (Transaction Coordinator):维护全局和分支事务状态,协调提交或回滚。

  • TM (Transaction Manager):定义全局事务边界,发起提交或回滚。

  • RM (Resource Manager):管理分支事务资源,与 TC 交互注册和报告状态。

2. Seata 集成与配置

2.1 下载与启动

  1. 下载 Seata

  2. 启动服务器

    • 解压后进入 bin 目录,执行 seata-server.bat

    • 访问 http://localhost:7091,默认账号密码为 seata(注意:2.5.0 版本可能无法正常访问控制台)。

  3. 验证:确认控制台可访问。

2.2 添加依赖

在需要分布式事务的模块中添加:

<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>

2.3 配置 Seata

  • 本地配置文件 file.conf

service {
vgroupMapping.default_tx_group = "default"
default.grouplist = "127.0.0.1:8091"
enableDegrade = false
disableGlobalTransaction = false
}
  • Nacos 配置(可选):将 file.conf 内容迁移至 Nacos,简化本地配置。

2.4 启用全局事务

  • 在业务入口方法上添加 @GlobalTransactional 注解,开启全局事务。

  • 其他局部事务方法需保留 @EnableTransactionManagement@Transactional

3. Seata 工作原理

3.1 两阶段提交协议

Seata 采用两阶段提交(Two-Phase Commit)确保分布式事务一致性。

  • 第一阶段

    1. 解析 SQL:分析业务 SQL,但不立即执行。

    2. 查询前镜像:记录执行前数据状态(如修改前记录)。

    3. 执行业务 SQL:执行实际 SQL。

    4. 查询后镜像:记录执行后数据状态。

    5. 插入回滚日志:将前后镜像存入 undo_log 表。

    6. 注册分支事务:向 TC 注册并申请全局锁。

    7. 本地事务提交:提交业务数据和 undo_log

    8. 汇报状态:报告 TC 分支事务结果。

  • 第二阶段

    • 成功情况

      1. 收到 TC 提交请求,立即响应。

      2. 异步删除 undo_log 记录。

    • 失败情况

      1. 收到 TC 回滚请求,查询 undo_log(通过 XID 和 Branch ID)。

      2. 数据校验:后镜像与当前数据对比。

      3. 回滚数据:应用前镜像,删除 undo_log

3.2 事务流程

  • 全局事务启动:方法标注 @GlobalTransactional 后,生成唯一 XID,注册至 TC。

  • 分支事务:每个远程调用(如扣减库存、创建订单)作为分支,汇报状态。

  • 结束:所有分支完成,TC 决定提交或回滚。

4. Seata 事务模式

Seata 支持四种事务模式,适应不同场景:

  1. AT 模式

    • 自动模式,Seata 管理所有操作,推荐使用。

    • 基于两阶段提交,无需手动干预。

  2. XA 模式

    • 基于数据库 XA 协议,第一阶段不提交,性能较低。

    • 配置:seata.data-source-proxy-mode=XA

    • 优势:兼容主流关系型数据库,不推荐。

  3. TCC 模式

    • 手动实现两阶段(Try、Confirm、Cancel),适合复杂业务。

    • 需自定义实现,灵活性高。

  4. Saga 模式

    • 适合长事务(如数天业务),结合消息队列。

    • 避免长时间锁资源,适用于异步流程。

  • 微信
  • 赶快加我聊天吧
  • QQ
  • 赶快加我聊天吧
  • weinxin
三桂

发表评论 取消回复 您未登录,登录后才能评论,前往登录