微服务:分布式事务

news2024/9/23 3:32:51

💥 该系列属于【SpringBoot基础】专栏,如您需查看其他SpringBoot相关文章,请您点击左边的连接

目录

一、引言

二、Seata

三、部署TC服务

1. 准备数据库表

2. 准备配置文件 

3. Docker部署

四、微服务集成Seata

1. 引入依赖

2. 改造配置

3. 启动项目,观察日志

五、XA模式

1. Seata的XA模式

2. 实现

六、AT模式

1. Seata的AT模式

2. AT模式与XA模式最大的区别是什么?

3. 实现


一、引言

在分布式系统中,如果一个业务需要多个服务合作完成,而且每一个服务都有事务,多个事务必须同时成功或失败,这样的事务就是分布式事务。其中的每个服务的事务就是一个分支事务。整个业务称为全局事务。

参与事务的多个子业务在不同的微服务,跨越了不同的数据库。虽然每个单独的业务都能在本地遵循ACID,但是它们互相之间没有感知,不知道有人失败了,无法保证最终结果的统一,也就无法遵循ACID的事务特性了。 

现以下情况之一就可能产生分布式事务问题:

  • 业务跨多个服务实现

  • 业务跨多个数据源实现

二、Seata

在众多的开源分布式事务框架中,功能最完善、使用最多的就是阿里巴巴在2019年开源的Seata了。

在Seata的事务管理中有三个重要的角色:

  • TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚。

  • TM (Transaction Manager) - 事务管理器:定义全局事务的范围、开始全局事务、提交或回滚全局事务。

  • RM (Resource Manager) - 资源管理器:管理分支事务,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

Seata的工作架构如图所示:

其中,TMRM可以理解为Seata的客户端部分,引入到参与事务的微服务依赖中即可。将来TMRM就会协助微服务,实现本地分支事务与TC之间交互,实现事务的提交或回滚。

TC服务则是事务协调中心,是一个独立的微服务,需要单独部署。

三、部署TC服务

1. 准备数据库表

Seata支持多种存储模式,但考虑到持久化的需要,我们一般选择基于数据库存储。执行提前准备的seata-tc.sql,导入数据库表:

2. 准备配置文件 

准备了一个seata目录,其中包含了seata运行时所需要的配置文件:

将整个seata文件夹拷贝到虚拟机的/root目录:

3. Docker部署

在虚拟机的/root目录执行下面的命令:

docker run --name seata \
-p 8099:8099 \
-p 7099:7099 \
-e SEATA_IP=192.168.88.128 \
-v /root/seata:/seata-server/resources \
--privileged=true \
--network hmall \
-d \
seataio/seata-server:1.5.2

确保mysql,nacos和seata再同一个network hmall之下

四、微服务集成Seata

1. 引入依赖

为了方便各个微服务集成seata,我们需要把seata配置共享到nacos,因此item-service, cart-service和trade-service模块不仅仅要引入seata依赖,还要引入nacos依赖:

<!--统一配置管理-->
  <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  </dependency>
  <!--读取bootstrap文件-->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-bootstrap</artifactId>
  </dependency>
  <!--seata-->
  <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
  </dependency>

2. 改造配置

在nacos上添加一个共享的seata配置,命名为shared-seata.yaml

然后,改造hm-trade,hm-cart和hm-item两个微服务模块:bootstrap.yaml

spring:
  application:
    name: trade-service # 服务名称
  profiles:
    active: dev
  cloud:
    nacos:
      server-addr: 192.168.150.101 # nacos地址
      config:
        file-extension: yaml # 文件后缀名
        shared-configs: # 共享配置
          - dataId: shared-jdbc.yaml # 共享mybatis配置
          - dataId: shared-log.yaml # 共享日志配置
          - dataId: shared-swagger.yaml # 共享日志配置
          - dataId: shared-seata.yaml # 共享seata配置

3. 启动项目,观察日志

