[Java]微服务之分布式事务

news2024/11/30 12:41:14

介绍

下单业务,前端请求首先进入订单服务,创建订单并写入数据库。然后订单服务调用购物车服务和库存服务:

  • 购物车服务负责清理购物车信息
  • 库存服务负责扣减商品库存

问题分析:

  1. 下单过程中, 订单服务创建订单, 插入自己的数据库, 执行成功
  2. 购物车服务, 清理数据库中用户的购物车数据, 执行成功
  3. 库存服务扣减库存时, 商品库存不够, 那么库存服务就会抛出异常
  4. 订单创建成功了, 购物车页清理了, 但是库存却没有扣减
  5. 这就出现了事务的不一致

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

  1. 其中的每个服务的事务就是一个分支事务。
  2. 整个业务称为全局事务。

认识Seata

Seata是 2019年1月份蚂蚁金服和阿里巴巴共同开源的分布式事务解决方案。致力于提供高性能和简单易用的分布式R事务服务,为用户打造一站式的分布式解决方案。

官网地址:Apache Seata,其中的文档、播客中提供了大量的使用说明、源码分析。

分布式事务总体解决思路

解决分布式事务,各个子事务之间必须能感知到彼此的事务状态,才能保证状态一致。

  1. 需要引入事务协调者(全局事务)进行事务控制,
  2. 所有的子事务都要向全局事务汇报状态
  3. 如果子事务全部成功, 全局事务告知子事务, 提交数据库操作
  4. 如果存在失败的子事务, 全局事务告知子事务, 回滚数据库操作

Seata解决分布式事务的思考会更加完善

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

  1. TC(Transaction Coordinator)-事务协调者: 维护全局和分支事务的状态,协调全局事务提交或回滚
  2. TM (Transaction Manager)-事务管理器: 定义全局事务的范围、开始全局事务、提交或回滚全局事务
  3. RM(Resource Manager)-资源管理器: 管理分支事务,与TC交谈以注册分支事务和报告分支事务的状态

部署TC服务

Seata支持多种存储模式,但考虑到持久化的需要,我们一般选择基于数据库存储。

执行课前资料提供的《seata-tc.sql》,导入数据库表:

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

  1. 其中yaml文件中的配置是我们需要关心的, 代码中有注释, 可以阅读, 需要时可以修改

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

Docker部署

  1. 服务之间都是采用容器名连接, 所欲要确保nacos、mysql都在hm-net网络中(同一个网络)。
  2. 查看网络列表, 看网络是否存在

  1. 查看容器所在的网络

  1. 如果某个容器不再hm-net网络,可以参考下面的命令将某容器加入指定网络:
docker network connect [网络名] [容器名]
  1. 在虚拟机的/root目录执行下面的命令:
docker run --name seata \
-p 8099:8099 \
-p 7099:7099 \
-e SEATA_IP=192.168.1.97 \
-v ./seata:/seata-server/resources \
--privileged=true \
--network hm-net \
-d \
seataio/seata-server:1.5.2

4.1 参数说明

  • --name: 指定容器名
  • -p 8099:8099: 微服务跟seata服务连接时的端口
  • -p 7099:7099: seata控制台访问端口
  • -e SEATA_IP: seata的IP地址, 要改成自己的
  • -v ./seata: 数据卷挂载, 让配置文件生效
  • --privileged=true: 本地文件授权
  • --network: 容器的网络
  • -d: 容器后台运行
  • seataio/seata-server:1.5.2: sreata镜像包和版本

4.2 执行说明

  1. 如果镜像下载困难,也可以把课前资料提供的镜像上传到虚拟机并加载

  1. 查看服务

http://192.168.1.97:8848/nacos

http://192.168.1.97:7099

账密: admin/admin

集成Seate

参与分布式事务的每一个微服务都需要集成Seata,我们以trade-service为例。

  1. 引入依赖

为了方便各个微服务集成seata,我们需要把seata配置共享到nacos,因此不仅仅要引入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>

