微服务分布式事务

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就会基于这个方法判断全局事务范围,初始化全局事务

相关推荐
皮皮林5515 小时前
Java性能调优黑科技!1行代码实现毫秒级耗时追踪,效率飙升300%!
java
冰_河5 小时前
QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!
java·后端·性能优化
桦说编程8 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
躺平大鹅10 小时前
Java面向对象入门(类与对象,新手秒懂)
java
louiX10 小时前
深入理解 Android BLE GATT 回调机制:从“回调地狱”到高可靠 OTA 架构
架构
初次攀爬者11 小时前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺11 小时前
搞懂@Autowired 与@Resuorce
java·spring boot·后端
aircrushin11 小时前
轻量化大模型架构演进
人工智能·架构
天蓝色的鱼鱼11 小时前
你的项目真的需要SSR吗?还是只是你的简历需要?
前端·架构