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

介绍

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

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

问题分析:

  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

  • 提交订单失败

  • 购物车数据回滚

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何在谷歌浏览器中使用开发者工具调试网页

在数字时代&#xff0c;网页开发和调试已成为每个前端开发人员必备的技能。谷歌浏览器&#xff08;Google Chrome&#xff09;提供了强大的开发者工具&#xff0c;帮助开发者快速定位和修复网页中的问题。本文将详细介绍如何使用Chrome开发者工具来调试网页&#xff0c;同时也会…

新增工作台模块,任务中心支持一键重跑,MeterSphere开源持续测试工具v3.5版本发布

2024年11月28日&#xff0c;MeterSphere开源持续测试工具正式发布v3.5版本。 在这一版本中&#xff0c;MeterSphere新增工作台模块&#xff0c;工作台可以统一汇总系统数据&#xff0c;提升测试数据的可视化程度并增强对数据的分析能力&#xff0c;为管理者提供测试工作的全局…

在Springboot项目中实现将文件上传至阿里云 OSS

oss介绍 阿里云对象存储服务&#xff08;OSS&#xff09;是一种高效、安全和成本低廉的数据存储服务&#xff0c;可以用来存储和管理海量的数据文件。本文将教你如何使用 Java 将文件上传到阿里云 OSS&#xff0c;并实现访问文件。 1. 准备工作 1.1 开通 OSS 服务 登录阿里云…

CrystalDiskInfo:硬盘健康监测工具简介和下载

原论坛给你更好的阅读体验&#xff1a;CrystalDiskInfo&#xff1a;硬盘健康监测工具简介和下载 | 波波论坛 引言 在日常使用电脑时&#xff0c;硬盘的健康状态对于系统的稳定性和数据的安全性至关重要。硬盘出现故障可能会导致数据丢失&#xff0c;严重时甚至会使整个系统无…

