微服务分布式事务

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

相关推荐
zww89491114 小时前
匿名树洞系统开发实战:从需求分析到部署指南
java·eclipse
黑马程序员毕设6 小时前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设
头茬韭菜6 小时前
第 01 篇:「架构鸟瞰与进程启动链路」—— JobManager / TaskManager 从零长出来的完整调用链
架构·flink
CaseyWei6 小时前
Harness 架构 Multi‑Agent(多智能体)完整深度解析
人工智能·ai·架构·harness
木井巳6 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法
白山编程大哥6 小时前
Java 集合算法:从排序、查找到底层原理的实战指南
java·python·算法
梦Arrebol6 小时前
Kubernetes 微服务
微服务·容器·kubernetes
爱浦路 IPLOOK6 小时前
矿山无人化作业5G专网方案:企业专网核心网络选型分析
网络·分布式·科技·5g·信息与通信
devpotato6 小时前
缓存与数据库更新顺序不一致问题
java·数据库·redis
xcl09256 小时前
酒馆预约系统开发实战:从需求分析到上线全流程指南
java·spring boot·需求分析