Seata进阶全文详解(集成Nacos及SpringCloud配置)

Seata 简介

在当今微服务架构盛行的时代,分布式系统中的事务管理成为了一个极具挑战性的问题。Seata(Simple Extensible Autonomous Transaction Architecture)应运而生,它是一款专为微服务架构设计的分布式事务解决方案,致力于帮助开发人员轻松实现分布式事务管理,确保在复杂的分布式环境下事务的一致性得以保障。Seata 以其轻量级的特性,为分布式系统中的事务难题提供了简洁高效的解决途径,尤其在 Spring Cloud 和 Dubbo 等主流微服务框架中表现出色,能够无缝集成,大大降低了开发人员在分布式事务处理上的工作量和技术难度。

Seata 支持多种事务模式,其中包括 AT(自动化事务)、TCC(Try Confirm Cancel)、SAGA 和 XA 等。AT 模式通过对 SQL 语句的解析和自动生成回滚日志,实现了事务的自动管理,对业务代码侵入性极低;TCC 模式则通过业务层面的 Try、Confirm、Cancel 三个阶段的操作,满足了对事务一致性要求较高且业务场景复杂的应用;SAGA 模式适用于长事务场景,将一个大事务拆分成多个小事务,通过事件驱动的方式依次执行,确保最终一致性;XA 模式则基于传统的 XA 协议,提供了强一致性的事务保障。这些丰富的事务模式,使得 Seata 能够灵活适配各种分布式事务场景,无论是高并发的电商交易、复杂的金融业务,还是对事务一致性要求极高的企业级应用,Seata 都能凭借其强大的分布式事务管理能力,为系统的稳定运行提供坚实保障。


Seata 的主要特点

支持多种事务模式

Seata 提供了 AT、TCC、SAGA、XA 等多种事务模式,开发人员可以根据不同的业务场景和需求,灵活选择最合适的事务模式。例如,在对性能要求较高且业务逻辑相对简单的场景中,AT 模式是一个不错的选择;而在涉及到复杂业务流程和资源锁定的场景下,TCC 模式则能更好地发挥其优势。

轻量级架构

Seata 设计理念强调轻量级,它不需要在每个服务中添加大量的依赖和繁琐的配置。开发人员只需进行最小化的配置,即可快速实现分布式事务管理。这使得 Seata 在不增加系统复杂性和资源消耗的前提下,为微服务架构提供了强大的事务支持,大大提高了开发效率和系统的可维护性。

高度可扩展

Seata 具备丰富的扩展机制,允许用户根据自身的特殊需求进行定制化扩展。无论是对事务模式的扩展、对事务协调器的定制,还是对资源管理器的个性化改造,Seata 都提供了相应的扩展点和接口,使得用户能够根据实际业务场景对 Seata 进行灵活调整,满足不断变化的业务需求。

分布式事务一致性保障

Seata 采用了先进的二阶段提交协议等技术手段,确保在分布式环境下事务的一致性。在事务执行过程中,Seata 会协调各个参与节点,保证所有相关操作要么全部成功提交,要么全部回滚,避免出现数据不一致的情况,为系统的稳定运行提供了可靠的保障。

支持微服务框架

Seata 对 Spring Cloud、Dubbo、Motan 等常见的微服务框架提供了良好的支持。通过与这些框架的无缝集成,Seata 能够轻松融入现有的微服务架构中,开发人员可以利用熟悉的框架和工具进行分布式事务的开发和管理,降低了技术门槛和学习成本,提高了项目的开发效率和质量。


Seata 组件

Seata 的架构由多个组件协同工作,每个组件都承担着独特而关键的功能。深入理解这些组件及其职责,对于开发人员充分利用 Seata 进行高效的分布式事务管理至关重要。

Seata 的主要组件

Transaction Coordinator(TC)

事务协调器,作为全局事务的核心管理者,负责统筹整个分布式事务的生命周期。它接收来自客户端发起的事务请求,实时跟踪和管理事务的状态信息。在事务执行过程中,TC 协调不同资源的事务操作,确保各个参与节点之间的操作能够有序进行,最终实现分布式事务的一致性。

