SpringCloud中的Seata基本介紹與安裝教程
基本介紹
概述
Seata 是一款開(kāi)源的分布式事務(wù)解決方案,致力于提供高性能和簡(jiǎn)單易用的分布式事務(wù)服務(wù)。Seata 將為用戶提供了 AT、TCC、SAGA 和 XA 事務(wù)模式,為用戶打造一站式的分布式解決方案。
阿里巴巴作為國(guó)內(nèi)最早一批進(jìn)行應(yīng)用分布式改造的企業(yè),很早就遇到微服務(wù)架構(gòu)下的分布式事務(wù)問(wèn)題。阿里巴巴對(duì)于分布式事務(wù)問(wèn)題先后發(fā)布了以下解決方案:
2014 年,阿里中間件團(tuán)隊(duì)發(fā)布 TXC(Taobao Transaction Constructor),為集團(tuán)內(nèi)應(yīng)用提供分布式事務(wù)服務(wù)。
2016 年,TXC 在經(jīng)過(guò)產(chǎn)品化改造后,以 GTS(Global Transaction Service) 的身份登陸阿里云,成為當(dāng)時(shí)業(yè)界唯一一款云上分布式事務(wù)產(chǎn)品。在阿云里的公有云、專有云解決方案中,開(kāi)始服務(wù)于眾多外部客戶。
2019 年起,基于 TXC 和 GTS 的技術(shù)積累,阿里中間件團(tuán)隊(duì)發(fā)起了開(kāi)源項(xiàng)目 Fescar(Fast & EaSy Commit And Rollback, FESCAR),和社區(qū)一起建設(shè)這個(gè)分布式事務(wù)解決方案。
2019 年 fescar 被重命名為了seata(simple extensiable autonomous transaction architecture)。
核心組件
Seata的核心組件可分為Seata服務(wù)端和Seata客戶端兩類
Seata 定義了 3 個(gè)核心組件:
- TC(Transaction Coordinator):事務(wù)協(xié)調(diào)器,維護(hù)全局和分支事務(wù)的狀態(tài),協(xié)調(diào)全局事務(wù)提交或回滾 ,直接調(diào)度事務(wù)參與者RM。負(fù)責(zé)將RM的反饋結(jié)果響應(yīng)給TM,并聽(tīng)從TM的最終決議,將具體決議(提交或回滾)發(fā)送給RM執(zhí)行。相當(dāng)于中間人,主要負(fù)責(zé)維護(hù)全局事務(wù)和分支事務(wù)的狀態(tài)。
- TM(Transaction Manager):事務(wù)管理器,定義全局事務(wù)的范圍、開(kāi)始全局事務(wù)、提交或回滾全局事務(wù)。 它是事務(wù)的發(fā)起者(具體的微服務(wù))。根據(jù)RM第一階段的執(zhí)行結(jié)果,進(jìn)行決議。并將決議反饋給TC。相當(dāng)于發(fā)號(hào)施令的
- RM(Resource Manager):資源管理器,管理分支事務(wù)處理的資源,與TC交談以注冊(cè)分支事務(wù)和報(bào)告分支事務(wù)的狀態(tài),并驅(qū)動(dòng)分支事務(wù)提交或回滾。 其實(shí)就是事務(wù)的參與者。獲取TC的執(zhí)行命令具去執(zhí)行分支事務(wù)的第一階段以及第二階段,并將執(zhí)行結(jié)果反饋給TC,相當(dāng)于具體做事的
三個(gè)組件相互協(xié)作,TC 以 Seata 服務(wù)器(Server)形式獨(dú)立部署,TM 和 RM 則是以 Seata Client 的形式集成在微服務(wù)中運(yùn)行。
四種方案
整體的架構(gòu)如圖:
Seata基于上述架構(gòu)提供了四種不同的分布式事務(wù)解決方案:
- XA模式:強(qiáng)一致性分階段事務(wù)模式,犧牲了一定的可用性,無(wú)業(yè)務(wù)侵入
支持XA協(xié)議 事務(wù)的數(shù)據(jù)庫(kù)。Java 應(yīng)用,通過(guò) JDBC 訪問(wèn)數(shù)據(jù)庫(kù)。
執(zhí)行階段(E xecute):XA start/XA end/XA prepare + SQL + 注冊(cè)分支
完成階段(F inish):XA commit/XA rollback
- TCC模式:最終一致的分階段事務(wù)模式,有業(yè)務(wù)侵入
不依賴于底層數(shù)據(jù)資源的事務(wù)支持:
一階段 prepare 行為:調(diào)用 自定義 的 prepare 邏輯。
二階段 commit 行為:調(diào)用 自定義 的 commit 邏輯。
二階段 rollback 行為:調(diào)用 自定義 的 rollback 邏輯。
所謂 TCC 模式,是指支持把 自定義 的分支事務(wù)納入到全局事務(wù)的管理中。
- AT模式:最終一致的分階段事務(wù)模式,無(wú)業(yè)務(wù)侵入,也是Seata的默認(rèn)模式
基于 支持本地 ACID 事務(wù) 的 關(guān)系型數(shù)據(jù)庫(kù):
一階段 prepare 行為:在本地事務(wù)中,一并提交業(yè)務(wù)數(shù)據(jù)更新和相應(yīng)回滾日志記錄。
二階段 commit 行為:馬上成功結(jié)束,自動(dòng) 異步批量清理回滾日志。
二階段 rollback 行為:通過(guò)回滾日志,自動(dòng) 生成補(bǔ)償操作,完成數(shù)據(jù)回
- SAGA模式:長(zhǎng)事務(wù)模式,有業(yè)務(wù)侵入
Saga模式是SEATA提供的長(zhǎng)事務(wù)解決方案,在Saga模式中,業(yè)務(wù)流程中每個(gè)參與者都提交本地事務(wù),當(dāng)出現(xiàn)某一個(gè)參與者失敗則補(bǔ)償前面已經(jīng)成功的參與者,一階段正向服務(wù)和二階段補(bǔ)償服務(wù)都由業(yè)務(wù)開(kāi)發(fā)實(shí)現(xiàn)。
無(wú)論哪種方案,都離不開(kāi)TC,也就是事務(wù)的協(xié)調(diào)者。
部署TC服務(wù)(安裝)
- 下載
首先要下載seata-server包,地址在http://seata.io/zh-cn/blog/download.html
在非中文目錄解壓縮這個(gè)zip包,其目錄結(jié)構(gòu)如下:
修改registry.conf
注冊(cè)到nacos中
registry { # tc服務(wù)的注冊(cè)中心類,這里選擇nacos,也可以是eureka、zookeeper等 type = "nacos" nacos { # seata tc 服務(wù)注冊(cè)到 nacos的服務(wù)名稱,可以自定義 application = "seata-tc-server" serverAddr = "127.0.0.1:8848" group = "DEFAULT_GROUP" namespace = "" cluster = "SH" username = "nacos" password = "nacos" } } config { # 讀取tc服務(wù)端的配置文件的方式,這里是從nacos配置中心讀取,這樣如果tc是集群,可以共享配置 type = "nacos" # 配置nacos地址等信息 nacos { serverAddr = "127.0.0.1:8848" namespace = "" group = "SEATA_GROUP" username = "nacos" password = "nacos" dataId = "seataServer.properties" } }
nacos添加配置
為了讓tc服務(wù)的集群可以共享配置,我們選擇了nacos作為統(tǒng)一配置中心。因此服務(wù)端配置文件seataServer.properties文件需要在nacos中配好。
配置內(nèi)容如下:
# 數(shù)據(jù)存儲(chǔ)方式,db代表數(shù)據(jù)庫(kù) store.mode=db store.db.datasource=druid store.db.dbType=mysql store.db.driverClassName=com.mysql.jdbc.Driver store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true&rewriteBatchedStatements=true store.db.user=root store.db.password=123 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 # 事務(wù)、日志等配置 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 # 客戶端與服務(wù)端傳輸方式 transport.serialization=seata transport.compressor=none # 關(guān)閉metrics功能,提高性能 metrics.enabled=false metrics.registryType=compact metrics.exporterList=prometheus metrics.exporterPrometheusPort=9898
其中的數(shù)據(jù)庫(kù)地址、用戶名、密碼都需要修改成你自己的數(shù)據(jù)庫(kù)信息。
Server端存儲(chǔ)模式(store.mode)現(xiàn)有file、db、redis三種(后續(xù)將引入raft,mongodb),file模式無(wú)需改動(dòng),直接啟動(dòng)即可。
注: file模式為單機(jī)模式,全局事務(wù)會(huì)話信息內(nèi)存中讀寫并持久化本地文件root.data,性能較高;db模式為高可用模式,全局事務(wù)會(huì)話信息通過(guò)db共享,相應(yīng)性能差些;
建表(僅db)
tc服務(wù)在管理分布式事務(wù)時(shí),需要記錄事務(wù)相關(guān)數(shù)據(jù)到數(shù)據(jù)庫(kù)中,你需要提前創(chuàng)建好這些表。
全局事務(wù)會(huì)話信息由3塊內(nèi)容構(gòu)成,全局事務(wù)-->分支事務(wù)-->全局鎖,對(duì)應(yīng)表global_table、branch_table、lock_table。
新建一個(gè)名為seata的數(shù)據(jù)庫(kù) ,然后執(zhí)行以下sql語(yǔ)句
SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- 分支事務(wù)表 -- ---------------------------- DROP TABLE IF EXISTS `branch_table`; CREATE TABLE `branch_table` ( `branch_id` bigint(20) NOT NULL, `xid` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `transaction_id` bigint(20) NULL DEFAULT NULL, `resource_group_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `resource_id` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `branch_type` varchar(8) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `status` tinyint(4) NULL DEFAULT NULL, `client_id` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `application_data` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `gmt_create` datetime(6) NULL DEFAULT NULL, `gmt_modified` datetime(6) NULL DEFAULT NULL, PRIMARY KEY (`branch_id`) USING BTREE, INDEX `idx_xid`(`xid`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; -- ---------------------------- -- 全局事務(wù)表 -- ---------------------------- DROP TABLE IF EXISTS `global_table`; CREATE TABLE `global_table` ( `xid` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `transaction_id` bigint(20) NULL DEFAULT NULL, `status` tinyint(4) NOT NULL, `application_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `transaction_service_group` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `transaction_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `timeout` int(11) NULL DEFAULT NULL, `begin_time` bigint(20) NULL DEFAULT NULL, `application_data` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `gmt_create` datetime NULL DEFAULT NULL, `gmt_modified` datetime NULL DEFAULT NULL, PRIMARY KEY (`xid`) USING BTREE, INDEX `idx_gmt_modified_status`(`gmt_modified`, `status`) USING BTREE, INDEX `idx_transaction_id`(`transaction_id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; SET FOREIGN_KEY_CHECKS = 1;
啟動(dòng)
進(jìn)入bin目錄,運(yùn)行其中的seata-server.bat即可:
啟動(dòng)成功后,seata-server應(yīng)該已經(jīng)注冊(cè)到nacos注冊(cè)中心了。
到此這篇關(guān)于SpringCloud之Seata基本介紹與安裝的文章就介紹到這了,更多相關(guān)SpringCloud Seata安裝內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java整合Redis實(shí)現(xiàn)坐標(biāo)附近查詢功能
這篇文章主要介紹了Java整合Redis實(shí)現(xiàn)坐標(biāo)附近查詢,我們可以在redis服務(wù)器使用命令 help xxx 查看指令的具體用法,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2023-11-11SpringBoot中@Scheduled實(shí)現(xiàn)服務(wù)啟動(dòng)時(shí)執(zhí)行一次
本文主要介紹了SpringBoot中@Scheduled實(shí)現(xiàn)服務(wù)啟動(dòng)時(shí)執(zhí)行一次,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08將Java程序打包成EXE文件的實(shí)現(xiàn)方式
這篇文章主要介紹了將Java程序打包成EXE文件的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04Java 添加、刪除、替換、格式化Word中的文本的步驟詳解(基于Spire.Cloud.SDK for Java)
這篇文章主要介紹了Java 添加、刪除、替換、格式化Word中的文本(基于Spire.Cloud.SDK for Java),本文分步驟通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08Java Swing JCheckBox復(fù)選框的實(shí)現(xiàn)方法
這篇文章主要介紹了Java Swing JCheckBox復(fù)選框的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12啟動(dòng)Spring項(xiàng)目詳細(xì)過(guò)程(小結(jié))
這篇文章主要介紹了啟動(dòng)Spring項(xiàng)目詳細(xì)過(guò)程(小結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11Mybatis 傳參與排序模糊查詢功能實(shí)現(xiàn)
這篇文章主要介紹了Mybatis 傳參與排序模糊查詢功能實(shí)現(xiàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2025-04-04在SpringBoot中實(shí)現(xiàn)斷點(diǎn)續(xù)傳的實(shí)例代碼
在 Spring Boot 或任何其他 web 開(kāi)發(fā)框架中,斷點(diǎn)續(xù)傳是一種技術(shù),允許文件的傳輸在中斷后可以從中斷點(diǎn)重新開(kāi)始,而不是從頭開(kāi)始,種技術(shù)在處理大文件或在不穩(wěn)定的網(wǎng)絡(luò)環(huán)境中尤為重要,本文給大家介紹了SpringBoot中實(shí)現(xiàn)斷點(diǎn)續(xù)傳的實(shí)例代碼,需要的朋友可以參考下2024-07-07