docker logs -f seata 

集成seata成功。 

五、XA模式

1. Seata的XA模式

Seata对原始的XA模式做了简单的封装和改造,以适应自己的事务模型,基本架构如图:

RM一阶段的工作:

  1. 注册分支事务到TC

  2. 执行分支业务sql但不提交

  3. 报告执行状态到TC

TC二阶段的工作:

  1. TC检测各分支事务执行状态

    1. 如果都成功,通知所有RM提交事务

    2. 如果有失败,通知所有RM回滚事务

RM二阶段的工作:

  • 接收TC指令,提交或回滚事务

XA模式的优点是什么?

  • 事务的强一致性,满足ACID原则

  • 常用数据库都支持,实现简单,并且没有代码侵入

XA模式的缺点是什么?

  • 因为一阶段需要锁定数据库资源,等待二阶段结束才释放,性能较差

  • 依赖关系型数据库实现事务

2. 实现

首先,我们要在配置文件中指定要采用的分布式事务模式。我们可以在Nacos中的共享shared-seata.yaml配置文件中设置:

seata:
  data-source-proxy-mode: XA

其次,我们要利用@GlobalTransactional标记分布式事务的入口方法:

六、AT模式

AT模式同样是分阶段提交的事务模型,不过缺弥补了XA模型中资源锁定周期过长的缺陷。

1. Seata的AT模式

阶段一RM的工作:

  • 注册分支事务

  • 记录undo-log(数据快照)

  • 执行业务sql并提交

  • 报告事务状态

阶段二提交时RM的工作:

  • 删除undo-log即可

阶段二回滚时RM的工作:

  • 根据undo-log恢复数据到更新前

2. AT模式与XA模式最大的区别是什么?

简述AT模式与XA模式最大的区别是什么?

  • XA模式一阶段不提交事务,锁定资源;AT模式一阶段直接提交,不锁定资源。

  • XA模式依赖数据库机制实现回滚;AT模式利用数据快照实现数据回滚。

  • XA模式强一致;AT模式最终一致

可见,AT模式使用起来更加简单,无业务侵入,性能更好。因此企业90%的分布式事务都可以用AT模式来解决。

3. 实现

微服务对应的数据库中创建快照表undo_log:

-- for AT mode you must to init this sql for you business database. the seata server not need it.
CREATE TABLE IF NOT EXISTS `undo_log`
(
    `branch_id`     BIGINT       NOT NULL COMMENT 'branch transaction id',
    `xid`           VARCHAR(128) NOT NULL COMMENT 'global transaction id',
    `context`       VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization',
    `rollback_info` LONGBLOB     NOT NULL COMMENT 'rollback info',
    `log_status`    INT(11)      NOT NULL COMMENT '0:normal status,1:defense status',
    `log_created`   DATETIME(6)  NOT NULL COMMENT 'create datetime',
    `log_modified`  DATETIME(6)  NOT NULL COMMENT 'modify datetime',
    UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
) ENGINE = InnoDB
  AUTO_INCREMENT = 1
  DEFAULT CHARSET = utf8mb4 COMMENT ='AT transaction mode undo table';

执行结果: 

 在Nacos中的共享shared-seata.yaml配置文件中设置:(也可以不写,因为AT是默认值)

seata:
  data-source-proxy-mode: AT

 其次,我们要利用@GlobalTransactional标记分布式事务的入口方法:

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2057413.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

json 库的下载与使用

Json 简介Json下载Json::Value 数据对象类Json 序列化/反序列化的介绍Json 的序列化类低版本高版本 Json 的反序列化类低版本高版本 Json序列化操作Json反序列化操作 简介 json 是一种数据交换格式&#xff0c;采用独立于编程语言的文本格式来存储和表示的数据。 Json下载 使…

波导阵列天线单元 学习笔记3 基于空气填充双模馈网的双圆极化膜片天线阵列