Transaction Manager(TM)

事务管理器,在分布式事务中扮演着客户端与事务协调器(TC)之间的桥梁角色。它负责事务的创建、提交和回滚等关键操作。当客户端发起一个事务请求时,TM 首先记录该请求,并为其分配一个唯一的全局事务 ID,然后与 TC 进行交互,协调事务的执行流程。

Resource Manager(RM)

资源管理器,主要负责管理参与者的事务资源。它将本地事务的操作细节同步到事务协调器 TC,以便 TC 能够全面掌握全局事务的执行情况,从而协调全局事务的顺利执行。RM 在事务执行过程中,负责与本地资源进行交互,执行具体的事务操作,并根据 TC 的指令进行事务的提交或回滚。

Seata Server

Seata Server 集成了 TC 和 RM 的功能,是分布式事务管理的核心枢纽。它不仅负责协调全局事务的执行,还管理着各个资源管理器的事务资源,为整个分布式事务系统提供了稳定可靠的运行环境。


Seata 的架构图

    +---------------+          +-------------------+|    Client     |<-------->|  Transaction TM   ||  Application  |          |   (事务管理器)    |+---------------+          +-------------------+|                           ||                           ||                           |v                           v+----------------+        +---------------------+| Transaction TC |<------>|    Resource RM      ||  (事务协调器)  |        |    (资源管理器)     |+----------------+        +---------------------+

在这个架构图中,清晰地展示了各个组件之间的交互关系。客户端应用程序通过 TM 发起事务请求,TM 将请求转发给 TC,TC 负责协调 RM 进行事务的具体执行。在事务执行过程中,TM 和 RM 都与 TC 保持密切的通信,确保事务的一致性和完整性。


Seata 生命周期

Seata 的生命周期涵盖了从事务开始到最终完成的多个关键阶段,深入了解这些阶段对于开发人员在实际项目中准确、高效地使用 Seata 进行事务管理具有重要意义。


事务生命周期

事务开始

当一个微服务调用其他微服务时,会向 Seata TM 发送一个事务请求。TM 接收到请求后,立即发起一个全局事务(Global Transaction,GT),并为该全局事务分配一个唯一的全局事务 ID。这个全局事务 ID 将贯穿整个事务的生命周期,用于标识和跟踪事务的执行过程。

本地事务开始

在各个参与者(即资源管理器 RM)上,会启动本地事务。每个本地事务都拥有一个独立的本地事务 ID,Seata 通过这个本地事务 ID 实时跟踪本地事务的执行状态。在本地事务执行过程中,RM 会记录事务操作的详细信息,包括对数据的修改、锁定等操作。

提交 / 回滚判断

当全局事务执行完成后,事务协调器(TC)会对全局事务的执行结果进行判断。如果所有本地事务都成功执行,即没有任何一个本地事务出现异常或失败的情况,TC 会判定全局事务成功,准备进行提交操作;反之,如果有任何一个本地事务执行失败,TC 则会判定全局事务失败,触发回滚操作。

全局事务提交 / 回滚

Seata 采用二阶段提交协议(2PC)来协调各个参与者,确保所有本地事务要么同时提交,要么同时回滚,从而保证数据的一致性。在提交阶段,TC 会向所有资源管理器发送提交请求,RM 收到请求后,将本地事务的操作结果持久化到数据库中,完成事务的提交;在回滚阶段,TC 向所有资源管理器发送回滚请求,RM 根据之前记录的事务操作信息,撤销之前的所有操作,将数据恢复到事务开始前的状态。


事务的状态

Seata 的事务状态主要包括以下几种:

Initiated

事务刚刚开始,此时事务处于初始状态,等待各个资源管理器进行相应的操作。在这个阶段,全局事务 ID 已经生成,但本地事务尚未开始执行,系统正在为事务的执行做准备工作。

Prepared

