環境聲明
軟體 | 版本 | 安裝教程 |
作業系統 | windows | |
Nacos | 2.2.2 | Windows 安裝 Nacos 2.2 |
MySQL | 8.0.27 | Linux 安裝 MySQL 8 |
Seata 服務端安裝部署
下載下傳 Seata
下載下傳 seata-server-1.6.1.zip (⬇️ 更多版本下載下傳), 将檔案解壓到本地目錄 D:\middleware\seata。
資料庫建立
建立名為 seata 的資料庫 ,執行腳本 seata\script\server\db\mysql.sql 建立表結構的建立
Seata 配置
參考 seata\conf\application-example.yml 示例配置檔案修改 seata\conf\application.yml 的配置中心和注冊中心的方式為 nacos ,資料存儲模式為 db
yaml複制代碼seata:
# 配置中心-nacos
config:
# support: nacos, consul, apollo, zk, etcd3
type: nacos
nacos:
server-addr: 127.0.0.1:8848
namespace:
group: SEATA_GROUP
username: nacos
password: nacos
context-path:
data-id: seataServer.properties
# 注冊中心-nacos
registry:
# support: nacos, eureka, redis, zk, consul, etcd3, sofa
type: nacos
nacos:
application: seata-server
server-addr: 127.0.0.1:8848
group: SEATA_GROUP
namespace:
# TC 叢集名稱,下文 Seata 用戶端中配置事務分組名和叢集名映射使用
cluster: default
username: nacos
password: nacos
# 資料存儲模式-db 資料庫
store:
# support: file 、 db 、 redis
mode: db
Nacos 配置
通路 Nacos 控制台,配置清單 public 命名空間建立名為 seataServer.properties 的配置
複制 seata\script\config-center\config.txt 内容至 seataServer.properties
修改 seataServer.properties 的資料庫連接配接資訊
ini複制代碼# 修改資料庫連接配接
store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true&rewriteBatchedStatements=true
store.db.user=username
store.db.password=password
啟動 seata-server
進入 seata\bin 目錄,滑鼠輕按兩下 seata-server.bat 檔案啟動
啟動成功之後,通路 Nacos 控制台檢視服務是否注冊成功
Seata Server 開機自啟
WinSW(Windows Service Wrapper 是一個開源的 Windows 服務包裝器,它可以幫助你将應用程式打包成系統服務,并實作開機自啟動的功能。
下載下傳 WinSW
下載下傳 WinSW-x64.exe v2.12.0 (⬇️ 更多版本下載下傳) 和 sample-minimal.xml
配置 WinSW
- 重命名 WinSW-x64.exe 為 seata-service.exe , sample-minimal.xm 為 seata-service.xml ,将重命名後的檔案放置在D:\middleware\seata\bin 目錄下
- 修改 seata-service.xml 檔案的配置如下:
- xml複制代碼
- <service> <!-- 唯一服務ID--> <id>seata</id> <!-- 顯示服務的名稱 --> <name>Seata Service</name> <!-- 服務描述 --> <description>Seata 服務</description> <!-- 日志路徑--> <logpath>D:\middleware\seata\bin\logs</logpath> <!-- 日志模式 --> <logmode>roll</logmode> <!-- 指定啟動可執行檔案 --> <executable>D:\middleware\seata\bin\seata-server.bat</executable> <!-- 開機啟動 --> <startmode>Automatic</startmode> </service>
安裝和啟動服務
CMD 切換到 D:\middleware\seata\bin 目錄下,執行以下指令完成服務的安裝和啟動
bash複制代碼# 安裝服務
seata-service.exe install
# 啟動服務
seata-service.exe start
# 檢視服務狀态
seata-service.exe status
在 Windows 系統服務清單可以看到 Seata 服務(已驗證可以開機自啟動)
其他指令
bash複制代碼# 解除安裝服務
seata-service.exe uninstall
# 重新開機服務
seata-service.exe restart
SpringBoot 整合 Seata
依賴 pom.xml
xml複制代碼<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<exclusions>
<exclusion>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</exclusion>
</exclusions>
</dependency>
配置 application.yml
yaml複制代碼seata:
enabled: true
# 事務分組名
tx-service-group: default_tx_group
service:
# 事務分組名和叢集名映射(default_tx_group:default),default 是上文 seata server 配置的 TC 叢集名
vgroup-mapping:
default_tx_group: default
# 注冊中心
registry:
type: nacos
nacos:
application: seata-server
server-addr: localhost:8848
namespace:
group: SEATA_GROUP
username: nacos
password: nacos
實戰應用
在需要開啟全局事務的方法添加 @GlobalTransactional 注解,項目完整源碼 youlai-mall
less複制代碼/**
* 訂單支付
*/
@Override
@GlobalTransactional
public boolean payOrder(Long orderId) {
OmsOrder order = this.getById(orderId);
Assert.isTrue(order != null, "訂單不存在");
Assert.isTrue(OrderStatusEnum.UNPAID.getValue().equals(order.getStatus()), "訂單不可支付,請檢查訂單狀态");
RLock lock = redissonClient.getLock(ORDER_LOCK_PREFIX + order.getOrderSn());
try {
lock.lock();
// 扣減餘額
memberFeignClient.deductBalance(SecurityUtils.getMemberId(), order.getPayAmount());
// 扣減庫存
skuFeignClient.deductStock(order.getOrderSn());
// 修改訂單狀态 → 【已支付】
// ....
return true;
} finally {
//釋放鎖
if (lock.isLocked()) {
lock.unlock();
}
}
}
商城源碼
名稱/Git倉庫 | Github | Gitee |
開源組織 | 有來開源組織 | 有來開源組織 |
後端 | youlai-mall | youlai-mall |
前端 | mall-admin | mall-admin |
移動端 | mall-app | mall-app |
作者:有來技術
連結:https://juejin.cn/post/7250361765053087781