Seata 環境搭建

在使用微服務中,單體事務註解

@Transactional

就不適用了,需要採用分散式事務解決方案,本文介紹分散式事務

Seata

的安裝。

Seata

一款開源的分散式事務解決方案,致力於在微服務架構下提供高效能和簡單易用的分散式事務服務。

seata

版本:

1。5。2

Seata 環境搭建

前提準備

Seata

是一個分散式事務,

seata

服務端也是一個

微服務

,需要和其他微服務一樣需要

註冊中心

配置中心

。同時事務回滾,需要資料庫日誌記錄。

註冊中心和配置中心:

nacos

資料庫:

mysql

1。下載

進入Seata官網下載,下載版本是

1。5。2

,找到

seata-server-1。5。1。tar。gz

下載。解壓檔案後進入

seata

檔案。

2。建表

新建資料庫

seata

,然後在

seata

資料夾裡面的

script

檔案,找到

server

—>

db

—>

mysql。sql

,在資料庫中執行

sql

語句:

—— the table to store GlobalSession dataCREATE TABLE IF NOT EXISTS `global_table`( `xid` VARCHAR(128) NOT NULL, `transaction_id` BIGINT, `status` TINYINT NOT NULL, `application_id` VARCHAR(32), `transaction_service_group` VARCHAR(32), `transaction_name` VARCHAR(128), `timeout` INT, `begin_time` BIGINT, `application_data` VARCHAR(2000), `gmt_create` DATETIME, `gmt_modified` DATETIME, PRIMARY KEY (`xid`), KEY `idx_status_gmt_modified` (`status` , `gmt_modified`), KEY `idx_transaction_id` (`transaction_id`)) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;—— the table to store BranchSession dataCREATE TABLE IF NOT EXISTS `branch_table`( `branch_id` BIGINT NOT NULL, `xid` VARCHAR(128) NOT NULL, `transaction_id` BIGINT, `resource_group_id` VARCHAR(32), `resource_id` VARCHAR(256), `branch_type` VARCHAR(8), `status` TINYINT, `client_id` VARCHAR(64), `application_data` VARCHAR(2000), `gmt_create` DATETIME(6), `gmt_modified` DATETIME(6), PRIMARY KEY (`branch_id`), KEY `idx_xid` (`xid`)) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;—— the table to store lock dataCREATE TABLE IF NOT EXISTS `lock_table`( `row_key` VARCHAR(128) NOT NULL, `xid` VARCHAR(128), `transaction_id` BIGINT, `branch_id` BIGINT NOT NULL, `resource_id` VARCHAR(256), `table_name` VARCHAR(32), `pk` VARCHAR(36), `status` TINYINT NOT NULL DEFAULT ‘0’ COMMENT ‘0:locked ,1:rollbacking’, `gmt_create` DATETIME, `gmt_modified` DATETIME, PRIMARY KEY (`row_key`), KEY `idx_status` (`status`), KEY `idx_branch_id` (`branch_id`), KEY `idx_xid_and_branch_id` (`xid` , `branch_id`)) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;CREATE TABLE IF NOT EXISTS `distributed_lock`( `lock_key` CHAR(20) NOT NULL, `lock_value` VARCHAR(20) NOT NULL, `expire` BIGINT, primary key (`lock_key`)) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES (‘AsyncCommitting’, ‘ ’, 0);INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES (‘RetryCommitting’, ‘ ’, 0);INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES (‘RetryRollbacking’, ‘ ’, 0);INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES (‘TxTimeoutCheck’, ‘ ’, 0);

全域性事務會話由:全域性事務、分支事務、全域性鎖,對應表分別為

global_table

branch_table

lock_table

3。配置 nacos

nacos

控制檯新增新的名稱空間:

Seata 環境搭建

新增一條

seata

名稱空間ID

在後面需要用到:

Seata 環境搭建

3。1 上傳配置至Nacos配置中心

進到

seata

目錄中,找到

nacos-config。sh

檔案,路徑:

script

->

config-center

->

nacos

->

nacos-config。sh

。執行

nacos-config。sh

指令碼:

sh nacos-config。sh -h 127。0。0。1 -p 8848 -g SEATA_GROUP -t xxxx -u username -w password

引數詳解:

-h

nacos