事务已经准备好,可以进行提交或者回滚操作。在这个状态下,所有本地事务都已经执行完毕,并且相关的数据已经被锁定,等待 TC 的最终指令。此时,事务处于一种中间状态,既没有完成提交,也没有进行回滚。

Committed

事务已成功提交,所有的操作已永久生效。在这个状态下,所有本地事务的操作结果都已经被持久化到数据库中,事务完成了整个生命周期,数据的一致性得到了保障。

Rolledback

事务回滚,所有的操作都被撤销。当事务执行过程中出现异常或者某个本地事务失败时,TC 会触发回滚操作,将所有已执行的本地事务回滚到事务开始前的状态,确保数据的一致性和完整性。


Seata 执行流程

Seata 的执行流程涉及多个严谨有序的步骤,每个步骤都有着明确的功能和任务,这些步骤协同工作,确保了分布式事务的高效、准确执行。

执行流程

1. 客户端发起事务

客户端应用程序通过 Seata 提供的 API 发起一个全局事务请求。事务管理器 TM 接收到请求后,会详细记录该请求的相关信息,并为其分配一个唯一的全局事务 ID。这个全局事务 ID 将作为整个事务的标识,用于在后续的事务执行过程中跟踪和管理事务。

2. 事务执行阶段

客户端应用程序开始执行本地事务操作,在操作过程中,会向 Seata 的资源管理器 RM 提交本地事务请求。RM 接收到请求后,将事务操作的详细信息提交给 Seata 的事务协调器 TC。同时,RM 会在本地记录事务操作的日志,以便在需要时进行事务的回滚操作。

3. 事务提交 / 回滚阶段
  • 提交

当所有本地事务都成功执行后,Seata 的事务协调器 TC 会向所有资源管理器发送提交请求。RM 收到提交请求后,会将本地事务的操作结果持久化到数据库中,完成事务的提交操作。在提交过程中,RM 会释放之前锁定的资源,确保数据的正常访问。

  • 回滚

如果某个本地事务失败,Seata 的事务协调器 TC 会立即向所有资源管理器发送回滚请求。RM 收到回滚请求后,根据之前记录的事务操作日志,撤销之前的所有操作,将数据恢复到事务开始前的状态。在回滚过程中,RM 会释放所有锁定的资源,确保数据的一致性和完整性。

  • 事务结束

当全局事务被成功提交或者回滚后,所有与之相关的本地事务都被最终处理完毕,事务正式结束。在事务结束后,系统会清理与该事务相关的临时资源和状态信息,为下一次事务的执行做好准备。

二阶段提交协议(2PC)

Seata 使用二阶段提交协议来确保分布式事务的一致性。在第一个阶段,事务协调器(TC)会向所有资源管理器(RM)发送准备请求。RM 收到请求后,开始执行本地事务,并锁定相关的数据资源。在本地事务执行完毕后,RM 向 TC 反馈执行结果,表示本地事务已经准备好,可以进行提交或者回滚操作。

在第二阶段,事务协调器会根据各个资源管理器的反馈决定是否提交或者回滚全局事务。如果所有 RM 都反馈本地事务执行成功,TC 会向所有 RM 发送提交请求,RM 收到提交请求后,将本地事务的操作结果持久化到数据库中,完成事务的提交;如果有任何一个 RM 反馈本地事务执行失败,TC 会向所有 RM 发送回滚请求,RM 收到回滚请求后,根据之前记录的事务操作日志,撤销之前的所有操作,将数据恢复到事务开始前的状态。


在 Spring Cloud 中配置 Seata

Seata 在 Spring Cloud 中的集成相对简便,通过添加相关依赖、配置事务管理器以及进行必要的参数配置,即可快速启动并使用 Seata 进行分布式事务管理。以下是一个详细的配置示例,帮助开发人员更好地理解和实践。

添加依赖

在项目的 pom.xml 文件中添加 Seata 相关依赖:

<dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId><version>1.5.2</version>
</dependency>

添加该依赖后,项目将引入 Seata 与 Spring Cloud 集成所需的核心类库和功能模块,为后续的配置和使用奠定基础。

