Seata?環(huán)境搭建部署過(guò)程
在使用微服務(wù)中,單體事務(wù)注解@Transactional 就不適用了,需要采用分布式事務(wù)解決方案,本文介紹分布式事務(wù)Seata的安裝。Seata一款開(kāi)源的分布式事務(wù)解決方案,致力于在微服務(wù)架構(gòu)下提供高性能和簡(jiǎn)單易用的分布式事務(wù)服務(wù)。
seata版本: 1.5.2

前提準(zhǔn)備
Seata是一個(gè)分布式事務(wù),seata服務(wù)端也是一個(gè)微服務(wù),需要和其他微服務(wù)一樣需要注冊(cè)中心和配置中心。
同時(shí)事務(wù)回滾,需要數(shù)據(jù)庫(kù)日志記錄。
- 注冊(cè)中心和配置中心:
nacos - 數(shù)據(jù)庫(kù):
mysql
1.下載
進(jìn)入Seata官網(wǎng)下載,下載版本是1.5.2,找到seata-server-1.5.1.tar.gz下載。解壓文件后進(jìn)入seata文件。
2.建表
新建數(shù)據(jù)庫(kù)seata,然后在seata文件夾里面的script文件,找到server —> db —> mysql.sql,在數(shù)據(jù)庫(kù)中執(zhí)行sql語(yǔ)句:
-- the table to store GlobalSession data
CREATE 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 data
CREATE 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 data
CREATE 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);
全局事務(wù)會(huì)話由:全局事務(wù)、分支事務(wù)、全局鎖,對(duì)應(yīng)表分別為global_table、branch_table、lock_table。
3.配置 nacos
在nacos控制臺(tái)添加新的命名空間:

添加一條seata,命名空間ID在后面需要用到:

3.1 上傳配置至Nacos配置中心
進(jìn)到seata目錄中,找到nacos-config.sh文件,路徑:script -> config-center -> nacos -> nacos-config.sh。執(zhí)行nacos-config.sh腳本:
sh nacos-config.sh -h 127.0.0.1 -p 8848 -g SEATA_GROUP -t xxxx -u username -w password
參數(shù)詳解:
- -h
nacos服務(wù)IP - -p
nacos服務(wù)端口 - -u
nacos登錄名 - -w
nacos登錄密碼 - -g
nacos配置的分組名稱,默認(rèn)設(shè)置SEATA_GROUP - -t 上一步配置的
命名空間ID

執(zhí)行腳本之后,輸出以下腳本:
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控制臺(tái)查看配置:

說(shuō)明配置上傳成功。上傳不成功,大部分原因是配置沒(méi)有配置成功,比如命名空間ID沒(méi)配置正確。
4.修改 appplication.yml
找到appplication.yml文件,路徑為:seata -> conf -> application.yml,以下三個(gè)小節(jié)分別配置store、config、registry:

4.1 seata.store
seata.store配置seata的存儲(chǔ),修改store.mode="db":
seata:
store:
# support: file 、 db 、 redis
mode: db
修改數(shù)據(jù)庫(kù)連接,將 seata -> conf -> application.example.yml中附帶額外配置,將其db相關(guān)配置復(fù)制至application.yml,修改store.db相關(guān)屬性。數(shù)據(jù)庫(kù)是步驟一配置的數(shù)據(jù)庫(kù):
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配置中心相關(guān)的配置。將seata.config.type修改成nacos:
seata:
config:
# support: nacos, consul, apollo, zk, etcd3
type: nacos
然后添加seata.config.nacos相關(guān)的配置:
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是配置注冊(cè)中心相關(guān)字段,將seata服務(wù)作為一個(gè)微服務(wù)注冊(cè)到注冊(cè)中心。將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。
啟動(dòng)
找到seata文件中的bin目錄,執(zhí)行啟動(dòng)命令:
seata-server.sh -h 127.0.0.1 -p 8091 -m db
控制臺(tái)輸出:
apm-skywalking not enabled
seata-server is starting, you can check the /opt/seata/logs/start.out
打開(kāi)start.out日志:

系統(tǒng)啟動(dòng)成功,再登錄 http://127.0.0.1:7091,就能看到seata控制臺(tái)信息。
nacos控制臺(tái)服務(wù)列表新增了一個(gè)服務(wù),說(shuō)明seata服務(wù)成功注冊(cè)到了nacos注冊(cè)中心:

總結(jié)
seata安裝版本是1.5.2,版本不同,安裝流程也可能不同,這里的版本需要保持一致- 執(zhí)行
sql創(chuàng)建數(shù)據(jù)表 - 使用腳本添加配置到
nacos配置中心 - 修改
application.yml文件,分別修改store、config、registry相關(guān)配置。 - 啟動(dòng)服務(wù),成功登陸
seata控制臺(tái)。 - 查看
nacos控制臺(tái),服務(wù)列表新增seata服務(wù)。
參考
到此這篇關(guān)于Seata 環(huán)境搭建的文章就介紹到這了,更多相關(guān)Seata 環(huán)境搭建內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java如何比較兩個(gè)對(duì)象并獲取不相等的字段詳解
這篇文章主要給大家介紹了關(guān)于Java如何比較兩個(gè)對(duì)象并獲取不相等的字段以及JAVA判斷(獲?。﹥蓚€(gè)相同對(duì)象不同的數(shù)據(jù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-11-11
MyBatis-Plus中公共字段的統(tǒng)一處理的實(shí)現(xiàn)
在開(kāi)發(fā)中經(jīng)常遇到多個(gè)實(shí)體類有共同的屬性字段,這些字段屬于公共字段,本文主要介紹了MyBatis-Plus中公共字段的統(tǒng)一處理的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08
spring data簡(jiǎn)化jpa開(kāi)發(fā)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了spring data簡(jiǎn)化jpa開(kāi)發(fā),本文主要講述 Spring Data JPA,希望能夠深入學(xué)習(xí) Spring 和 JPA,有興趣的可以了解下2017-09-09
Java實(shí)現(xiàn)批量操作Excel的示例詳解
在操作Excel的場(chǎng)景中,通常會(huì)有一些針對(duì)Excel的批量操作,以GcExcel為例,為大家詳細(xì)介紹一下Java是如何實(shí)現(xiàn)批量操作Excel的,需要的可以參考一下2023-07-07
SpringBoot接口訪問(wèn)頻率限制的實(shí)現(xiàn)方式
接口訪問(wèn)頻率限制是通過(guò)在一定時(shí)間內(nèi)限制用戶對(duì)接口的訪問(wèn)次數(shù)來(lái)實(shí)現(xiàn)的,在Spring Boot中,我們可以通過(guò)多種方式來(lái)實(shí)現(xiàn)接口的限流,如使用過(guò)濾器、攔截器或者借助第三方庫(kù),本文給大家講解的非常詳細(xì),需要的朋友可以參考下2024-07-07
Java中finally和return的關(guān)系實(shí)例解析
這篇文章主要介紹了Java中finally和return的關(guān)系實(shí)例解析,總結(jié)了二者的關(guān)系,然后分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02
淺談Java回收對(duì)象的標(biāo)記和對(duì)象的二次標(biāo)記過(guò)程
這篇文章主要介紹了淺談Java回收對(duì)象的標(biāo)記和對(duì)象的二次標(biāo)記過(guò)程的相關(guān)內(nèi)容,小編覺(jué)得還是挺不錯(cuò)的,這里給大家分享一下,需要的朋友可以參考。2017-10-10

