Bootstrap

微服务分布式事务

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

;