微服务--08--Seata 分布式事务

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


分布式事务

在这里插入图片描述
由于订单、购物车、商品分别在三个不同的微服务,而每个微服务都有自己独立的数据库,因此下单过程中就会跨多个数据库完成业务。而每个微服务都会执行自己的本地事务:

  • 交易服务:下单事务
  • 购物车服务:清理购物车事务
  • 库存服务:扣减库存事务

整个业务中,各个本地事务是有关联的。因此每个微服务的本地事务,也可以称为分支事务。多个有关联的分支事务一起就组成了全局事务。我们必须保证整个全局事务同时成功或失败。

1.认识Seata

解决分布式事务的方案有很多,但实现起来都比较复杂,因此我们一般会使用开源的框架来解决分布式事务问题。在众多的开源分布式事务框架中,功能最完善、使用最多的就是阿里巴巴在2019年开源的Seata了。

https://seata.io/zh-cn/docs/overview/what-is-seata.html
在这里插入图片描述

其实分布式事务产生的一个重要原因,就是参与事务的多个分支事务互相无感知,不知道彼此的执行状态。因此解决分布式事务的思想非常简单:

就是找一个统一的事务协调者,与多个分支事务通信,检测每个分支事务的执行状态,保证全局事务下的每一个分支事务同时成功或失败即可。大多数的分布式事务框架都是基于这个理论来实现的。
在这里插入图片描述

Seata也不例外,在Seata的事务管理中有三个重要的角色:

  • TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚。
  • TM (Transaction Manager) - 事务管理器:定义全局事务的范围、开始全局事务、提交或回滚全局事务。
  • RM (Resource Manager) - 资源管理器:管理分支事务,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
    在这里插入图片描述
    其中,TM和RM可以理解为Seata的客户端部分,引入到参与事务的微服务依赖中即可。将来TM和RM就会协助微服务,实现本地分支事务与TC之间交互,实现事务的提交或回滚。

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

2.部署TC服务

2.1.准备数据库表

Seata支持多种存储模式,但考虑到持久化的需要,我们一般选择基于数据库存储。执行课前资料提供的《seata-tc.sql》,导入数据库表:
在这里插入图片描述

2.2.准备配置文件

课前资料准备了一个seata目录,其中包含了seata运行时所需要的配置文件:
在这里插入图片描述
其中包含中文注释,大家可以自行阅读。
我们将整个seata文件夹拷贝到虚拟机的/root目录:
在这里插入图片描述

2.3.Docker部署

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

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

3.微服务集成Seata

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

3.1.引入依赖

为了方便各个微服务集成seata,我们需要把seata配置共享到nacos,因此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>
  <!--sentinel-->
  <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
  </dependency>

3.2.改造配置

首先在nacos上添加一个共享的seata配置,命名为shared-seata.yaml:
在这里插入图片描述

seata:
  registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址
    type: nacos # 注册中心类型 nacos
    nacos:
      server-addr: 192.168.150.101: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"

然后,改造trade-service模块,添加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配置

可以看到这里加载了共享的seata配置。
然后改造application.yaml文件,内容如下:

server:
  port: 8085
feign:
  okhttp:
    enabled: true # 开启OKHttp连接池支持
  sentinel:
    enabled: true # 开启Feign对Sentinel的整合
hm:
  swagger:
    title: 交易服务接口文档
    package: com.hmall.trade.controller
  db:
    database: hm-trade

3.3.添加数据库表

seata的客户端在解决分布式事务的时候需要记录一些中间数据,保存在数据库中。因此我们要先准备一个这样的表。
将课前资料的seata-at.sql分别文件导入hm-trade、hm-cart、hm-item三个数据库中:
在这里插入图片描述

3.4.测试

接下来就是测试的分布式事务的时候了。
我们找到trade-service模块下的com.hmall.trade.service.impl.OrderServiceImpl类中的createOrder方法,也就是下单业务方法。

将其上的@Transactional注解改为Seata提供的@GlobalTransactional

在这里插入图片描述

@GlobalTransactional注解就是在标记事务的起点,将来TM就会基于这个方法判断全局事务范围,初始化全局事务。

