Spring Cloud Alibaba Seata示例:分布式事务实战指南
引言
在微服务架构中,分布式事务一直是技术难点之一。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控制台。
示例运行
- 依次启动
account-server
、order-service
、storage-service
和business-service
应用 - 通过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传递正常。
数据一致性验证
示例模拟了用户购买商品的场景:
- 库存服务:扣减商品库存
- 订单服务:保存订单
- 账户服务:扣减用户余额
通过随机抛出异常模拟业务异常场景。如果分布式事务生效,应满足以下等式:
- 用户原始金额(1000) = 用户现有金额 + 商品单价(2) × 订单数量 × 每单商品数量(2)
- 商品初始数量(100) = 商品现有数量 + 订单数量 × 每单商品数量(2)
Spring Cloud集成特性
-
自动上下文恢复:Spring MVC服务提供者在收到包含Seata信息的HTTP请求头时,能自动恢复Seata上下文
-
RestTemplate支持:通过RestTemplate调用时自动传递Seata上下文
-
FeignClient支持:通过FeignClient调用时自动传递Seata上下文
-
与Hystrix兼容:支持Seata与Hystrix熔断器一起使用
-
与Sentinel兼容:支持Seata与Sentinel流量控制一起使用
总结
通过本示例,我们展示了Spring Cloud Alibaba与Seata的完美集成,实现了分布式事务的自动化管理。这种方案对业务代码侵入小,配置简单,是微服务架构下处理分布式事务的理想选择。开发者可以基于此示例快速构建自己的分布式事务解决方案。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考