配置 Seata 的 TM 和 RM

在 application.yml 文件中进行如下配置:

seata:tx-service-group: my_test_tx_group  # 全局事务组名,可根据实际需求自定义transport:type: TCP  # 通信协议类型,常用的还有 UDP 等,这里选择 TCP 协议server: 127.0.0.1:8091  # Seata Server 地址,根据实际部署情况修改thread-pool:core-size: 4  # 线程池核心线程数max-size: 8  # 线程池最大线程数service:vgroup-mapping:my_test_tx_group: default  # 全局事务组的映射,将自定义的事务组名映射到默认值

在上述配置中,tx-service-group 定义了全局事务组名,它是一组事务的逻辑分组,用于区分不同的事务场景;transport 部分配置了通信协议类型和 Seata Server 的地址,以及线程池的相关参数,这些参数会影响 Seata 与其他组件之间的通信性能和效率;service.vgroup-mapping 则将自定义的事务组名映射到一个具体的事务分组,确保事务的正确管理和协调。

启动 Seata 服务

在 Spring Cloud 中启动 Seata 服务,可以通过 Docker 或直接部署 Seata Server 来实现。以 Docker 为例,执行以下命令:

docker run --name seata-server -d -p 8091:8091 seataio/seata-server:latest

该命令将从 Docker Hub 拉取最新版本的 Seata Server 镜像,并在本地容器中启动一个名为 seata-server 的容器实例,将容器内部的 8091 端口映射到主机的 8091 端口,确保 Seata Server 能够正常对外提供服务。


如何注册 Seata 到 Nacos

Seata 还可以与 Nacos 深度集成,将 Nacos 作为配置中心和服务注册中心,进一步提升系统的可配置性和可维护性。以下是将 Seata 注册到 Nacos 的详细配置示例。

配置 Seata 注册到 Nacos:

在 application.yml 文件中添加 Nacos 注册中心的相关配置:

seata:discovery:server: nacos-server:8848  # Nacos 地址,根据实际部署情况修改group: SEATA_GROUP         # 配置分组,可自定义,用于区分不同的配置集合namespace: public          # Nacos命名空间,默认使用 public 命名空间cluster-name: default      # 集群名称,可根据实际情况调整config:type: nacos                 # 配置类型,指定为 nacosnacos:server-addr: nacos-server:8848namespace: publicdata-id: seata-server-configgroup: SEATA_GROUP

在上述配置中,seata.discovery 部分配置了 Seata 与 Nacos 注册中心的连接信息,包括 Nacos 服务器地址、配置分组、命名空间和集群名称等;seata.config 部分则配置了 Seata 从 Nacos 获取配置文件的相关信息,包括配置类型、Nacos 服务器地址、命名空间、数据 ID 和配置分组等。通过这些配置,Seata 能够与 Nacos 进行有效的通信,实现配置的动态加载和服务的注册与发现。

Nacos 配置管理:

将 Seata 的配置文件上传至 Nacos 管理控制台,配置内容示例如下:

seata.tx-service-group=my_test_tx_group
seata.transport.type=TCP
seata.transport.server=127.0.0.1:8091

在 Nacos 管理控制台中,创建一个新的配置文件,将上述配置内容添加进去。其中,seata.tx-service-group 定义了全局事务组名,与 application.yml 中配置的 tx-service-group 保持一致;seata.transport.typeseata.transport.server 分别配置了 Seata 的通信协议类型和服务器地址,确保 Seata 能够正常运行和通信。通过将 Seata 的配置文件集中管理在 Nacos 中,开发人员可以方便地对配置进行修改、更新和版本控制,提高了系统的可维护性和灵活性。


总结

Seata 作为一款高效、易用的分布式事务管理框架,凭借其强大的功能和出色的性能,在微服务架构中展现出了卓越的优势,能够很好地解决分布式系统中的事务难题。通过支持多种事务模式,Seata 为不同业务场景提供了灵活的事务解决方案;其轻量级架构设计,使得系统在引入 Seata 时不会增加过多的复杂性和资源消耗。

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

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

