Seata如何与Spring Cloud整合?
🔧 一、整合核心步骤
1. 启动 Seata Server(TC)
- 环境准备:
- 修改
registry.conf,指定注册中心(如 Nacos)和配置中心:registry { type = "nacos" nacos { serverAddr = "localhost:8848" namespace = "public" } } config { type = "nacos" nacos { serverAddr = "localhost:8848" } } - 同步配置到 Nacos:
sh nacos-config.sh -h localhost -p 8848 -g SEATA_GROUP - 启动 Seata Server:
bin/seata-server.sh -p 8091
- 修改
- 高可用:集群部署时需确保所有节点使用相同的注册中心和事务分组。
2. 客户端(微服务)配置
- 依赖引入(Spring Cloud Alibaba):
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-seata</artifactId> <exclusions> <exclusion> <groupId>io.seata</groupId> <artifactId>seata-spring-boot-starter</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>io.seata</groupId> <artifactId>seata-spring-boot-starter</artifactId> <version>1.4.2</version> </dependency> - 事务分组配置(
application.yml):seata: tx-service-group: my_tx_group # 事务分组名,需与Seata Server配置一致 service: vgroup-mapping: my_tx_group: default # 映射到Seata Server集群名 registry: type: nacos nacos: server-addr: localhost:8848📌 注:
tx-service-group需在所有参与事务的微服务中保持一致。
3. 业务库准备
- 创建
undo_log表(AT 模式必需):
此表用于记录事务回滚日志。CREATE TABLE `undo_log` ( `branch_id` BIGINT NOT NULL, `xid` VARCHAR(100) NOT NULL, `rollback_info` LONGBLOB NOT NULL, UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`) ) ENGINE=InnoDB;
4. 数据源代理
- 自动代理(推荐):
seata: enable-auto-data-source-proxy: true data-source-proxy-mode: AT # 可选 AT/XA 模式 - 手动代理(需自定义数据源):
确保所有数据库操作通过@Bean public DataSource dataSourceProxy(DataSource druidDataSource) { return new DataSourceProxy(druidDataSource); // 包装原生数据源 }DataSourceProxy执行。
5. 事务注解使用
- 在事务发起方的方法上添加
@GlobalTransactional:@RestController public class OrderController { @GlobalTransactional(rollbackFor = Exception.class) @PostMapping("/create") public String createOrder() { orderService.create(); inventoryService.deductStock(); // 通过Feign调用其他服务 if (error) throw new RuntimeException("回滚"); } } - XID 传递:通过 Feign/RestTemplate 调用时,Seata 自动传递全局事务 ID(XID)。
⚙️ 二、事务模式配置
1. AT 模式(默认)
- 依赖
undo_log表实现自动回滚。 - 要求业务表有单列主键,不支持多列主键(MySQL除外)。
2. TCC 模式
- 需自定义 TCC 接口:
@LocalTCC public interface TccAction { @TwoPhaseBusinessAction(name = "prepare", commitMethod = "commit", rollbackMethod = "rollback") boolean prepare(BusinessActionContext ctx, @BusinessActionContextParameter(paramName = "param") String param); boolean commit(BusinessActionContext ctx); boolean rollback(BusinessActionContext ctx); } - 通过
@GlobalTransactional调用 TCC 方法。
3. XA 模式
- 开启 MySQL XA 支持:
[mysqld] innodb_support_xa=1 - 修改配置:
适用于强一致性场景。seata: data-source-proxy-mode: XA
⚠️ 三、关键注意事项
-
版本兼容性:
组件 推荐版本 Spring Cloud Alibaba 2.1.1.RELEASE (Seata 1.4) Seata Client 1.4.0+ Nacos Server 1.2.1+ 避免使用 spring-cloud-alibaba-seata:2.1.2+与 Seata 1.4.0 组合(存在兼容问题)。 -
配置一致性:
- Seata Server 与客户端的
registry.conf和事务分组配置必须一致。 - 若使用 Nacos 配置中心,需通过
nacos-config.sh同步配置。
- Seata Server 与客户端的
-
常见问题:
- 连接失败:检查事务分组映射(
vgroup-mapping)和 Seata Server 注册状态。 - 数据源冲突:排除 Druid 自动配置(如
druid-spring-boot-starter)或降级 Druid 版本。 - 跨服务调用:确保 Feign/RestTemplate 的拦截器已启用(Spring Cloud Alibaba 默认集成)。
- 连接失败:检查事务分组映射(
💎 四、最佳实践
- 事务粒度:
@GlobalTransactional应加在业务入口层(如 Controller 或 Facade 服务)。 - 冷热分离:高频事务服务使用独立数据源,避免 undo_log 表成为性能瓶颈。
- 熔断降级:结合 Sentinel 防止事务阻塞导致雪崩。
通过以上步骤,Seata 可无缝集成到 Spring Cloud 微服务中,解决跨服务事务一致性问题。完整示例参考:Seata + Spring Cloud 实战代码。
原文地址:https://blog.csdn.net/weixin_45762066/article/details/148653348
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!