springboot339javaweb的新能源充电系统pf(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;新能源充电系统的设计与实现 摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解…

【第三讲】Spring Boot 3.4.0 新特性详解:增强的配置属性支持

Spring Boot 3.4.0 版本在配置属性的支持上进行了显著增强&#xff0c;使得开发者能够更灵活地管理和使用应用程序的配置。新的特性包括对配置属性的改进、类型安全增强、以及对环境变量的更好支持。这些改进旨在提升开发效率和代码可读性&#xff0c;同时简化配置过程。本文将…

龙迅#LT6912适用于HDMI2.0转HDMI+LVDS/MIPI,分辨率高达4K60HZ,支持音频和HDCP2.2

1. 描述 LT6912是一款高性能的HDMI2.0转HDMI和LVDS和MIPI转换器。 HDMI2.0 输入和输出均支持高达 6Gbps 的数据速率&#xff0c;为4k60Hz视频提供足够的带宽。此外&#xff0c;还支持 HDCP2.2 进行数据解密&#xff08;无数据 加密&#xff09;。 对于 LVDS 输出&#xff0c…

彻底理解微服务配置中心的作用

常见的配置中心有SpringCloudConfig、Apollo、Nacos等&#xff0c;理解它的作用&#xff0c;无非两点&#xff0c;一是配置中心能做什么&#xff0c;不使用配置中心会出现什么问题。 作用&#xff1a;配置中心是用来集中管理服务的配置&#xff0c;它是用来提高系统配置的维护…

MySQL数据库表的操作

1、总述 今天我跟大家分享MySQL数据库中表的创建&#xff0c;查看&#xff0c;修改&#xff0c;删除。 2、创建表 create table table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎; 说明&#xff1…

摄影相关常用名词

本文介绍与摄影相关的常用名词。 曝光 Exposure 感光元件接收光线的过程&#xff0c;决定图像的明暗程度和细节表现。 光圈 Aperture 控制镜头进光量的孔径大小&#xff0c;用 F 值&#xff08;f-stop&#xff09; 表示。 光圈越大&#xff08;F 值越小&#xff09;&#xff0c…

使用 VLC 在本地搭建流媒体服务器 (详细版)

提示&#xff1a;详细流程 避坑指南 Hi~&#xff01;欢迎来到碧波空间&#xff0c;平时喜欢用博客记录学习的点滴&#xff0c;欢迎大家前来指正&#xff0c;欢迎欢迎~~ ✨✨ 主页&#xff1a;碧波 &#x1f4da; &#x1f4da; 专栏&#xff1a;音视频 目录 借助VLC media pl…

C++之C++11新特性(三)--- 智能指针

目录 一、智能指针 1.1 为什么需要智能指针 1.2 内存泄漏 1.2.1 内存泄漏的基本概念 1.2.2 内存泄漏的分类 1.2.3 如何避免内存泄漏 1.3 智能指针的使用及其原理 1.3.1 RAII 1.3.2 智能指针的基本原理 1.3.3 auto_ptr 1.3.4 unique_ptr 1.3.5 shared_ptr 1.3.6 sha…

Elasticearch索引mapping写入、查看、修改

作者&#xff1a;京东物流 陈晓娟 一、ES Elasticsearch是一个流行的开源搜索引擎&#xff0c;它可以将大量数据快速存储和检索。Elasticsearch还提供了强大的实时分析和聚合查询功能&#xff0c;数据模式更加灵活。它不需要预先定义固定的数据结构&#xff0c;可以随时添加或修…

golang版本管理工具:scoop使用

安装 Scoophttps://scoop.sh/根据官方文档安装。 第一步&#xff1a;打开PowerShell。(注意不要使用管理员方式打开&#xff0c;否则在执行安装Scoop的过程中&#xff0c;会报错。) 第二步&#xff1a;切到C盘根目录下。 第三步&#xff1a; Set-ExecutionPolicy -Executi…

USB Type-C一线通扩展屏:多场景应用,重塑高效办公与极致娱乐体验

在追求高效与便捷的时代&#xff0c;启明智显USB Type-C一线通扩展屏方案正以其独特的优势&#xff0c;成为众多职场人士、娱乐爱好者和游戏玩家的首选。这款扩展屏不仅具备卓越的性能和广泛的兼容性&#xff0c;更能在多个应用场景中发挥出其独特的价值。 USB2.0显卡&#xff…

【vue for beginner】ref和reactive

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 在 Vue 3 中&#xff0c;ref 和 reactive 是用于创建响应式数据的两种主要方法。…

从技术视角看AI在Facebook全球化中的作用

在全球化日益加深的今天&#xff0c;人工智能&#xff08;AI&#xff09;作为一种变革性技术&#xff0c;正在深刻影响全球互联网巨头的发展方向。Facebook作为全球最大的社交媒体平台之一&#xff0c;正通过AI技术突破语言、文化和技术的障碍&#xff0c;推动全球化战略的实现…

css:转换

转换 移动 /* transform: translate(100px, 200px); */transform: translateX(100px);transform: translateY(100px); /*一个意思*/ 如果后面跟百分数的意思是移动盒子自身x/y方向长度的百分比&#xff0c;可以用作子绝父相控制盒子水平居中垂直居中 translate里的xy值是相对…

SpringCloud2~~~

Nacos Nacos就是替代 注册中心【Eureka】 和 配置中心【Config】 支持AP和CP&#xff0c;可以切换 了解即可 下载和运行 下载版本&#xff08;找自己想要的版本&#xff09;&#xff1a;Tags alibaba/nacos GitHub 本地有良好的 Java8 Maven环境 解压安装包&#xff0c;直接…

从0开始学PHP面向对象内容之常用设计模式(享元)

二、结构型设计模式 7、享元模式&#xff08;Flyweight Pattern&#xff09; 这里是引用享元模式&#xff08;Flyweight Pattern&#xff09; 是一种结构型设计模式&#xff0c;旨在通过共享对象来减少内存使用&#xff0c;尤其适用于大量相似对象的场景。通过共享和重用对象的…