docker compose整合seata与nacos是微服务分布式事务主流方案,需先启动nacos(注册与配置中心),再部署seata server(tc)并注册接入,最后业务服务以rm身份通过tx-service-group关联接入,依赖mysql存储事务日志且各组件版本需严格对齐。

用 Docker Compose 整合 Seata 和 Nacos,是实现微服务间数据一致性的主流落地方式。关键不在堆组件,而在理清角色分工和配置联动——TC(Seata 服务端)要注册到 Nacos,各微服务作为 RM(资源管理器)才能自动发现并接入全局事务。
明确核心组件职责与依赖关系
Seata 的 AT 模式依赖三个角色协同:TC(事务协调器,独立服务)、TM(事务管理器,嵌在业务服务里)、RM(资源管理器,也嵌在业务服务里)。Nacos 在这里不只做服务发现,还要承担 TC 的注册中心和配置中心双重角色。因此部署顺序不能乱:
- Nacos 必须先启动并健康运行,Seata TC 才能成功注册上去
- Seata TC 启动后,业务服务(如 order-service、user-service)才能通过配置连接到它
- 所有业务库需提前建好 undo_log 表(AT 模式必需),否则 RM 初始化失败
编写 docker-compose.yml 关键配置
一个最小可用的三件套编排需包含 nacos、seata-server、mysql(供 Seata 存储事务日志)。注意版本对齐和网络互通:
- 使用 Nacos 2.0.7 + Seata 1.5.2 组合,与 Spring Boot 2.6.x 兼容性最稳
- seata-server 的 environment 中必须指定 NACOS_SERVER_ADDR,例如 nacos:8848,且 service 名要与 docker-compose 内部 DNS 一致
- 为 seata-server 挂载配置文件(registry.conf、file.conf),其中 registry.type = nacos,config.type = nacos
- MySQL 服务需暴露 3306 端口,并初始化 seata_server 数据库及 branch_table、global_table 等表结构
业务服务接入 Seata 的实操要点
不是加个依赖就完事,以下配置缺一不可:
- Maven 引入 seata-spring-boot-starter 1.5.2 版本,与 Seata 服务端匹配
- application.yml 中配置 seata.tx-service-group(如 my_test_tx_group),该分组名必须与 seata-server 的 file.conf 中 service.vgroupMapping 配置一致
- 全局事务入口方法添加 @GlobalTransactional 注解,内部本地事务仍用 @Transactional
- 确保 Feign 调用传递 xid(Seata 默认开启,但需检查拦截器未被覆盖)
验证与常见问题排查
启动后别急着跑业务,先确认基础链路通不通:
- 访问 http://localhost:8848/nacos,在“服务列表”里看到 seata-server 服务已上线
- 访问 http://localhost:7091(Seata 控制台默认端口),查看当前全局事务数量是否随请求变化
- 制造异常:在 user-service 的扣积分逻辑里手动抛 RuntimeException,观察 order-service 是否自动回滚订单
- 典型失败原因:undo_log 表缺失、Nacos 地址写错、tx-service-group 名不一致、MySQL 驱动版本过高(建议 8.0.28)











