博客 / 詳情

返回

JeecgBoot 與分佈式事務 Seata v1.7.0 集成實戰

準備環境

一、創建四個數據庫,如下

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
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.