提示: cart-service服务/item-service服务/trade-service服务都需要改造

  1. 改造配置

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

  1. 配置项的说明

seata:
  registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址
    type: nacos # 注册中心类型 nacos
    nacos:
      server-addr: 192.168.1.97:8848 # nacos地址
      namespace: "" # namespace,默认为空
      group: DEFAULT_GROUP # 分组,默认是DEFAULT_GROUP
      application: seata-server # seata服务名称
      username: nacos
      password: nacos
  tx-service-group: hmall # 事务组名称
  service:
    vgroup-mapping: # 事务组与tc集群的映射关系
      hmall: "default"

  1. 添加共享配置文件bootstrap.yaml

spring:
  application:
    name: trade-service # 服务名称
  profiles:
    active: dev
  cloud:
    nacos:
      server-addr: 192.168.1.97:8848  # 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配置

  1. 改造SpringMvc配置文件
server:
  port: 8085 #每个微服务运行在不同端口
hm:
  swagger:
    title: "交易服务接口文档"
    package: com.hmall.trade.controller
  db:
    database: hm-trade

  1. 重启服务

JDK非11版本启动服务配置中加虚拟机选型, 不然服务启动报错

XA模式

XA规范 是X/Open 组织定义的分布式事务处理(DTP,Distributed Transaction Processing)标准,XA规范 描述了全局的TM与局部的RM之间的接口,几乎所有主流的关系型数据库都对XA规范 提供了支持。

seata的XA模式如下:

一阶段的工作:

  • RM注册分支事务到TC
  • RM执行分支业务sql但不提交
  • RM报告执行状态到TC

二阶段的工作:

  • TC检测各分支事务执行状态
    • a. 如果都成功,通知所有RM提交事务
    • b. 如果有失败,通知所有RM回滚事务
  • RM接收TC指令,提交或回滚事务

XA模式的优点是什么?

  • 事务的强一致性,满足ACID原则。
  • 常用数据库都支持,实现简单,并且没有代码侵入

XA模式的缺点是什么?

  • 因为一阶段需要锁定数据库资源,等待二阶段结束才释放,性能较差
  • 依赖关系型数据库实现事务

Seata的starter已经完成了XA模式的自动装配,实现非常简单

  1. 修改application.yml文件(每个参与事务的微服务),开启XA模式:
seata:
  data-source-proxy-mode: XA

  1. 给发起全局事务的入口方法添加@GlobalTransactional注解

  • 其他的分支事务, 因为有可能要订单回滚, 所以加一下事务注解

  1. 重启服务并测试: 提交订单, 看下单失败后, 购物车的数据能否回滚

  • 二阶段分支执行力回滚

AT模式

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

  1. 阶段一RM的工作:
  • 注册分支事务
  • 记录undo-log(数据快照)
  • 执行业务sql并提交
  • 报告事务状态
  1. 阶段二提交时RM的工作:
  • 删除undo-log即可
  1. 阶段二回滚时RM的工作:
  • 根据undo-log恢复数据到更新前

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

  • XA模式一阶段不提交事务,锁定资源;
  • AT模式一阶段直接提交,不锁定资源。
  • XA模式依赖数据库机制实现回滚;
  • AT模式利用数据快照实现数据回滚。
  • XA模式强一致;AT模式最终一致

实现AT模式

  1. 首先,添加资料中的seata-at.sql到微服务对应的数据库中

  1. 然后,修改application.yml文件,将事务模式修改为AT模式:

  1. 重新测试
  • 选择购物车的商品

  • 进行结算

  • 把商品数量改成0

  • 提交订单失败

  • 购物车数据回滚

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

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

相关文章

存储结构及关系(一)

学习目标 描述数据库的逻辑结构列出段类型及其用途列出控制块空间使用的关键字获取存储结构信息 段的类型 段是数据库中占用空间的对象。它们使用数据库数据文件中的空间。介绍不同类型的段。 表 表是在数据库中存储数据的最常用方法。表段用于存储既没有集群也没有分区的表…

