🔧 一、整合核心步驟
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: nacosnacos: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: truedata-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 實戰代碼。