seata 系列之 spring cloud集成

在Spring Cloud中集成Seata以实现分布式事务管理,需通过引入依赖、配置Seata服务端与客户端、代理数据源、定义事务边界及测试验证等步骤完成。以下是详细的集成步骤和配置说明:

一、Spring Cloud客户端集成

  1. 引入依赖
    pom.xml中添加Seata客户端依赖(推荐使用spring-cloud-starter-alibaba-seata):

    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
      <version>2021.0.4.0</version>  <!-- 根据Spring Cloud版本选择 -->
    </dependency>
    

    或手动引入Seata核心依赖:

    <dependency>
      <groupId>io.seata</groupId>
      <artifactId>seata-spring-boot-starter</artifactId>
      <version>1.7.1</version>
    </dependency>
    
  2. 配置Seata客户端
    application.ymlapplication.properties中配置Seata参数:

    seata:
      enabled: true
      application-id: spring-cloud-demo  # 应用ID
      tx-service-group: my_tx_group     # 事务组名
      service:
        vgroup-mapping:
          my_tx_group: default          # 映射到Seata Server的集群
        grouplist: 127.0.0.1:8091       # Seata Server地址(多实例用逗号分隔)
      registry:
        type: nacos                     # 注册中心类型
        nacos:
          server-addr: 127.0.0.1:8848   # Nacos地址
      config:
        type: nacos                     # 配置中心类型(可选)
        nacos:
          server-addr: 127.0.0.1:8848
    
  3. 配置数据源代理
    Seata通过代理数据源实现事务管理,需在配置类中手动代理或启用自动代理:

    • 手动代理
      @Configuration
      public class DataSourceProxyConfig {
          @Bean
          public DataSourceProxy dataSourceProxy(DataSource dataSource) {
              return new DataSourceProxy(dataSource);
          }
      }
      
    • 自动代理(Spring Boot 2.x+):
      application.yml中启用:
      client:
        support:
          spring:
            datasource:
              autoproxy: true
      
  4. 创建undo_log表(仅AT模式)
    在每个业务数据库中创建undo_log表,用于事务回滚:

    CREATE TABLE undo_log (
      id BIGINT NOT NULL AUTO_INCREMENT,
      branch_id BIGINT NOT NULL,
      xid VARCHAR(128) NOT NULL,
      context VARCHAR(128),
      rollback_info LONGBLOB NOT NULL,
      log_status INT NOT NULL,
      log_created DATETIME NOT NULL,
      log_modified DATETIME NOT NULL,
      PRIMARY KEY (id),
      UNIQUE KEY ux_undo_log (xid, branch_id)
    );
    

二、定义分布式事务

在服务方法上添加@GlobalTransactional注解,开启全局事务:

@Service
public class OrderService {
    @Autowired
    private InventoryService inventoryService;

    @GlobalTransactional(name = "createOrder", rollbackFor = Exception.class)
    public void createOrder(Order order) {
        // 调用库存服务
        inventoryService.reduceStock(order.getProductId(), order.getQuantity());
        // 创建订单
        orderMapper.insert(order);
        // 模拟异常(测试回滚)
        // throw new RuntimeException("测试异常");
    }
}
  • name:事务名称(可选)。
  • rollbackFor:指定触发回滚的异常类型(默认为Exception.class)。

三、测试与验证

  1. 编写测试接口

    @RestController
    public class OrderController {
        @Autowired
        private OrderService orderService;
    
        @RequestMapping("/createOrder")
        public String createOrder() {
            try {
                Order order = new Order();
                order.setProductId(1L);
                order.setQuantity(10);
                orderService.createOrder(order);
                return "Order created successfully.";
            } catch (Exception e) {
                return "Order creation failed: " + e.getMessage();
            }
        }
    }
    
  2. 验证事务行为

    • 正常流程:调用/createOrder接口,检查订单和库存是否同时更新。
    • 异常回滚:在createOrder方法中抛出异常,验证订单和库存是否回滚。

四、常见问题与解决

  1. 无法连接Seata Server

    • 检查registry.confapplication.yml中的注册中心地址是否一致。
    • 确保Seata Server已启动且监听端口正确。
  2. 数据源代理失败

    • 检查是否配置了数据源代理(手动或自动)。
    • 确保undo_log表已创建且字段类型匹配。
  3. 事务不生效

    • 检查@GlobalTransactional注解是否添加到正确的方法上。
    • 验证事务组名(tx-service-group)是否与Seata Server配置一致。

五、生产环境优化建议

  1. 高可用部署

    • 部署多个Seata Server实例,通过Nacos/Eureka注册中心实现负载均衡。
    • 配置vgroupMapping将事务组映射到不同集群,避免单点故障。
  2. 性能调优

    • 调整store.db.maxConn(连接池上限)和store.db.queryLimit(分页查询限制)。
    • 启用批量发送请求:transport.enableTmClientBatchSendRequest=true
  3. 监控与告警

    • 集成Prometheus + Grafana监控Seata指标(如事务成功率、锁等待时间)。
    • 配置告警规则(如事务超时、锁冲突)。
posted @ 2025-10-13 16:09  蓝迷梦  阅读(76)  评论(0)    收藏  举报