我们重启trade-service、item-service、cart-service三个服务。再次测试,发现分布式事务的问题解决了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: seata-server-1.4.2.zip是Seata分布式事务解决方案的一个版本。Seata是一个开源的分布式事务解决方案,为分布式场景下的应用提供了高性能和高可靠性的事务服务。 seata-server-1.4.2.zip文件是Seata服务器的压缩包,其中包含了Seata服务器的运行所需的所有文件和资源。通过下载并解压该压缩包,我们可以在本地搭建并启动Seata服务器。 在Seata服务器启动后,我们可以根据具体的应用场景和需求进行相关配置。例如,可以配置Seata服务器所连接的数据库、注册中心等。在配置完成后,我们可以使用Seata提供的一系列API和工具来实现分布式事务的管理。 通过Seata服务器,我们可以实现跨多个微服务分布式事务一致性控制。Seata提供了高效的事务日志存储和恢复机制,以及分布式锁和事务补偿机制,保证了分布式事务的可靠性和一致性。 总之,seata-server-1.4.2.zip是Seata分布式事务解决方案的一个版本,可以帮助开发者在分布式场景下实现高性能和高可靠性的事务管理。通过下载并启动Seata服务器,我们可以利用其强大的功能来管理和控制分布式事务,提升系统的稳定性和可靠性。 ### 回答2: seata-server-1.4.2.zip是Seata分布式事务框架的一个版本。Seata是一个开源的分布式事务解决方案,用于解决在分布式系统中的事务问题。Seata提供了一系列的功能和组件,可以帮助开发人员实现分布式事务的管理和控制。 seata-server-1.4.2.zip是Seata框架的服务器端部分的打包文件。它包含了Seata服务器所需的所有文件和配置。通过将seata-server-1.4.2.zip解压缩,开发人员可以获得一个完整的Seata服务器端的部署目录。 在seata-server-1.4.2.zip中,包含了以下重要的文件和目录: 1. conf目录:包含了Seata服务器的配置文件,例如registry.conf、file.conf等,可以根据实际需要进行配置。 2. lib目录:包含了Seata服务器的依赖库,例如seata-all.jar等,这些库文件是Seata服务器正常运行所必须的。 3. script目录:包含了Seata服务器的启动脚本,例如seata-server.sh(对于Linux系统)和seata-server.bat(对于Windows系统),可以使用这些脚本来方便地启动和停止Seata服务器。 4. plugins目录:包含了Seata服务器的插件,例如seata-server-db、seata-server-redis等,这些插件提供了与不同类型的存储系统进行交互的能力。 通过下载和使用seata-server-1.4.2.zip,开发人员可以快速部署和配置Seata服务器,并在分布式系统中实现事务的管理和控制。要使用Seata框架,开发人员还需要在应用程序中引入相应的Seata客户端库,并按照Seata的规范进行代码的修改和适配。 ### 回答3: Seata是一款开源的分布式事务解决方案,seata-server-1.4.2.zip是Seata的一个版本。这个zip文件中包含了Seata Server的安装文件和相关配置。 Seata Server是Seata分布式事务中的一个重要组件,主要负责协调和管理全局事务。通过Seata Server,我们可以实现分布式事务的统一管理和控制。 要使用seata-server-1.4.2.zip,首先需要将zip文件解压缩,在解压后的目录中会包含如下文件和文件夹: - bin文件夹:包含seata-server的启动脚本和一些工具脚本。 - conf文件夹:包含seata-server的配置文件,可以根据实际需求进行配置修改。 - lib文件夹:包含了seata-server所依赖的库文件。 在启动Seata Server之前,需要根据实际情况修改conf文件夹中的配置文件。主要修改seata.conf文件,其中包含了Seata Server的相关配置项,如注册中心地址、事务日志存储模式等。 修改完配置文件后,可以使用bin文件夹中的脚本启动Seata Server。根据实际操作系统环境,选择对应的启动脚本进行执行即可。 启动Seata Server后,它会根据配置文件中的信息与注册中心进行通信,注册自己的信息。其他使用Seata的应用程序可以通过注册中心获取到Seata Server的相关信息,从而实现分布式事务的协调和管理。 需要注意的是,seata-server-1.4.2.zip只是Seata的一个版本,随着Seata的不断发展和更新,可能会有新的版本发布。使用时应选择合适的版本,并参考官方文档进行配置和使用。 总之,seata-server-1.4.2.zip是Seata的一个具体版本,通过解压缩并配置启动,我们可以使用它来实现分布式事务的统一管理和控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值