cesium 3dtile ClippingPlanes 多边形挖洞ClippingPlaneCollection

原理就是3dtiles里面的属性clippingPlanes 采用ClippingPlaneCollection&#xff0c;构成多边形来挖洞。 其次就是xyz法向量挖洞 clippingPlanes: new this.ffCesium.Cesium.ClippingPlaneCollection({unionClippingRegions: true, // true 表示多个切割面能合并为一个有效的…

AMD的AI芯片Instinct系列介绍

AMD最强AI芯片发布&#xff01; 在旧金山举行的Advancing AI 2024大会上&#xff0c;AMD推出Instinct MI325X AI加速器&#xff08;以下简称MI325X&#xff09;&#xff0c;直接与英伟达的Blackwell芯片正面交锋。 现场展示的数据显示&#xff0c;与英伟达H200的集成平台H200 …

【大数据学习 | Spark调优篇】Spark之内存调优

1. 内存的花费 1&#xff09;每个Java对象&#xff0c;都有一个对象头&#xff0c;会占用16个字节&#xff0c;主要是包括了一些对象的元信息&#xff0c;比如指向它的类的指针。如果一个对象本身很小&#xff0c;比如就包括了一个int类型的field&#xff0c;那么它的对象头实…

基于深度学习的卷积神经网络十二生肖图像识别系统(PyQt5界面+数据集+训练代码)

本研究提出了一种基于深度学习的十二生肖图像识别系统&#xff0c;旨在利用卷积神经网络&#xff08;CNN&#xff09;进行图像分类&#xff0c;特别是十二生肖图像的自动识别。系统的核心采用了两种经典的深度学习模型&#xff1a;ResNet50和VGG16&#xff0c;进行图像的特征提…

kali linux 装 virtual box 增强工具 Guest Addition

kali linux 装 virtual box 增强工具 Guest Addition install Virtual Box Guest Addition in kali linux 搞了一下午&#xff0c;最终发现是白折腾。 kali linux 自带 virtual box 的增强工具。 kali linux 2021.3 之后的版本都是自带virtual box 增强工具 解决方法 直接…

vue3请求接口报错:Cannot read properties of undefined (reading ‘data‘)

文章目录 报错内容解决方案 报错内容 Cannot read properties of undefined (reading ‘data’) 解决方案 响应未按预期返回 确保服务器返回的数据结构符合预期。例如&#xff0c;服务器可能返回了一个错误响应&#xff0c;而不是预期的 JSON 数据。 检查响应 在 response 拦…

RocketMQ rocketmq-tools管理主题

RocketMQ rocketmq-tools管理主题 环境和软件版本增删改查 环境和软件版本 Win10、IDEA、Jdk1.8、rocketmq 5.1.3、rocketmq-tools 5.1.3 引入依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-tools</artifactId&g…

《datawhale2411组队学习 模型压缩技术7:NNI剪枝》

文章目录 一、NNI简介二、 NNI剪枝快速入门2.1 加载并训练模型2.2 模型剪枝2.3 模型加速&#xff08;剪枝永久化&#xff09;2.4 微调压缩模型2.5 Slim Pruner测试 三、 使用NNI3.0进行Bert压缩&#xff08;剪枝、蒸馏)3.1 数据预处理3.2 训练模型3.3 设置模型蒸馏函数3.4 修剪…

C#学写了一个程序记录日志的方法(Log类)

1.错误和警告信息单独生产文本进行记录&#xff1b; 2.日志到一定内存阈值可以打包压缩&#xff0c;单独存储起来&#xff0c;修改字段MaxLogFileSizeForCompress的值即可&#xff1b; 3.Log类调用举例&#xff1a;Log.Txt(JB.信息,“日志记录内容”,"通道1"); usi…

Java设计模式——职责链模式:解锁高效灵活的请求处理之道

