seata 系列之 spring cloud集成
在Spring Cloud中集成Seata以实现分布式事务管理,需通过引入依赖、配置Seata服务端与客户端、代理数据源、定义事务边界及测试验证等步骤完成。以下是详细的集成步骤和配置说明:
一、Spring Cloud客户端集成
-
引入依赖
在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> -
配置Seata客户端
在application.yml或application.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 -
配置数据源代理
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
- 手动代理:
-
创建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)。
三、测试与验证
-
编写测试接口
@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(); } } } -
验证事务行为
- 正常流程:调用
/createOrder接口,检查订单和库存是否同时更新。 - 异常回滚:在
createOrder方法中抛出异常,验证订单和库存是否回滚。
- 正常流程:调用
四、常见问题与解决
-
无法连接Seata Server
- 检查
registry.conf和application.yml中的注册中心地址是否一致。 - 确保Seata Server已启动且监听端口正确。
- 检查
-
数据源代理失败
- 检查是否配置了数据源代理(手动或自动)。
- 确保
undo_log表已创建且字段类型匹配。
-
事务不生效
- 检查
@GlobalTransactional注解是否添加到正确的方法上。 - 验证事务组名(
tx-service-group)是否与Seata Server配置一致。
- 检查
五、生产环境优化建议
-
高可用部署
- 部署多个Seata Server实例,通过Nacos/Eureka注册中心实现负载均衡。
- 配置
vgroupMapping将事务组映射到不同集群,避免单点故障。
-
性能调优
- 调整
store.db.maxConn(连接池上限)和store.db.queryLimit(分页查询限制)。 - 启用批量发送请求:
transport.enableTmClientBatchSendRequest=true。
- 调整
-
监控与告警
- 集成Prometheus + Grafana监控Seata指标(如事务成功率、锁等待时间)。
- 配置告警规则(如事务超时、锁冲突)。
本文来自博客园,作者:蓝迷梦,转载请注明原文链接:https://www.cnblogs.com/hewei-blogs/articles/19138715

浙公网安备 33010602011771号