摘要&#xff1a; 此通信提出了一种使用空气填充双模馈网的基于膜片极化器的双圆极化天线阵列。一种1分4的圆腔单层覆盖在膜片极化器上来抑制栅瓣。全公司馈网被一个双模传输线所实现&#xff0c;以此在一组馈网内联合了TEM模式&#xff08;由HW悬架线激励&#xff09;和TE10模…

Stable Diffusion赋能“黑神话”——助力悟空走进AI奇幻世界

《黑神话&#xff1a;悟空》是由游戏科学公司制作的以中国神话为背景的动作角色扮演游戏&#xff0c;将于2024年8月20日发售。玩家将扮演一位“天命人”&#xff0c;为了探寻昔日传说的真相&#xff0c;踏上一条充满危险与惊奇的西游之路。 同时&#xff0c;我们还可以借助AI绘…

智能电子班牌源码之终端管理-SAAS本地化及未来之窗行业应用跨平台架构

一智能电子班牌 智能电子班牌为教育行业量身打造&#xff0c;高清显示屏体、可安装各类软件&#xff0c;满足门禁、考勤、信息显示等多种功能。节能防水防误触设计&#xff0c;更适用于校园环境。 二、设备管理 1. 提高效率&#xff1a;管理员无需亲临设备现场&#xff0c;…

Maven-03.idea集成-配置及创建maven项目

一.配置Maven 写在前面&#xff1a;特别注意idea版本与Maven版本以及jdk版本与Maven版本的匹配问题。一定要下载和当前idea版本以及jdk版本匹配的maven版本&#xff0c;否则会出问题。具体匹配结果上网查询&#xff01;此处采用idea2023.2.3&#xff0c;jdk17&#xff0c;mave…

edge浏览器可以,chrome浏览器看不到接口数据

chrome 谷歌浏览器&#xff0c;可以看到页面&#xff0c;F12的开发者工具看不到返回数据 无法加载响应数据: No data found for resource with given identifier Chrome 将显示 ERR_INTERNET_DISCONNECTED 错误 edge浏览器是正常的。 哈哈哈哈哈哈&#xff0c;这里误点了&a…

C ++初阶:类和对象(上)

目录 &#x1f31e;0.前言 1. 面向过程和面向对象初步认识 2..类的引入与定义 2.1类的引入 2.2类的定义 3.类的访问限定符及其封装 3.1访问限定符 3.2封装 4.类的作用域 4.1加餐和发现 5.类的实例化 6.类对象大小的计算 6.1.内部的存储方式 6.2结构体对齐规则回顾…

【闪送-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

【办公软件】安全风险 Microsoft 已阻止宏运行,因为此文件的来源不受信任

Excel 2019版本&#xff0c;就出现安全风险 Microsoft 已阻止宏运行 因为此文件的来源不受信任的问题&#xff0c;宏直接就用不了了。 网上的解决方法&#xff0c;文件右键属性->取消安全锁。但存在没有安全锁这个选项。后查询到一个简单的解决方法。 打开Excel表格->文件…

利用MongoDB进行数据治理,防范构建生成式AI应用程序时的潜在安全风险

生成式人工智能&#xff08;生成式AI&#xff09;正在蓬勃发展&#xff0c;许多企业和初创公司正在运用AI工具来解决各自的用例问题。随着企业逐渐适应市场上的新技术范式转移&#xff0c;开发者社区和开源模型也在不断发展壮大。 构建智能生成式AI应用程序需要灵活运用数据。…

R语言统计分析——线性模型假设的综合验证与多重共线性

参考资料&#xff1a;R语言实战【第2版】 1、线性模型假设的综合验证 gvlma包中的gvlma()函数&#xff0c;能对线性模型进行综合验真&#xff0c;同时还能做偏斜度、峰度和异方差性的评价。也就是说&#xff0c;它给模型提供了一个单独的综合验证&#xff08;通过/不通过&…

