您好,登錄后才能下訂單哦!
介紹
Seata 是阿里巴巴開源的分布式事務(wù)中間件,一種分布式事務(wù)解決方案,具有高性能和易于使用的微服務(wù)架構(gòu)。
初衷
對業(yè)務(wù)無侵入:即減少技術(shù)架構(gòu)上的微服務(wù)化所帶來的分布式事務(wù)問題對業(yè)務(wù)的侵入
高性能:減少分布式事務(wù)解決方案所帶來的性能消耗
分布式事務(wù)定義
分布式事務(wù)是一個全局事務(wù),由一批分支事務(wù)組成,通常分支事務(wù)只是本地事務(wù)。
設(shè)計
Seata中有兩種分布式事務(wù)實現(xiàn)方案,AT和TCC。
AT
AT模式是基于XA事務(wù)演進而來,核心是對業(yè)務(wù)無侵入,是一種改進后的兩階段提交,需要數(shù)據(jù)庫支持。
基本組件:
事務(wù)協(xié)調(diào)器(TC):事務(wù)協(xié)調(diào)器,維護全局事務(wù)的運行狀態(tài),負責(zé)協(xié)調(diào)并驅(qū)動全局事務(wù)的提交或回滾。
Transaction Manager(TM):?控制全局事務(wù)的邊界,負責(zé)開啟一個全局事務(wù),并最終發(fā)起全局提交或全局回滾的決議。
資源管理器(RM):控制分支事務(wù),負責(zé)分支注冊、狀態(tài)匯報,并接收事務(wù)協(xié)調(diào)器的指令,驅(qū)動分支(本地)事務(wù)的提交和回滾。
處理流程:
TM要求TC開始新的全局事務(wù)。TC生成表示全局事務(wù)的XID。
XID通過微服務(wù)的調(diào)用鏈傳播。
RM將本地事務(wù)注冊為XID到TC的相應(yīng)全局事務(wù)的分支。
TM要求TC提交或回滾XID的相應(yīng)全局事務(wù)。
TC在XID的相應(yīng)全局事務(wù)下驅(qū)動所有分支事務(wù)以完成分支提交或回滾。
TCC
Seata要求每個接口實現(xiàn)prepare、commit、rollback。
與 AT 模式一樣,在運行時,該切面會攔截所有對 TCC 接口的調(diào)用。每調(diào)用一次 Try 接口,切面會先向 TC 注冊一個分支事務(wù),然后才去執(zhí)行原來的 RPC 調(diào)用。當(dāng)請求鏈路調(diào)用完成后,TC 通過分支事務(wù)的資源 ID 回調(diào)到正確的參與者去執(zhí)行對應(yīng) TCC 資源的 Confirm 或 Cancel 方法。
初步操作 Try:完成所有業(yè)務(wù)檢查,預(yù)留必須的業(yè)務(wù)資源。
確認操作 Confirm:真正執(zhí)行的業(yè)務(wù)邏輯,不做任何業(yè)務(wù)檢查,只使用 Try 階段預(yù)留的業(yè)務(wù)資源。因此,只要 Try 操作成功,Confirm 必須能成功。另外,Confirm 操作需滿足冪等性,保證一筆分布式事務(wù)能且只能成功一次。
取消操作 Cancel:釋放 Try 階段預(yù)留的業(yè)務(wù)資源。同樣的,Cancel 操作也需要滿足冪等性。
Seata Server安裝
1.下載最新版本的 Seata Sever
https://github.com/seata/seata/releases
2. 解壓并啟動 Seata server
unzip?seata-server-xxx.zip
cd?distribution
sh?./bin/seata-server.sh?8091?file
示例
場景:
把數(shù)據(jù)庫zeroa中proxy表的一條數(shù)據(jù)轉(zhuǎn)移到數(shù)據(jù)庫zerob中proxy表里面。
模塊:
zero-discovery-server:注冊中心
zero-gateway-server:服務(wù)網(wǎng)關(guān)
zero-consumer:服務(wù)消費者
zero-provider-a:服務(wù)提供者A
zero-provider-b:服務(wù)提供者B
架構(gòu)及版本:
Spring-cloud:Finchley.BUILD-SNAPSHOT
spring-cloud-starter-netflix-eureka-server:2.0.4.BUILD-SNAPSHOT
spring-cloud-starter-netflix-eureka-client:2.0.4.BUILD-SNAPSHOT
spring-cloud-starter-gateway:2.0.4.BUILD-SNAPSHOT
spring-cloud-starter-openfeign:2.0.0.RELEASE
spring-boot:2.0.0.RELEASE
spring-boot-starter-data-jpa:2.0.0.RELEASE
spring-cloud-alibaba-seata:0.9.1.BUILD-SNAPSHOT
seata-all:0.6.1
mysql-connector-java:8.0.11
druid-spring-boot-starter:1.1.18
mysql:5.7
seata-server-0.6.1
實現(xiàn):
zero-gateway-server
配置application.yml
zero-provider-a:
配置application.yml
File.conf
主要配置應(yīng)用名稱和seata server地址
vgroup_mapping.${spring.application.name}-fescar-service-group="default"
default.grouplist = "127.0.0.1:8091"
Registry.conf
編寫Entity
編寫Repository
編寫Service
編寫代碼Controller
DataSource
zero-provider-b
配置同zero-provider-a工程,編寫相應(yīng)的業(yè)務(wù)邏輯。
在處理添加業(yè)務(wù)時,拋出異常。
zero-consumer
配置同zero-provider-a工程,編寫相應(yīng)的業(yè)務(wù)邏輯。
feignClient
feignclient
Service
Controller
測試
啟動Seata Server
啟動Mysql,并初始化(每個庫都要創(chuàng)建undo_log表)
DROP?SCHEMA?IF?EXISTS?zeroa;
CREATE?SCHEMA?zeroa;
USE?zeroa;
CREATE?TABLE?`undo_log`?(
??`id`?bigint(20)?NOT?NULL?AUTO_INCREMENT,
??`branch_id`?bigint(20)?NOT?NULL,
??`xid`?varchar(100)?NOT?NULL,
??`context`?varchar(128)?NOT?NULL,
??`rollback_info`?longblob?NOT?NULL,
??`log_status`?int(11)?NOT?NULL,
??`log_created`?datetime?NOT?NULL,
??`log_modified`?datetime?NOT?NULL,
??`ext`?varchar(100)?DEFAULT?NULL,
??PRIMARY?KEY?(`id`),
??UNIQUE?KEY?`ux_undo_log`?(`xid`,`branch_id`)
)?ENGINE=InnoDB?AUTO_INCREMENT=1?DEFAULT?CHARSET=utf8;
DROP?SCHEMA?IF?EXISTS?zerob;
CREATE?SCHEMA?zerob;
USE?zerob;
CREATE?TABLE?`undo_log`?(
??`id`?bigint(20)?NOT?NULL?AUTO_INCREMENT,
??`branch_id`?bigint(20)?NOT?NULL,
??`xid`?varchar(100)?NOT?NULL,
??`context`?varchar(128)?NOT?NULL,
??`rollback_info`?longblob?NOT?NULL,
??`log_status`?int(11)?NOT?NULL,
??`log_created`?datetime?NOT?NULL,
??`log_modified`?datetime?NOT?NULL,
??`ext`?varchar(100)?DEFAULT?NULL,
??PRIMARY?KEY?(`id`),
??UNIQUE?KEY?`ux_undo_log`?(`xid`,`branch_id`)
)?ENGINE=InnoDB?AUTO_INCREMENT=1?DEFAULT?CHARSET=utf8;
啟動
zero-discovery-server
zero-gateway-server
zero-provider-a
zero-provider-b
zero-consumer
添加數(shù)據(jù)
正常執(zhí)行事務(wù)
可在兩張表中查看數(shù)據(jù)(a庫中刪除id=2的數(shù)據(jù),b庫中添加了一條數(shù)據(jù))。
執(zhí)行事務(wù)回滾
查看數(shù)據(jù)庫數(shù)據(jù)(沒有變化)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。