三天學會阿里分布式事務框架Seata-應用seata AT模式方案解決分布式事務問題

鋒哥原創的分布式事務框架Seata視頻教程:

實戰阿里分布式事務框架Seata視頻教程(無廢話,通俗易懂版)_嗶哩嗶哩_bilibili實戰阿里分布式事務框架Seata視頻教程(無廢話,通俗易懂版)共計10條視頻,包括:1 阿里分布式事務框架Seata簡介、2 分布式事務簡介、3 SpringCloud Alibaba分布式基礎案例搭建等,UP主更多精彩視頻,請關注UP賬號。icon-default.png?t=N7T8https://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也有數據

說明一階段業務數據和回滾日志記錄在同一個本地事務中提交,釋放本地鎖和連接資源。

然后下面,如果提交事務超時或者有接口調用異常,則分支事務立刻根據回滾日志,立刻進行反向補償,最后回滾日志會被清空;

如果接口調用一切正常,日志清空,全局事務提交,完成本次事務操作;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/711836.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/711836.shtml
英文地址,請注明出處:http://en.pswp.cn/news/711836.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

dolphinscheduler海豚調度(四)釘釘告警

在之前的博文中&#xff0c;我們已經介紹了DolphinScheduler海豚調度的基本概念和工作流程&#xff0c;以及Shell任務和SQL任務的實踐。今天&#xff0c;讓我們來學習DolphinScheduler中的另一個重要功能&#xff1a;釘釘告警。 釘釘群添加機器人 在釘釘群添加機器人&#xf…

SpringBoot 使用@Async 注解實現異步任務

前言 在現代應用程序中&#xff0c;異步編程已經成為了必備的技能。異步編程使得應用程序可以同時處理多個請求&#xff0c;從而提高了應用程序的吞吐量和響應速度。在 SpringBoot 中&#xff0c;我們可以使用 Async 注解來實現異步編程。本文將介紹 Async 注解的使用方法和注…

從http到websocket

閱讀本文之前&#xff0c;你最好已經做過一些websocket的簡單應用 從http到websocket HTTP101HTTP 輪詢、長輪詢和流化其他技術1. 服務器發送事件2. SPDY3. web實時通信 互聯網簡史web和httpWebsocket協議1. 簡介2. 初始握手3. 計算響應健值4. 消息格式5. WebSocket關閉握手 實…

Redis 緩存數據庫

redis 中文網 http://www.redis.cn/ redis.net.cn 兩種數據庫陣營 1.關系型數據庫 MySQL Oracle DB2 SQL Server 等基于二維表結構存儲數據的文件型磁盤數據庫 缺點: 因為數據庫的特征是磁盤文件型數據庫, 就造成每次查詢都有IO操作, 海量數據查詢速度較慢 2.NoSQL數據庫 …

C++中的常對象、常函數

一、常對象的概念 常對象就是用 const 修飾的對象&#xff0c;常對象必須初始化且不可被修改。 //以日期類對象為例 const Date d1(2004, 5, 25); 二、常對象只能調用常函數 常對象只能調用常函數&#xff0c;不能調用其他函數。 以日期類為例&#xff0c;類中有成員函數P…

lv20 QT 常用控件 2

1 QT GUI 類繼承簡介 布局管理器 輸出控件 輸入控件 按鈕 容器 2 按鈕示例 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QCheckBox> #include <QLineEdit> #include <QPushButton>class Widget : public QWidget {Q_OBJECTpublic…

SLAM面試代碼題:點云去畸變

題目 假設已知一幀點云每個點的時間戳和它的位姿,要求對點云去畸變 解題思路 定義一個點云的struct利用時間戳,把一幀內每個時刻的點云都變換到這一幀的起始時間處位置使用線性插值,旋轉使用球面非線性插值// 點云去畸變 #include <iostream> #include <Eigen/Co…

擊鼓傳花游戲

有N個小朋友圍成一圈玩擊鼓傳花游戲&#xff0c;將小朋友編號為1-N&#xff0c;從1號開始傳花&#xff0c;每次傳3個&#xff0c;拿到花的小朋友表演節目后退出。任給N&#xff0c;問最后一個表演的小朋友編號是多少&#xff1f;例如&#xff1a;輸入5&#xff0c;從1號開始傳花…

基于springboot+vue的共享汽車管理系統(前后端分離)

博主主頁&#xff1a;貓頭鷹源碼 博主簡介&#xff1a;Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰&#xff0c;歡迎高校老師\講師\同行交流合作 ?主要內容&#xff1a;畢業設計(Javaweb項目|小程序|Pyt…

Linux中的echo命令

