微服务保护和分布式事务(4)

米饭21小时前行业资讯8

二、分布式事务

首先我们看看项目中的下单业务整体流程(主要理解思路):

image-20241121193532500

由于订单、购物车、商品分别在三个不同的微服务,而每个微服务都有自己独立的数据库,因此下单过程中就会跨多个数据库完成业务。而每个微服务都会执行自己的本地事务:


交易服务:下单事务。

购物车服务:清理购物车事务。

库存服务:扣减库存事务。

整个业务中,各个本地事务是有关联的。因此每个微服务的本地事务,也可以称为分支事务。多个有关联的分支事务一起就组成了全局事务。我们必须保证整个全局事务同时成功或失败。


我们知道每一个分支事务就是传统的单体事务,都可以满足 ACID 特性,但全局事务跨越多个服务、多个数据库,不遵守 ACID 原则,归其原因就是参与事务的多个子业务在不同的微服务,跨越了不同的数据库。虽然每个单独的业务都能在本地遵循ACID,但是它们互相之间没有感知,不知道有人失败了,无法保证最终结果的统一,也就无法遵循ACID的事务特性了。


这就是分布式事务问题,出现以下情况之一就可能产生分布式事务问题:


业务跨多个服务实现

业务跨多个数据源实现

下面我们来学习一下如何解决分布式事务。


2.1 认识 Seata:

解决分布式事务的方案有很多,但实现起来都比较复杂,因此我们一般会使用开源的框架来解决分布式事务问题。在众多的开源分布式事务框架中,功能最完善、使用最多的就是阿里巴巴在 2019 年开源的 Seata 了。


其实分布式事务产生的一个重要原因,就是参与事务的多个分支事务互相无感知,不知道彼此的执行状态。因此解决分布式事务的思想非常简单:


就是找一个统一的事务协调者,与多个分支事务通信,检测每个分支事务的执行状态,保证全局事务下的每一个分支事务同时成功或失败即可。大多数的分布式事务框架都是基于这个理论来实现的。


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


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

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

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

Seata 的工作架构如图所示:

image-20241121194609919

其中,TM和RM可以理解为Seata的客户端部分,引入到参与事务的微服务依赖中即可。将来TM和RM就会协助微服务,实现本地分支事务与TC之间交互,实现事务的提交或回滚。


而TC服务则是事务协调中心,是一个独立的微服务,需要单独部署。


部署 TC 服务:


由于博客不好携带文件,所以如何部署 TC 服务,就需要友友自己去网上找找了。


2.2 微服务集成 Seata:

参与分布式事务的每一个微服务都需要集成 Seata,我们以trade-service为例。


2.2.1 引入依赖:

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

2.2.2 配置:

seata:
  registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址
    type: nacos # 注册中心类型 nacos
    nacos:
      server-addr: 192.168.242.128: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"
  data-source-proxy-mode: AT # 选择分布式事务模式

2.2.3 添加数据库表:

这里需要在原来的数据库添加一张表:

-- for AT mode you must to init this sql for you business database. the seata server not need it.
CREATE TABLE IF NOT EXISTS `undo_log`
(
    `branch_id`     BIGINT       NOT NULL COMMENT 'branch transaction id',
    `xid`           VARCHAR(128) NOT NULL COMMENT 'global transaction id',
    `context`       VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization',
    `rollback_info` LONGBLOB     NOT NULL COMMENT 'rollback info',
    `log_status`    INT(11)      NOT NULL COMMENT '0:normal status,1:defense status',
    `log_created`   DATETIME(6)  NOT NULL COMMENT 'create datetime',
    `log_modified`  DATETIME(6)  NOT NULL COMMENT 'modify datetime',
    UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
) ENGINE = InnoDB
  AUTO_INCREMENT = 1
  DEFAULT CHARSET = utf8mb4 COMMENT ='AT transaction mode undo table';


本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!  

云掣基于多年在运维领域的丰富时间经验,编写了《云运维服务白皮书》,欢迎大家互相交流学习:

《云运维服务白皮书》下载地址:https://fs80.cn/v2kbbq

想了解更多大数据运维托管服务、数据库运维托管服务、应用系统运维托管服务的的客户,欢迎点击云掣官网沟通咨询:https://yunche.pro/?t=shequ


相关文章

MyBatisPlus从零到一:快速入门与核心功能详解(6)

MyBatisPlus从零到一:快速入门与核心功能详解(6)

四、分页插件MybatisPlus 提供了很多的插件功能,进一步拓展其功能。目前已有的插件有:PaginationInnerInterceptor:自动分页TenantLineInnerInterce...

Spring AMQP与RabbitMQ深度整合指南:从基础到高级应用(1)

Spring AMQP与RabbitMQ深度整合指南:从基础到高级应用(1)

一、初识 MQ1.1 同步调用:我们观察下,下面这个余额支付功能的流程图:如果我们采用的是基于 OpenFeign 的同步调用,也就是说业务执行流程是这样的:支付服务需要先调用用户服务完成余额扣减。然...

Docker-OSX安装与配置完全指南:在Docker中运行接近原生的macOS环境

Docker-OSX安装与配置完全指南:在Docker中运行接近原生的macOS环境

Docker-OSX安装与配置完全指南:在Docker中运行接近原生的macOS环境Docker-OSXsickcodes/Docker-OSX: Docker-OSX 项目尝试通过 Docker 容...

Spring AOP 实战指南:从入门到精通(5)

Spring AOP 实战指南:从入门到精通(5)

四、代理模式Spring AOP 是基于动态代理来实现 AOP 的。代理模式,也叫委托模式。定义:为其他对象提供一种代理,以控制对这个对象的访问。它的作用就是通过提供一个代理类,让我们在调用目标方法的...

【Docker 】深入探索 Docker :容器健康检查与安全扫描

【Docker 】深入探索 Docker :容器健康检查与安全扫描

在现代容器化应用的开发与部署过程中,确保服务的可用性和安全性至关重要。本文将探讨容器的健康检查和安全扫描,并分享最佳实践。一、容器健康检查1.1 健康检查的作用健康检查是确保服务在运行时处于可用状态的...

CMP?MSP?1+1才能大于2

CMP?MSP?1+1才能大于2

CMP与MSP都已经出现有一段时间了,而业界对于两个名词略有混淆,CMP和MSP到底是什么,能做什么,互相边界是什么,是互补还是互相竞争傻傻分不清楚。笔者试从自己十多年的云计算实践以及对于Gartne...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。