準備環境
一、創建四個數據庫,如下
jeecg_order(訂單數據庫)
jeecg_account(賬户數據庫)
jeecg_product(商品數據庫)
seata(seata數據庫)
以上數據庫腳本已存放至 jeecg-cloud-test-seata 示例中,文件位置如下圖所示
二、準備調試代碼
1. 示例代碼提供如下
- jeecg-cloud-test-seata-order(下單服務)
- jeecg-cloud-test-seata-product(庫存服務)
- jeecg-cloud-test-seata-account(賬户服務)
該示例場景用於下單時檢測庫存是否車充足,餘額是否充足,有一個不滿足是則回滾事務
2. seata 服務端代碼
本次實踐的 seata 版本為 v1.7.0,下載地址: https://seata.apache.org/zh-cn/unversioned/release-history/seata-server
安裝服務端 下載下來進行解壓,目錄結構如下:
進入 bin 目錄啓動 seata,seata 默認端口是 8091
window 下運行 seata-server.bat linux 下運行 seata-server.sh
- 1.修改 seata 服務端的 yml 配置
啓動 seata,如下圖 輸入如下信息後表示啓動成功
微服務模塊添加依賴,具體參考示例代碼
<dependency>
<groupId>org.jeecgframework.boot</groupId>
<artifactId>jeecg-boot-starter-cloud</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.jeecgframework.boot</groupId>
<artifactId>jeecg-boot-starter-seata</artifactId>
<version>3.1.0</version>
</dependency>
微服務模塊添加配置,具體參考示例代碼
seata:
enable-auto-data-source-proxy: false
service:
grouplist:
default: 127.0.0.1:8091
vgroup-mapping:
springboot-seata-group: default
# seata 事務組編號 用於TC集羣名
tx-service-group: springboot-seata-group
啓動測試 依次啓動 jeecg-cloud-test-seata-order(下單服務) jeecg-cloud-test-seata-product(庫存服務) jeecg-cloud-test-seata-account(賬户服務)
啓動完成如下圖 瀏覽器輸入 http://localhost:5001
即可進行測試,如下圖所示
測試正常下參數見截圖
測試餘額不足,測試庫存不足,然後觀察數據庫訂單表插入數據是否回滾
注:本示例不通過網關所以需要排除認證權限 ShiroConfig.java 添加如下代碼
//測試模塊排除
filterChainDefinitionMap.put("/test/seata/**", "anon");
可使用 nacos 作為 seata 的配置中心 新建 seataServer.properties 配置文件內容如下
# 數據存儲方式,db代表數據庫
store.mode=db
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.cj.jdbc.Driver
store.db.url=jdbc:mysql://localhost:3300/seata?useUnicode=true&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai
store.db.user=root
store.db.password=root
store.db.minConn=5
store.db.maxConn=30
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000
# 事務、日誌等配置
server.recovery.committingRetryPeriod=1000
server.recovery.asynCommittingRetryPeriod=1000
server.recovery.rollbackingRetryPeriod=1000
server.recovery.timeoutRetryPeriod=1000
server.maxCommitRetryTimeout=-1
server.maxRollbackRetryTimeout=-1
server.rollbackRetryTimeoutUnlockEnable=false
server.undo.logSaveDays=7
server.undo.logDeletePeriod=86400000
# 客户端與服務端傳輸方式
transport.serialization=seata
transport.compressor=none
# 關閉metrics功能,提高性能
metrics.enabled=false
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898