黑马商城 Spring Cloud 微服务课程笔记 - 分布式事务 Seata(DAY2 - 10)

目录

黑马商城 Spring Cloud 微服务课程笔记 - 分布式事务 Seata(DAY2 - 10)

一、课程内容概述

二、原理

三、知识点和步骤

(一)知识点

(二)步骤


一、课程内容概述

在黑马商城的 Spring Cloud 微服务架构中,DAY2 - 10 主要聚焦于分布式事务的解决方案 ——Seata。当微服务之间进行协作时,例如在一个业务流程涉及多个微服务的操作时,如何保证这些操作要么全部成功,要么全部失败,以确保数据的一致性,这就是分布式事务要解决的问题。Seata 提供了一种有效的方式来管理分布式事务,课程中详细介绍了其相关概念、使用场景、配置和操作步骤等内容。

二、原理

Seata 的原理基于其对分布式事务的处理模型,它采用了两阶段提交(2PC)协议的思想并进行了优化。在第一阶段,Seata 会对各个微服务的事务操作进行预处理,记录相关的事务信息,如 undo_log(用于事务回滚的数据记录)等。然后在第二阶段,根据各个微服务在第一阶段的执行结果,决定是提交事务(所有微服务都成功预处理)还是回滚事务(有微服务预处理失败)。通过这种方式,Seata 能够协调多个微服务的事务,保证全局数据的一致性。

三、知识点和步骤

(一)知识点

  1. 分布式事务概念:理解在微服务架构下,由于服务的分布式部署,一个业务操作可能涉及多个微服务的数据库操作,而这些操作需要作为一个整体事务来保证数据一致性。
  2. Seata 的角色与架构:了解 Seata 中的 TC(Transaction Coordinator,事务协调器)、TM(Transaction Manager,事务管理器)和 RM(Resource Manager,资源管理器)等角色及其职责,以及它们之间如何协同工作来实现分布式事务管理。

(二)步骤

  1. 环境准备与安装
    • 首先需要下载并安装 Seata 服务器。可以从 Seata 的官方网站获取适合的版本进行安装。安装完成后,启动 Seata 服务器,确保其正常运行。
  2. 微服务集成 Seata
    • 在项目的 pom.xml 文件中添加 Seata 相关依赖,例如:


    com.alibaba.cloud
    spring-cloud-starter-alibaba-seata

  • 在微服务的配置文件(如 application.yml)中配置 Seata 相关参数,包括 Seata 服务器的地址、事务分组等信息。示例如下:

seata:
  enabled: true
  application-id: your-application-id
  tx-service-group: your-tx-group
  registry:
    type: nacos
    nacos:
      server-addr: nacos-server-address
      namespace: your-nacos-namespace
      group: SEATA_GROUP
      application: seata-server-application-name
      username: your-nacos-username
      password: your-nacos-password
      cluster: default
  config:
    type: nacos
    nacos:
      server-addr: nacos-server-address
      namespace: your-nacos-namespace
      group: SEATA_GROUP
      username: your-nacos-username
      password: your-nacos-password
      data-id: seataServer.properties

  • 在微服务的启动类上添加@EnableAutoDataSourceAutoConfiguration注解,开启数据源自动配置。

  1. 业务代码编写与事务注解使用
    • 在需要进行分布式事务管理的业务方法上添加@GlobalTransactional注解。例如,在一个涉及多个微服务操作的订单创建业务方法中:

import io.seata.spring.annotation.GlobalTransactional;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class OrderService {

    @GlobalTransactional
    @Transactional
    public void createOrder(Order order) {
        // 调用库存微服务扣减库存
        inventoryService.decreaseStock(order.getProductId(), order.getQuantity());
        // 调用用户微服务扣除用户余额
        userService.decreaseBalance(order.getUserId(), order.getTotalPrice());
        // 本地操作,保存订单信息到订单数据库
        orderRepository.save(order);
    }
}

  • 在上述代码中,createOrder方法涉及到库存微服务、用户微服务和本地订单数据库的操作,通过@GlobalTransactional注解将这些操作纳入到分布式事务管理中。如果其中任何一个操作失败,Seata 将自动回滚整个事务,保证数据的一致性。

  1. 数据库表设计(undo_log 表)
    • Seata 需要在每个参与分布式事务的微服务数据库中创建 undo_log 表,用于存储事务回滚所需的信息。undo_log 表的结构如下:

CREATE TABLE `undo_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `branch_id` bigint(20) NOT NULL,
  `xid` varchar(100) NOT NULL,
  `context` varchar(128) NOT NULL,
  `rollback_info` longblob NOT NULL,
  `log_status` int(11) NOT NULL,
  `log_created` datetime NOT NULL,
  `log_modified` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

通过以上步骤,就可以在黑马商城的 Spring Cloud 微服务项目中集成 Seata,实现分布式事务管理,确保在复杂的微服务协作场景下数据的一致性和完整性。在实际应用中,需要根据具体的业务需求和架构特点进行适当的调整和优化。

你可能感兴趣的:(java,spring,cloud,微服务,笔记)