SpringCloud中的Seata基本介紹與安裝教程
基本介紹
概述
Seata 是一款開源的分布式事務(wù)解決方案,致力于提供高性能和簡單易用的分布式事務(wù)服務(wù)。Seata 將為用戶提供了 AT、TCC、SAGA 和 XA 事務(wù)模式,為用戶打造一站式的分布式解決方案。
阿里巴巴作為國內(nèi)最早一批進行應(yīng)用分布式改造的企業(yè),很早就遇到微服務(wù)架構(gòu)下的分布式事務(wù)問題。阿里巴巴對于分布式事務(wù)問題先后發(fā)布了以下解決方案:
2014 年,阿里中間件團隊發(fā)布 TXC(Taobao Transaction Constructor),為集團內(nèi)應(yīng)用提供分布式事務(wù)服務(wù)。
2016 年,TXC 在經(jīng)過產(chǎn)品化改造后,以 GTS(Global Transaction Service) 的身份登陸阿里云,成為當(dāng)時業(yè)界唯一一款云上分布式事務(wù)產(chǎn)品。在阿云里的公有云、專有云解決方案中,開始服務(wù)于眾多外部客戶。
2019 年起,基于 TXC 和 GTS 的技術(shù)積累,阿里中間件團隊發(fā)起了開源項目 Fescar(Fast & EaSy Commit And Rollback, FESCAR),和社區(qū)一起建設(shè)這個分布式事務(wù)解決方案。
2019 年 fescar 被重命名為了seata(simple extensiable autonomous transaction architecture)。
核心組件
Seata的核心組件可分為Seata服務(wù)端和Seata客戶端兩類
Seata 定義了 3 個核心組件:
- TC(Transaction Coordinator):事務(wù)協(xié)調(diào)器,維護全局和分支事務(wù)的狀態(tài),協(xié)調(diào)全局事務(wù)提交或回滾 ,直接調(diào)度事務(wù)參與者RM。負責(zé)將RM的反饋結(jié)果響應(yīng)給TM,并聽從TM的最終決議,將具體決議(提交或回滾)發(fā)送給RM執(zhí)行。相當(dāng)于中間人,主要負責(zé)維護全局事務(wù)和分支事務(wù)的狀態(tài)。
- TM(Transaction Manager):事務(wù)管理器,定義全局事務(wù)的范圍、開始全局事務(wù)、提交或回滾全局事務(wù)。 它是事務(wù)的發(fā)起者(具體的微服務(wù))。根據(jù)RM第一階段的執(zhí)行結(jié)果,進行決議。并將決議反饋給TC。相當(dāng)于發(fā)號施令的
- RM(Resource Manager):資源管理器,管理分支事務(wù)處理的資源,與TC交談以注冊分支事務(wù)和報告分支事務(wù)的狀態(tài),并驅(qū)動分支事務(wù)提交或回滾。 其實就是事務(wù)的參與者。獲取TC的執(zhí)行命令具去執(zhí)行分支事務(wù)的第一階段以及第二階段,并將執(zhí)行結(jié)果反饋給TC,相當(dāng)于具體做事的
三個組件相互協(xié)作,TC 以 Seata 服務(wù)器(Server)形式獨立部署,TM 和 RM 則是以 Seata Client 的形式集成在微服務(wù)中運行。
四種方案
整體的架構(gòu)如圖:
Seata基于上述架構(gòu)提供了四種不同的分布式事務(wù)解決方案:
- XA模式:強一致性分階段事務(wù)模式,犧牲了一定的可用性,無業(yè)務(wù)侵入
支持XA協(xié)議 事務(wù)的數(shù)據(jù)庫。Java 應(yīng)用,通過 JDBC 訪問數(shù)據(jù)庫。
執(zhí)行階段(E xecute):XA start/XA end/XA prepare + SQL + 注冊分支
完成階段(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ù)模式,無業(yè)務(wù)侵入,也是Seata的默認模式
基于 支持本地 ACID 事務(wù) 的 關(guān)系型數(shù)據(jù)庫:
一階段 prepare 行為:在本地事務(wù)中,一并提交業(yè)務(wù)數(shù)據(jù)更新和相應(yīng)回滾日志記錄。
二階段 commit 行為:馬上成功結(jié)束,自動 異步批量清理回滾日志。
二階段 rollback 行為:通過回滾日志,自動 生成補償操作,完成數(shù)據(jù)回
- SAGA模式:長事務(wù)模式,有業(yè)務(wù)侵入
Saga模式是SEATA提供的長事務(wù)解決方案,在Saga模式中,業(yè)務(wù)流程中每個參與者都提交本地事務(wù),當(dāng)出現(xiàn)某一個參與者失敗則補償前面已經(jīng)成功的參與者,一階段正向服務(wù)和二階段補償服務(wù)都由業(yè)務(wù)開發(fā)實現(xiàn)。
無論哪種方案,都離不開TC,也就是事務(wù)的協(xié)調(diào)者。
部署TC服務(wù)(安裝)
- 下載
首先要下載seata-server包,地址在http://seata.io/zh-cn/blog/download.html
在非中文目錄解壓縮這個zip包,其目錄結(jié)構(gòu)如下:
修改registry.conf
注冊到nacos中
registry { # tc服務(wù)的注冊中心類,這里選擇nacos,也可以是eureka、zookeeper等 type = "nacos" nacos { # seata tc 服務(wù)注冊到 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ù)存儲方式,db代表數(shù)據(jù)庫 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ù)庫地址、用戶名、密碼都需要修改成你自己的數(shù)據(jù)庫信息。
Server端存儲模式(store.mode)現(xiàn)有file、db、redis三種(后續(xù)將引入raft,mongodb),file模式無需改動,直接啟動即可。
注: file模式為單機模式,全局事務(wù)會話信息內(nèi)存中讀寫并持久化本地文件root.data,性能較高;db模式為高可用模式,全局事務(wù)會話信息通過db共享,相應(yīng)性能差些;
建表(僅db)
tc服務(wù)在管理分布式事務(wù)時,需要記錄事務(wù)相關(guān)數(shù)據(jù)到數(shù)據(jù)庫中,你需要提前創(chuàng)建好這些表。
全局事務(wù)會話信息由3塊內(nèi)容構(gòu)成,全局事務(wù)-->分支事務(wù)-->全局鎖,對應(yīng)表global_table、branch_table、lock_table。
新建一個名為seata的數(shù)據(jù)庫 ,然后執(zhí)行以下sql語句
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;
啟動
進入bin目錄,運行其中的seata-server.bat即可:
啟動成功后,seata-server應(yīng)該已經(jīng)注冊到nacos注冊中心了。
到此這篇關(guān)于SpringCloud之Seata基本介紹與安裝的文章就介紹到這了,更多相關(guān)SpringCloud Seata安裝內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot中@Scheduled實現(xiàn)服務(wù)啟動時執(zhí)行一次
本文主要介紹了SpringBoot中@Scheduled實現(xiàn)服務(wù)啟動時執(zhí)行一次,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08Java 添加、刪除、替換、格式化Word中的文本的步驟詳解(基于Spire.Cloud.SDK for Java)
這篇文章主要介紹了Java 添加、刪除、替換、格式化Word中的文本(基于Spire.Cloud.SDK for Java),本文分步驟通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08Java Swing JCheckBox復(fù)選框的實現(xiàn)方法
這篇文章主要介紹了Java Swing JCheckBox復(fù)選框的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12在SpringBoot中實現(xiàn)斷點續(xù)傳的實例代碼
在 Spring Boot 或任何其他 web 開發(fā)框架中,斷點續(xù)傳是一種技術(shù),允許文件的傳輸在中斷后可以從中斷點重新開始,而不是從頭開始,種技術(shù)在處理大文件或在不穩(wěn)定的網(wǎng)絡(luò)環(huán)境中尤為重要,本文給大家介紹了SpringBoot中實現(xiàn)斷點續(xù)傳的實例代碼,需要的朋友可以參考下2024-07-07