服務IP

-p

nacos

服務埠

-u

nacos

登入名

-w

nacos

登入密碼

-g

nacos

配置的分組名稱,預設設定

SEATA_GROUP

-t 上一步配置的

名稱空間ID

Seata 環境搭建

執行指令碼之後,輸出以下指令碼:

Set server。maxCommitRetryTimeout=-1 successfully Set server。maxRollbackRetryTimeout=-1 successfully Set server。rollbackRetryTimeoutUnlockEnable=false successfully Set server。distributedLockExpireTime=10000 successfully Set server。xaerNotaRetryTimeout=60000 successfully Set server。session。branchAsyncQueueSize=5000 successfully Set server。session。enableBranchAsyncRemove=false successfully Set server。enableParallelRequestHandle=false successfully Set metrics。enabled=false successfully Set metrics。registryType=compact successfully Set metrics。exporterList=prometheus successfully Set metrics。exporterPrometheusPort=9898 successfully

再去

nacos

控制檯檢視配置:

Seata 環境搭建

說明配置上傳成功。上傳不成功,大部分原因是配置沒有配置成功,比如

名稱空間ID

沒配置正確。

4。修改 appplication。yml

找到

appplication。yml

檔案,路徑為:

seata

->

conf

->

application。yml

,以下三個小節分別配置

store

config

registry

Seata 環境搭建

4。1 seata。store

seata。store

配置

seata

的儲存,修改

store。mode=“db”

seata: store: # support: file 、 db 、 redis mode: db

修改資料庫連線,將

seata

->

conf

->

application。example。yml

中附帶額外配置,將其

db

相關配置複製至

application。yml

,修改

store。db

相關屬性。資料庫是

步驟一

配置的資料庫:

seata: store: # support: file 、 db 、 redis mode: db db: datasource: druid db-type: mysql driver-class-name: com。mysql。jdbc。Driver url: jdbc:mysql://xxxxx:3306/seata?rewriteBatchedStatements=true user: xxxx password: xxx min-conn: 5 max-conn: 100 global-table: global_table branch-table: branch_table lock-table: lock_table distributed-lock-table: distributed_lock query-limit: 100 max-wait: 5000

4。2 seata。config

seata。config

是配置

nacos配置中心

相關的配置。將

seata。config。type

修改成

nacos

seata: config: # support: nacos, consul, apollo, zk, etcd3 type: nacos

然後新增

seata。config。nacos

相關的配置:

seata: config: # support: nacos, consul, apollo, zk, etcd3 type: nacos nacos: server-addr: 127。0。0。1:8848 group : “SEATA_GROUP” namespace: “xxxxx” username: “xxx” password: “xxx”

其中

namespace

是步驟3中的

名稱空間ID

4。3 seata。registry

seata。registry

是配置註冊中心相關欄位,將

seata

服務作為一個微服務註冊到

註冊中心

。將

registry。type

改成

nacos

,配置如下:

seata: registry: # support: nacos, eureka, redis, zk, consul, etcd3, sofa type: nacos nacos: application: “seata-server” serverAddr: 127。0。0。1:8848 group: “SEATA_GROUP” namespace: “xxxxxx” username: “xxxx” password: “xxx”

namespace

也是步驟3中的

名稱空間ID

啟動

找到

seata

檔案中的

bin

目錄,執行啟動命令:

seata-server。sh -h 127。0。0。1 -p 8091 -m db

控制檯輸出:

apm-skywalking not enabledseata-server is starting, you can check the /opt/seata/logs/start。out

開啟

start。out

日誌:

Seata 環境搭建

系統啟動成功,再登入 http://127。0。0。1:7091,就能看到

seata

控制檯資訊。

nacos

控制檯服務列表新增了一個服務,說明

seata

服務成功註冊到了

nacos

註冊中心:

Seata 環境搭建

總結

seata

安裝版本是

1。5。2

,版本不同,安裝流程也可能不同,這裡的版本需要保持一致

執行

sql

建立資料表

使用指令碼新增配置到

nacos

配置中心

修改

application。yml

檔案,分別修改

store

config

registry

相關配置。

啟動服務,成功登陸

seata

控制檯。

檢視

nacos

控制檯,服務列表新增

seata

服務。

參考

Seata新手部署指南