鋒哥原創的分布式事務框架Seata視頻教程:
實戰阿里分布式事務框架Seata視頻教程(無廢話,通俗易懂版)_嗶哩嗶哩_bilibili實戰阿里分布式事務框架Seata視頻教程(無廢話,通俗易懂版)共計10條視頻,包括:1 阿里分布式事務框架Seata簡介、2 分布式事務簡介、3 SpringCloud Alibaba分布式基礎案例搭建等,UP主更多精彩視頻,請關注UP賬號。https://www.bilibili.com/video/BV1Uf4y1579F/seata主推的是AT模式強一致性解決方案,所以我們采用這個方案來解決前面案例的分布式問題。
7.1 下載和運行seata server
seata server地址:Releases · apache/incubator-seata · GitHub
最新版本 v1.4.2
我們用windows演示,下載seata-server-1.4.2.zip
seata-server配置文件:
seata server所有的配置都在conf文件夾內,該文件夾內有兩個文件我們必須要詳細介紹下。 seata server默認使用file(文件方式)進行存儲事務日志、事務運行信息,我們可以通過-m db腳本參數的形式來指定,目前僅支持file、db這兩種方式。
file.conf
該文件用于配置存儲方式、透傳事務信息的NIO等信息,默認對應registry.conf文件內的file方式配置。
registry.conf
seata server核心配置文件,可以通過該文件配置服務注冊方式、配置讀取方式。
注冊方式目前支持file 、nacos 、eureka、redis、zk、consul、etcd3、sofa等方式,默認為file,對應讀取file.conf內的注冊方式信息。
讀取配置信息的方式支持file、nacos 、apollo、zk、consul、etcd3等方式,默認為file,對應讀取file.conf文件內的配置。
file.conf
我們加一個service
配置:
service {#vgroup->rgroup 服務分組 集群分組默認為"default"vgroupMapping.my_test_tx_group = "default"#only support single nodedefault.grouplist = "127.0.0.1:8091"#degrade current not support 服務降級達到多次錯誤不走seataenableDegrade = false#disabledisable = false#unit ms,s,m,h,d represents milliseconds, seconds, minutes, hours, days, default permanentmax.commit.retry.timeout = "-1"max.rollback.retry.timeout = "-1"
}
這里事務分組概念,我們最后單獨講,主要是為了集群故障的時候,能快速切換,實現高可用;
配置分組映射,集群分組再配置grouplist,暴露server地址,提供給seata-client調用;
最后我們運行bin目錄下的seata-server.bat啟動seata-server:
啟動OK,監聽端口8091
7.2 每個數據庫都建一個undo_log回滾日志表
根據seata AT模式規范,我們新建undo_log表,db_account和db_order都要建;
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=3 DEFAULT CHARSET=utf8
7.3 項目里添加seata-client maven依賴
我們只需要在seata-common公共模塊項目里添加seata依賴,其他子模塊都有了,方便;
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
7.4 項目里配置seata分布式事務
首先是每個項目都要配置seata支持,請求seata-server,根據配置;
再通過@GlobalTransactional注解,開啟全局分布式事務;
seata-order子項目 application.yml配置改下:
server:port: 8081servlet:context-path: /spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/db_order?serverTimezone=Asia/Shanghaiusername: rootpassword: 123456cloud:nacos:discovery:server-addr: 127.0.0.1:8848alibaba:seata:tx-service-group: my_test_tx_groupapplication:name: seata-ordermybatis:mapper-locations: classpath:mybatis/mapper/*.xmlseata:service:vgroup-mapping:my_test_tx_group: defaultgrouplist:default: 127.0.0.1:8091enable-degrade: falsedisable-global-transaction: false
主要多了服務分組和集群分組的配置:
同理,seata-account下的application.yml配置:
server:port: 8082servlet:context-path: /spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/db_account?serverTimezone=Asia/Shanghaiusername: rootpassword: 123456cloud:nacos:discovery:server-addr: 127.0.0.1:8848alibaba:seata:tx-service-group: my_test_tx_groupapplication:name: seata-accountmybatis:mapper-locations: classpath:mybatis/mapper/*.xmlseata:service:vgroup-mapping:my_test_tx_group: defaultgrouplist:default: 127.0.0.1:8091enable-degrade: falsedisable-global-transaction: false
seata-web下的application.yml配置:
server:port: 80servlet:context-path: /spring:cloud:nacos:discovery:server-addr: 127.0.0.1:8848alibaba:seata:tx-service-group: my_test_tx_groupapplication:name: seata-webseata:service:vgroup-mapping:my_test_tx_group: defaultgrouplist:java1234-seata-server: 127.0.0.1:8091enable-degrade: falsedisable-global-transaction: false
seata-web項目->WebController->shopping方法,添加@GlobalTransactional注解
7.5 分布式案例測試
三個子項目一起運行;
兩個RM在seata-server注冊成功;
seata-web項目的RM,TM注冊成功;
seata-order項目的TM注冊成功;
seata-account項目的TM注冊成功;
我們用postman 發送 http://localhost/shopping
post請求
執行發現,訂單表,和日志表都沒有數據,說明測試OK;
7.6 setata二階段提交過程剖析
因為是執行是一瞬間的,很多小伙伴根本無法感受到內部的二階段提交過程。
-
一階段:業務數據和回滾日志記錄在同一個本地事務中提交,釋放本地鎖和連接資源。
-
二階段:
-
提交異步化,非常快速地完成。
-
回滾通過一階段的回滾日志進行反向補償。
-
所以我們在再seata-account項目里搞個斷點,來看下回滾的一個流程;
seata-account項目debug啟動;
再次postman測試,我們立刻查看db_order數據庫表信息(比較難捕獲,因為提交事務超時就立刻回滾,看不到信息)
訂單服務執行完的時候,
db_order有數據
undo_log也有數據
說明一階段業務數據和回滾日志記錄在同一個本地事務中提交,釋放本地鎖和連接資源。
然后下面,如果提交事務超時或者有接口調用異常,則分支事務立刻根據回滾日志,立刻進行反向補償,最后回滾日志會被清空;
如果接口調用一切正常,日志清空,全局事務提交,完成本次事務操作;