RK3568平台开发系列讲解(UART篇)line discipline

🚀返回专栏总目录 文章目录 一、UART 读写过程二、line discipline组成沉淀、分享、成长,让自己和他人都能有所收获!😄 line discipline 介于 TTY 层和具体的串口驱动 ( 比如 serial8250 ) 之间。 一、UART 读写过程 发送数据时: 应用程序通过系统调用向 TTY 设备文件写…

打卡学习Python爬虫第四天|bs4爬取优美图库的小清新图片

bs4解析比较简单&#xff0c;通过HTML的标签和属性去提取值&#xff0c;find(标签,属性"值"&#xff09; 但是需要了解HTML的语法知识&#xff0c;然后再使用bs4去提取&#xff0c;逻辑和编写难度就会比较简单和清晰。 bs4如何使用&#xff1f;如有如下HTML代码&am…

币价与数据持续低迷,比特币和以太坊能否从低谷中恢复?

在过去的一周里&#xff0c;加密货币市场经历了令人失望的表现&#xff0c;比特币和以太坊的价格持续低迷&#xff0c;引发了投资者的广泛关注。尽管宏观经济背景提供了一些利好因素&#xff0c;但市场情绪依然低迷&#xff0c;BTC/USD 和 ETH/USD 均未能打破当前的下行趋势。本…

鸿蒙HarmonyOS开发知识:命令行工具篇—“codelinter”

codelinter同时支持使用命令行执行代码检查与修复&#xff0c;可将codelinter工具集成到门禁或持续集成环境中。 codelinter命令行格式为&#xff1a; codelinter [options] [dir] options&#xff1a;可选配置&#xff0c;请参考表1。 dir&#xff1a;待检查的工程根目录…

在项目中运用os 模块获取本机ip地址并运用到终端启动成功打开network

一、安装os模块 os 模块是 Node.js 的内置模块&#xff0c;不需要额外安装 二、在项目中新建一个名为 getLocalIpAddress.js 的文件 // getLocalIpAddress.js const os require(os);function getLocalIpAddress() {const interfaces os.networkInterfaces();for (const na…

LNMP 架构(Linux+NGINX+memcache+PHP)

目录 1 源码编译PHP与NGINX 1.1 NGINX 源码编译 1.2 PHP 源码编译安装 2 实现PHP与NGINX的连接 2.1 php-fpm的详细介绍 2.2 LNMP与LAMP的区别 2.3 PHP配置文件的介绍 2.4 实例实现php-fpm 与 NGINX的连接 2.4.1 指定pid的存放位置 2.4.2 php-fpm设置监听自己端口与IP 2.4.3 主配…

Excel 跨表格引用单格公式--> =表格名!单元格坐标

背景 需要将 A 表格中某单个单元格引用到 B 表格。一搜教程都是 VLOOKUP 函数&#xff0c;但是该函数用于多内容条件应用&#xff0c;尝试中发现公式&#xff0c;遂总结成经验贴。 公式&#xff08;注意符号英文&#xff09;&#xff1a; 表格名!单元格坐标 例子 这里需要…

【游戏】什么是摄影游戏(Photography Games)

“Photography games” 是指以摄影为主题或核心机制的电子游戏。这类游戏通常让玩家通过虚拟摄像头或相机捕捉游戏世界中的场景、人物、动物或物品。这些游戏可以有不同的玩法和目标&#xff0c;通常包括以下几种类型&#xff1a; 探索与拍摄&#xff1a;玩家在游戏世界中自由…

【大模型理论篇】LLaMA3结构关键模块分析

1. 背景介绍 在文章《关于LLaMA 3.1 405B以及小模型的崛起》中&#xff0c;我们提到&#xff0c;LLaMA 3.1 的模型架构基本上已经成为当前LLM 模型的标准结构&#xff0c;和《Transformer原理分析》中提到的结构&#xff0c;也类似。但相比较&#xff0c;其中的一些关键模…