Spring Cloud Alibaba Seata示例:分布式事务实战指南

Spring Cloud Alibaba Seata示例:分布式事务实战指南

spring-cloud-alibaba Spring Cloud Alibaba provides a one-stop solution for application development for the distributed solutions of Alibaba middleware. spring-cloud-alibaba 项目地址: https://gitcode.com/gh_mirrors/sp/spring-cloud-alibaba

引言

在微服务架构中,分布式事务一直是技术难点之一。Spring Cloud Alibaba通过整合Seata分布式事务解决方案,为开发者提供了一套完整的分布式事务处理机制。本文将通过一个完整的示例,详细介绍如何在Spring Cloud Alibaba项目中使用Seata实现分布式事务。

Seata简介

Seata是阿里巴巴开源的分布式事务中间件,它以高效且对业务零侵入的方式解决微服务场景下的分布式事务问题。Seata提供了AT、TCC、SAGA和XA四种事务模式,本示例主要展示AT模式的使用。

环境准备

1. 数据库配置

本示例使用MySQL数据库,需要为三个服务(account-server、order-service、storage-service)配置数据库连接信息。修改各服务application.yml文件中的数据库配置:

base:
  config:
    mdb:
      hostname: 数据库服务器地址
      dbname: 测试数据库名
      port: 数据库端口
      username: 数据库用户名
      password: 数据库密码
创建undo_log表

Seata AT模式需要undo_log表来记录事务回滚信息:

CREATE TABLE `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;
初始化Seata服务端表结构

Seata服务端需要以下表来管理全局事务:

-- 全局事务表
CREATE TABLE IF NOT EXISTS `global_table` (...);

-- 分支事务表
CREATE TABLE IF NOT EXISTS `branch_table` (...);

-- 锁表
CREATE TABLE IF NOT EXISTS `lock_table` (...);

-- 分布式锁表
CREATE TABLE IF NOT EXISTS `distributed_lock` (...);
创建业务表

示例中需要创建以下业务表:

-- 库存表
CREATE TABLE `storage_tbl` (...);

-- 订单表
CREATE TABLE `order_tbl` (...);

-- 账户表
CREATE TABLE `account_tbl` (...);

2. Nacos配置

Spring Cloud Alibaba使用Nacos 2.4.2作为配置中心。需要创建Seata的Nacos配置:

  • Data ID: seata.properties
  • Group: SEATA_GROUP

配置内容:

service.vgroupMapping.order-service-tx-group=default
service.vgroupMapping.account-service-tx-group=default
service.vgroupMapping.business-service-tx-group=default
service.vgroupMapping.storage-service-tx-group=default

3. 启动Seata服务端

下载与配置

下载Seata 2.1.0版本,修改conf/application.yml文件:

seata:
  config:
    type: nacos
    nacos:
      server-addr: 127.0.0.1:8848
      username: nacos
      password: nacos
      data-id: seata.properties
  registry:
    type: nacos
    nacos:
      application: seata-server
      server-addr: 127.0.0.1:8848
      cluster: default
      username: nacos
      password: nacos
启动服务

Windows系统:

./seata-server.bat

Linux/Mac系统:

sh seata-server.sh

启动后可通过http://127.0.0.1:7091访问Seata控制台。

示例运行

  1. 依次启动account-serverorder-servicestorage-servicebusiness-service应用
  2. 通过HTTP GET方法访问以下URL测试分布式事务:
# 测试Feign调用
http://127.0.0.1:18081/seata/feign

# 测试RestTemplate调用
http://127.0.0.1:18081/seata/rest

分布式事务验证

XID传递验证

在各服务的Controller中,首先会输出RootContext中的XID信息。如果每次调用XID都变化且同一调用链中各服务的XID相同,则说明Seata的XID传递正常。

数据一致性验证

示例模拟了用户购买商品的场景:

  • 库存服务:扣减商品库存
  • 订单服务:保存订单
  • 账户服务:扣减用户余额

通过随机抛出异常模拟业务异常场景。如果分布式事务生效,应满足以下等式:

  1. 用户原始金额(1000) = 用户现有金额 + 商品单价(2) × 订单数量 × 每单商品数量(2)
  2. 商品初始数量(100) = 商品现有数量 + 订单数量 × 每单商品数量(2)

Spring Cloud集成特性

  1. 自动上下文恢复:Spring MVC服务提供者在收到包含Seata信息的HTTP请求头时,能自动恢复Seata上下文

  2. RestTemplate支持:通过RestTemplate调用时自动传递Seata上下文

  3. FeignClient支持:通过FeignClient调用时自动传递Seata上下文

  4. 与Hystrix兼容:支持Seata与Hystrix熔断器一起使用

  5. 与Sentinel兼容:支持Seata与Sentinel流量控制一起使用

总结

通过本示例,我们展示了Spring Cloud Alibaba与Seata的完美集成,实现了分布式事务的自动化管理。这种方案对业务代码侵入小,配置简单,是微服务架构下处理分布式事务的理想选择。开发者可以基于此示例快速构建自己的分布式事务解决方案。

spring-cloud-alibaba Spring Cloud Alibaba provides a one-stop solution for application development for the distributed solutions of Alibaba middleware. spring-cloud-alibaba 项目地址: https://gitcode.com/gh_mirrors/sp/spring-cloud-alibaba

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

羿妍玫Ivan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值