自学内容网 自学内容网

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
    
    适用于强一致性场景。

⚠️ 三、关键注意事项

  1. 版本兼容性

    组件推荐版本
    Spring Cloud Alibaba2.1.1.RELEASE (Seata 1.4)
    Seata Client1.4.0+
    Nacos Server1.2.1+
    避免使用 spring-cloud-alibaba-seata:2.1.2+ 与 Seata 1.4.0 组合(存在兼容问题)。
  2. 配置一致性

    • Seata Server 与客户端的 registry.conf 和事务分组配置必须一致
    • 若使用 Nacos 配置中心,需通过 nacos-config.sh 同步配置。
  3. 常见问题

    • 连接失败:检查事务分组映射(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)!