相关文章

spring-springboot -springcloud

目录 spring: 动态代理: spring的生命周期(bean的生命周期): SpringMvc的生命周期: SpringBoot: 自动装配: 自动装配流程: Spring中常用的注解&#xff1a; Spring Boot中常用的注解&#xff1a; SpringCloud: 1. 注册中心: 2. gateway(网关): 3. Ribbon(负载均…

DAY9,递归实现计算 :1 + 1/3 - 1/5 + 1/7 - 1/9 + .... 1/n 的值

题目 用递归实现计算 :1 1/3 - 1/5 1/7 - 1/9 .... 1/n 的值&#xff0c;n通过键盘输入 思路 递进阶段&#xff1a;n、...... 、9、7、5、3、1 函数出口&#xff1a;递进到1 开始返回&#xff1b;函数返回值视为“总和” 回归阶段&#xff1a;对当前n取倒数&#xff1b;“总…

Formality:不可读(unread)的概念

相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482https://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 在Formality中有时会遇到不可读(unread)这个概念&#xff0c;本文就将对此…

【27】Word:徐雅雯-艺术史文章❗

目录 题目​ NO1.2 NO3 NO4 NO5 NO6.7 NO8.9 NO10.11 注意&#xff1a;修改样式的字体颜色/字号&#xff0c;若中英文一致&#xff0c;选择所有脚本。格式相似的文本→检查多选/漏选格式刷F4重复上一步操作请❗每一步检查和保存 题目 NO1.2 F12另存为布局→行号布局…

关于ARM和汇编语言

一图流 ARM 计算机组成 输入设备 输出设备 存储设备 运算器 控制器 处理器读取内存程序执行的过程 取指阶段&#xff1a;控制器器通过地址总线向存储器发送想要获取的指令的地址编号&#xff0c;存储器将指定的指令发送给处理器 译码阶段&#xff1a;控制器对指令进行分…

PyTorch使用教程(9)-使用profiler进行模型性能分析

1、简介 PyTorch Profiler是一个内置的性能分析工具&#xff0c;可以帮助开发者定位计算资源&#xff08;如CPU、GPU&#xff09;的瓶颈&#xff0c;从而更好地优化PyTorch程序。通过捕获和分析GPU的计算、内存和带宽利用情况&#xff0c;能够有效识别并解决性能瓶颈。 2、原…

2025-01-22 Unity Editor 1 —— MenuItem 入门

文章目录 1 Editor 文件夹2 MenuItem3 使用示例3.1 打开网址3.2 打开文件夹3.3 Menu Toggle3.4 Menu 代码复用3.5 MenuItem 激活与失活4 代码示例 1 Editor 文件夹 ​ Editor 文件夹是 Unity 中的特殊文件夹&#xff0c;Unity 中所有编辑器相关的脚本都需要放置在其中&#xf…

docker 安装 mysql 详解

在平常的开发工作中&#xff0c;我们经常需要用到 mysql 数据库。那么在docker容器中&#xff0c;应该怎么安装mysql数据库呢。简单来说&#xff0c;第一步&#xff1a;拉取镜像&#xff1b;第二步&#xff1a;创建挂载目录并设置 my.conf&#xff1b;第三步&#xff1a;启动容…

linux-samba服务配置与应用

1.了解samba的配置文件 2.熟悉samba服务的实例 以前我们在windows上共享文件的话&#xff0c;只需右击要共享的文件夹&#xff0c;然后选择共享相关的选项设置即可&#xff0c;然后如何实现windows和linux的文件共享呢&#xff0c;这就涉及到了samba服务&#xff0c;这个软件…

Spring Boot 整合 Redis 步骤详解

文章目录 1. 引言2. 添加依赖3. 配置 Redis 连接信息4. 创建 Redis 操作服务类5. 使用 RedisTemplate 或 ReactiveRedisTemplate6. 测试 Redis 功能7. 注意事项8. 总结 Redis 是一个高性能的键值存储系统&#xff0c;常用于缓存、消息队列等多种场景。将 Redis 与 Spring Boot …

