微服务分布式事务

1、分布式事务是什么?

微服务架构中的分布式事务是指在多个服务实例之间保持数据一致性的机制。由于微服务通常涉及将业务逻辑拆分成独立的服务,每个服务可能有自己的数据库,因此当一个业务操作需要跨多个服务进行时,确保所有服务的数据保持一致性就变得复杂。在单体应用中,数据库事务可以很容易地通过本地事务(如ACID事务)来管理,但在微服务架构中,每个服务可能使用不同的数据库,这就要求一种不同的事务管理策略。

2、分布式事务涉及哪些技术

一般会使用开源的框架来解决分布式事务问题。在众多的开源分布式事务框架中,功能最完善、使用最多的就是阿里巴巴在2019年开源的Seata了

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

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

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

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

3、为什么要引入分布式事务?

引入分布式事务是为了解决在分布式系统中保持数据一致性的问题。在微服务架构或任何分布式系统中,服务可能分布在不同的服务器、容器或甚至是不同的地理位置。每个服务可能有自己的数据库实例。当业务操作需要跨多个服务和数据库进行时,传统的本地事务(如ACID事务)就不再适用,因此需要分布式事务来确保所有相关服务的数据保持一致性

4、分布式事务能解决什么问题?

跨服务数据一致性

在微服务架构中,一个业务操作可能涉及多个服务,每个服务可能管理不同的数据库。分布式事务确保这些操作要么全部成功,要么全部失败,以保持数据一致性。

数据完整性

分布式事务确保在分布式系统中执行的操作满足ACID原则(原子性、一致性、隔离性、持性)。

高并发和可扩展性

在高并发场景下,分布式事务可以协调不同服务的数据库操作,以避免数据冲突和不一致

故障恢复

当系统中的部分服务或组件失败时,分布式事务可以提供一种机制来回滚已经执行的操作,从而防止数据损坏

5、分布式事务的实现步骤

5.1、准备好seata的存储方式

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

5.2、 拉取镜像并创建容器

镜像命令:docker pull seataio/seata-server:1.5.2

创建容器:

复制代码
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 hm-net \
-d \
seataio/seata-server:1.5.2
要与项目和数据库在同一个Network

5.3、微服务集成Seata

添加依赖(每个模块都要引入)

<!--seata-->
  <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
  </dependency>

5.4、在nacos上添加共享配置

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

在bootstart添加读取各项配置文件的配置项

  • dataId: shared-seata.yaml # 共享seata配置

5.5、创建日志表

在每个服务模块对应的数据库创建日志表,用来存放Seata所产生的数据

5.6、开启事务并测试

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

相关推荐
qmx_0724 分钟前
HTB-Jerry(tomcat war文件、msfvenom)
java·web安全·网络安全·tomcat
为风而战32 分钟前
IIS+Ngnix+Tomcat 部署网站 用IIS实现反向代理
java·tomcat
技术无疆2 小时前
快速开发与维护:探索 AndroidAnnotations
android·java·android studio·android-studio·androidx·代码注入
Karoku0665 小时前
【网站架构部署与优化】web服务与http协议
linux·运维·服务器·数据库·http·架构
懒洋洋的华3695 小时前
消息队列-Kafka(概念篇)
分布式·中间件·kafka
March€5 小时前
分布式事务的基本实现
分布式
架构文摘JGWZ5 小时前
Java 23 的12 个新特性!!
java·开发语言·学习
拾光师6 小时前
spring获取当前request
java·后端·spring
aPurpleBerry6 小时前
neo4j安装启动教程+对应的jdk配置
java·neo4j
我是苏苏6 小时前
Web开发:ABP框架2——入门级别的增删改查Demo
java·开发语言