嘿&#xff0c;各位 Java 编程大神和爱好者们&#xff01;今天咱们要一同深入探索一种超厉害的设计模式——职责链模式。它就像一条神奇的“处理链”&#xff0c;能让请求在多个对象之间有条不紊地传递&#xff0c;直到找到最合适的“处理者”。准备好跟我一起揭开它神秘的面纱…

安装SQL Server 2022提示需要Microsoft .NET Framework 4.7.2 或更高版本

安装SQL Server 2022提示需要Microsoft .NET Framework 4.7.2 或更高版本。 原因是&#xff1a;当前操作系统版本为Windows Server 2016 Standard版本&#xff0c;其自带的Microsoft .NET Framework 版本为4.6太低&#xff0c;不满足要求。 根据报错的提示&#xff0c;点击链接…

高德地图 Readme GT 定制版 10.25.0.3249 | 极致简洁

这款定制版高德地图去除了广告&#xff0c;运行速度更快。虽然没有车道级导航、打车功能和红绿灯倒计时等功能&#xff0c;但支持正常登录和收藏功能。检测更新始终为最新版本。 大小&#xff1a;82.5M 下载地址&#xff1a; 百度网盘&#xff1a;https://pan.baidu.com/s/1Y…

Admin.NET框架使用宝塔面板部署步骤

文章目录 Admin.NET框架使用宝塔面板部署步骤&#x1f381;框架介绍部署步骤1.Centos7 部署宝塔面板2.部署Admin.NET后端3.部署前端Web4.访问前端页面 Admin.NET框架使用宝塔面板部署步骤 &#x1f381;框架介绍 Admin.NET 是基于 .NET6 (Furion/SqlSugar) 实现的通用权限开发…

Excel中根据某列内容拆分为工作簿

简介&#xff1a;根据A列的内容进行筛选&#xff0c;将筛选出来的数据生成一个新的工作簿(可以放到指定文件夹下)&#xff0c;且工作簿名为筛选内容。 举例&#xff1a; 将上面的内容使用VBA会在当前test1下生成5个工作簿&#xff0c;工作簿名分别为TEST1.xls TEST2.xls TEST3…

JavaWeb实战(1)(重点:分页查询、jstl标签与jsp、EL表达式、Bootstrap组件搭建页面、jdbc)

目录 一、jstl标签。 &#xff08;1&#xff09;基本概念。 &#xff08;2&#xff09;使用前提。 &#xff08;3&#xff09;"<%...%>"与"<%%>"。 &#xff08;4&#xff09;使用jstl标签的步骤。 1、导入对应jar包。 2、引入核心标签库。&am…

Linux:makefile的使用

makefile小结&#xff1a; makefile的应用&#xff1a; 一个简单的 Makefile 文件包含一系列的“规则”&#xff0c;其样式如下&#xff1a; 目标(target)…: 依赖(prerequiries)… 命令(command) 目标(target)通常是要生成的文件的名称&#xff0c;可以是可执行文件或OBJ文件…

springboot中使用mongodb完成评论功能

pom文件中引入 <!-- mongodb --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> yml中配置连接 data:mongodb:uri: mongodb://admin:1234561…

TCGA 编码格式解读 | 怎么区分是不是肿瘤样品?

最权威参考资料 https://docs.gdc.cancer.gov/Encyclopedia/pages/TCGA_Barcode/ "-"分割符的第四位是Sample type&#xff1a; Tumor types range from 01 - 09,normal types from 10 - 19and control samples from 20 - 29. See Code Tables Report for a compl…

百度 文心一言 vs 阿里 通义千问 哪个好?

背景介绍&#xff1a; 在当前的人工智能领域&#xff0c;随着大模型技术的快速发展&#xff0c;市场上涌现出了众多的大规模语言模型。然而&#xff0c;由于缺乏统一且权威的评估标准&#xff0c;很多关于这些模型能力的文章往往基于主观测试或自行设定的排行榜来评价模型性能…