echo?命令是在Linux系統中常用的用于輸出文本或變量內容的命令。它可以將指定的文本或變量的值輸出到終端上。下面是關于 ?echo?命令的使用說明和示例&#xff1a; 1. 基本語法&#xff1a; echo [選項] [字符串或變量] 2. 使用示例&#xff1a; 輸出文本內容&#xff1…

3d模型版本轉換器注意事項---模大獅模型網

在使用3D模型版本轉換器時&#xff0c;有一些注意事項可以幫助您順利完成模型轉換并避免不必要的問題&#xff1a; 數據完整性&#xff1a;在進行模型轉換之前&#xff0c;確保您的原始3D模型文件沒有損壞或缺失數據。損壞的文件可能導致轉換器無法正常處理或輸出錯誤的結果。 …

力扣經典題目解析--滑動窗口最大值

原題地址: . - 力扣&#xff08;LeetCode&#xff09; 給你一個整數數組 nums&#xff0c;有一個大小為 k 的滑動窗口從數組的最左側移動到數組的最右側。你只可以看到在滑動窗口內的 k 個數字。滑動窗口每次只向右移動一位。 返回 滑動窗口中的最大值 。 示例 1&#xff1a;…

小程序自定義組件

自定義組件 1. 創建-注冊-使用組件 組件介紹 小程序目前已經支持組件化開發&#xff0c;可以將頁面中的功能模塊抽取成自定義組件&#xff0c;以便在不同的頁面中重復使用&#xff1b; 也可以將復雜的頁面拆分成多個低耦合的模塊&#xff0c;有助于代碼維護。 開發中常見的…

111790-37-5 ,生物素-氨基,一種生物素化合物,可與-NHS、-COOH反應

您好&#xff0c;歡迎來到新研之家 文章關鍵詞&#xff1a;111790-37-5 &#xff0c;生物素-氨基&#xff0c;生物素氨基&#xff0c;Biotin-NH2&#xff0c;Biotin-amine 一、基本信息 【產品簡介】&#xff1a;Biotin-NH2 provides a convenient biotinylation method for…

OSCP靶場--DVR4

OSCP靶場–DVR4 考點(1.windows&#xff1a;路徑遍歷獲取私鑰getshell 2.ssh shell中runas切換用戶) 1.nmap掃描 ┌──(root?kali)-[~/Desktop] └─# nmap -sV -sC -p- 192.168.161.179 --min-rate 2000 Starting Nmap 7.92 ( https://nmap.org ) at 2024-02-29 07:14 EST…

Springboot接口參數校驗

在設計接口時我們通常需要對接口中的非法參數做校驗&#xff0c;以降低在程序運行時因為一些非法參數而導致程序發生異常的風險&#xff0c;例如登錄的時候需要校驗用戶名密碼是否為空&#xff0c;創建用戶的時候需要校驗郵件、手機號碼格式是否準確。如果在代碼中對接口參數一…

系統集成Prometheus+Grafana

根據產品需求在自己的系統中添加一個系統監控的頁面&#xff0c;其中有主機信息的顯示&#xff0c;也有一些業務信息的顯示。調研后的方案是 主機信息通過Prometheus采集和存儲&#xff0c;業務信息通過自己系統的調度任務統計后存儲在Mysql中&#xff0c;使用Grafana對接Prome…

Java必須掌握的繼承的特點和繼承體系的設計(含面試大廠題和源碼)

Java繼承是面向對象編程的一個基本特性&#xff0c;它允許一個類繼承另一個類的屬性和方法。設計良好的繼承體系是高質量軟件開發的關鍵。在大廠面試中&#xff0c;面試官可能會詢問關于Java繼承特點及如何設計一個合理的繼承體系的問題&#xff0c;以評估你的面向對象設計能力…

ICLR 2024|ReLU激活函數的反擊,稀疏性仍然是提升LLM效率的利器

論文題目&#xff1a; ReLU Strikes Back: Exploiting Activation Sparsity in Large Language Models 論文鏈接&#xff1a; https://arxiv.org/abs/2310.04564 參數規模超過十億&#xff08;1B&#xff09;的大型語言模型&#xff08;LLM&#xff09;已經徹底改變了現階段人工…

gcc和g++的區別,如何看自己的編譯器支持的C++的版本

gcc和g的區別 用一句話來說&#xff0c;就是gcc將程序視為c語言的&#xff0c;g將程序視為C的 gcc和g的區別主要在于它們處理不同后綴的文件類型、編譯和連接階段的不同調用方式&#xff0c;以及它們對C特性的支持方式。以下是詳細介紹&#xff1a;123 文件類型。gcc將后綴為…