缓存商品、购物车(day07)

缓存菜品 问题说明 问题说明&#xff1a;用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大。 结果&#xff1a; 系统响应慢、用户体验差 实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询…

K8S中Service详解(三)

HeadLiness类型的Service 在某些场景中&#xff0c;开发人员可能不想使用Service提供的负载均衡功能&#xff0c;而希望自己来控制负载均衡策略&#xff0c;针对这种情况&#xff0c;kubernetes提供了HeadLiness Service&#xff0c;这类Service不会分配Cluster IP&#xff0c;…

npm install 报错:Command failed: git checkout 2.2.0-c

[TOC](npm install 报错&#xff1a;Command failed: git checkout 2.2.0-c) npm install 报错&#xff1a;Command failed: git checkout 2.2.0-c export NODE_HOME/usr/local/node-v14.14.0-linux-x64 npm config set registry https://registry.npmmirror.com 使用如上环…

DDD - 微服务落地的技术实践

文章目录 Pre概述如何发挥微服务的优势怎样提供微服务接口原则微服务的拆分与防腐层的设计 去中心化的数据管理数据关联查询的难题Case 1Case 2Case 3 总结 Pre DDD - 软件退化原因及案例分析 DDD - 如何运用 DDD 进行软件设计 DDD - 如何运用 DDD 进行数据库设计 DDD - 服…

通过视觉语言模型蒸馏进行 3D 形状零件分割

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01;对应英文要求比较高&#xff0c;特此说明&#xff01; Abstract This paper proposes a cross-modal distillation framework, PartDistill, which transfers 2D knowledge from vision-language models …

【大模型】ChatGPT 高效处理图片技巧使用详解

目录 一、前言 二、ChatGPT 4 图片处理介绍 2.1 ChatGPT 4 图片处理概述 2.1.1 图像识别与分类 2.1.2 图像搜索 2.1.3 图像生成 2.1.4 多模态理解 2.1.5 细粒度图像识别 2.1.6 生成式图像任务处理 2.1.7 图像与文本互动 2.2 ChatGPT 4 图片处理应用场景 三、文生图操…

从零到一:Spring Boot 与 RocketMQ 的完美集成指南

1.Rocket的概念与原理 RocketMQ 是一款由阿里巴巴开源的分布式消息中间件&#xff0c;最初用于支持阿里巴巴的海量业务。它基于发布-订阅模型&#xff0c;具备高吞吐、低延迟、高可用和强一致性的特点&#xff0c;适用于消息队列、大规模数据流处理等场景。以下是对 RocketMQ …

(1)STM32 USB设备开发-基础知识

开篇感谢&#xff1a; 【经验分享】STM32 USB相关知识扫盲 - STM32团队 ST意法半导体中文论坛 单片机学习记录_桃成蹊2.0的博客-CSDN博客 USB_不吃鱼的猫丿的博客-CSDN博客 1、USB鼠标_哔哩哔哩_bilibili usb_冰糖葫的博客-CSDN博客 USB_lqonlylove的博客-CSDN博客 USB …

没有公网IP实现seafile本地IP访问和虚拟局域网IP同时访问和上传文件

前言 Ubuntu 24.04 LTSDocker 安装 seafileOpenWrtTailscale Ubuntu 24.04 LTS 通过 docker desktop 安装 seafile 搭建个人网盘中&#xff0c;已经实现了本地局域网放问Ubuntu IP来访问Seafile&#xff0c;以及通过 Ubuntu 的 Tailscale IP 访问Seafile。但是&#xff0c;文…

【Uniapp-Vue3】setTabBar设置TabBar和下拉刷新API

一、setTabBar设置 uni.setTabBarItem({ index:"需要修改第几个", text:"修改后的文字内容" }) 二、tabBar的隐藏和显式 // 隐藏tabBar uni.hideTabBar(); // 显示tabBar uni.showTabBar(); 三、为tabBar右上角添加文本 uni.setTabBarBadge({ index:"…