自学内容网 自学内容网

微服务架构 --- 使用Seata处理分布式事务

目录

一.Seata 是什么?

1.Seata的核心架构: 

2. Seata的分布式事务处理流程:

 二.Seata的基本使用:

1.环境准备:

2.引入依赖:

3.加入配置来使用Seata:

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

(2)改造模块,添加bootstrap.yaml:

(3)改造application.yaml文件:

三.XA模式:

1.处理流程:

2.注解使用: 

使用 @GlobalTransactional 注解全局事务:

使用 @Transactional 来支持分布式事务的回滚:


一.Seata 是什么?

Seata 是一个开源的分布式事务解决方案,旨在帮助开发者管理分布式系统中的全局事务。它特别适用于微服务架构,在分布式环境下,保证多个服务参与的事务的最终一致性。

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

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

下面是Seata的官网文档:Seata官网

1.Seata的核心架构: 

Seata 的核心架构由以下三个组件组成:

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

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

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

2. Seata的分布式事务处理流程:

Seata 的分布式事务处理流程大致如下:

  1. TM 开启全局事务:微服务的一个模块(通常是一个主调用方)发起全局事务,TM 会通知 TC 开启一个全局事务。
  2. RM 注册分支事务:在全局事务的过程中,各个参与的微服务会向 TC 注册自己的分支事务。
  3. 事务提交或回滚:TM 提交或回滚全局事务时,TC 会通知各个 RM 提交或回滚分支事务,最终完成整个全局事务的处理。

其中,TMRM可以理解为Seata的客户端部分,引入到参与事务的微服务依赖中即可。将来TMRM就会协助微服务,实现本地分支事务与TC之间交互,实现事务的提交或回滚。而TC服务则是事务协调中心,是一个独立的微服务,需要单独部署。

 二.Seata的基本使用:

1.环境准备:

  • Seata Server 安装:在 https://github.com/seata/seata/releases 下载并解压 Seata Server,按照官方文档进行配置,启动 TC(事务协调器)。

  • 数据库事务日志表:在数据库中创建一张 undo_log 表,Seata 用它来管理分支事务的回滚操作。

2.引入依赖:

为了方便各个微服务集成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>

3.加入配置来使用Seata:

 

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

seata:
  registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址
    type: nacos # 注册中心类型 nacos
    nacos:
      server-addr: 虚拟机IP地址: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"
  • Data ID:公共配置的唯一标识(如:common-config.yaml)。
  • Group:可以使用默认的 DEFAULT_GROUP,或自定义一个组名(如:SHARED_GROUP)。
  • Namespace:选择命名空间(如:public,也可以自定义)。
  • 配置格式:建议选择 YAMLJSON 格式。

(2)改造模块,添加bootstrap.yaml

在 Spring Boot 项目中,bootstrap.yml 文件用于优先加载一些关键的配置信息,特别是涉及到外部配置中心服务注册等场景。与 application.yml 相比,bootstrap.yml 的加载优先级更高,因此一些必须在应用程序初始化前获取的配置需要写在 bootstrap.yml 中。 

spring:
  application:
    name: trade-service # 服务名称
  profiles:
    active: dev
  cloud:
    nacos:
      server-addr: 虚拟机IP地址 # 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配置

bootstrap.yml 中启用了 refresh: true,无需重启服务,配置会自动刷新。 

(3)改造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

三.XA模式:

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

1.处理流程:

一阶段:

  • 事务协调者通知每个事务参与者执行本地事务

  • 本地事务执行完成后报告事务执行状态给事务协调者,此时事务不提交,继续持有数据库锁

二阶段:

  • 事务协调者基于一阶段的报告来判断下一步操作

  • 如果一阶段都成功,则通知所有事务参与者,提交事务

  • 如果一阶段任意一个参与者失败,则通知所有事务参与者回滚事务

2.注解使用: 

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

seata:
  data-source-proxy-mode: XA

使用 @GlobalTransactional 注解全局事务:

代码中使用了 @GlobalTransactional 注解来标注全局事务,Seata 会协调参与者在两阶段提交协议下完成操作。你还可以根据业务需求调整数据库和注册中心的配置,以确保系统的高可用性。 

使用 @Transactional 来支持分布式事务的回滚:

@Transactional 是 Spring 提供的事务管理注解,用于声明式事务。如果事务内的某个操作抛出异常,事务将自动回滚。

对比项@Transactional@GlobalTransactional
适用范围单个服务或数据库中的事务多个服务或数据库之间的分布式事务
回滚机制只影响当前服务或数据库通过 Seata 协调多个数据库的回滚
异常处理默认只回滚运行时异常 (RuntimeException)可以指定任何异常回滚 (rollbackFor)
事务协调者Spring 事务管理器Seata TC (Transaction Coordinator)
嵌套事务支持支持嵌套事务,但需配置不支持嵌套事务,每个事务独立

原文地址:https://blog.csdn.net/2302_79840586/article/details/143033321

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!