返回

对 Seata-AT 项目搭建中遇到的坑和模块进行分析

后端

前言

Seata-AT 是一个分布式事务解决方案,它采用 AT 模式来实现事务管理。AT 模式是一种二阶段提交协议,它将事务的执行过程分为两个阶段:准备阶段和提交阶段。在准备阶段,每个参与者(数据库或服务)都将自己的本地事务准备就绪,并等待协调者的指令。在提交阶段,协调者向所有参与者发送提交或回滚的指令,参与者根据指令执行相应的操作。

Seata-AT 项目搭建

1. 准备工作

在搭建 Seata-AT 项目之前,需要先准备以下环境:

  • Java 8+
  • Maven 3+
  • MySQL 5.7+
  • Seata 1.4.2+
  • Spring Boot 2.3.4+

2. 创建项目

创建一个新的 Maven 项目,并添加以下依赖:

<dependency>
    <groupId>io.seata</groupId>
    <artifactId>seata-spring-boot-starter</artifactId>
    <version>1.4.2</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

3. 配置数据库

创建两个数据库,分别命名为 accountorder,并在其中创建相应的表:

CREATE TABLE account (
    id INT NOT NULL AUTO_INCREMENT,
    user_id VARCHAR(32) NOT NULL,
    balance DECIMAL(10, 2) NOT NULL,
    PRIMARY KEY (id)
);

CREATE TABLE orders (
    id INT NOT NULL AUTO_INCREMENT,
    user_id VARCHAR(32) NOT NULL,
    product_id VARCHAR(32) NOT NULL,
    quantity INT NOT NULL,
    amount DECIMAL(10, 2) NOT NULL,
    PRIMARY KEY (id)
);

4. 配置 Seata

application.yml 文件中配置 Seata:

seata:
  enabled: true
  application-id: seata-at-demo
  tx-service-group: my_test_tx_group
  registry:
    type: nacos
    nacos:
      server-addr: 127.0.0.1:8848
      namespace: public

5. 开发业务代码

在项目中创建两个 Controller,分别用于处理转账和下单操作:

@RestController
@RequestMapping("/account")
public class AccountController {

    @Autowired
    private AccountService accountService;

    @PostMapping("/transfer")
    public String transfer(@RequestParam String fromUserId, @RequestParam String toUserId, @RequestParam BigDecimal amount) {
        accountService.transfer(fromUserId, toUserId, amount);
        return "转账成功";
    }
}

@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private OrderService orderService;

    @PostMapping("/create")
    public String create(@RequestParam String userId, @RequestParam String productId, @RequestParam Integer quantity) {
        orderService.create(userId, productId, quantity);
        return "下单成功";
    }
}

在项目中创建两个 Service,分别用于处理转账和下单业务:

@Service
public class AccountService {

    @Autowired
    private AccountMapper accountMapper;

    public void transfer(String fromUserId, String toUserId, BigDecimal amount) {
        Account fromAccount = accountMapper.selectByUserId(fromUserId);
        Account toAccount = accountMapper.selectByUserId(toUserId);

        fromAccount.setBalance(fromAccount.getBalance().subtract(amount));
        toAccount.setBalance(toAccount.getBalance().add(amount));

        accountMapper.updateByUserId(fromAccount);
        accountMapper.updateByUserId(toAccount);
    }
}

@Service
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;

    public void create(String userId, String productId, Integer quantity) {
        Order order = new Order();
        order.setUserId(userId);
        order.setProductId(productId);
        order.setQuantity(quantity);
        order.setAmount(BigDecimal.valueOf(quantity * 10));

        orderMapper.insert(order);
    }
}

6. 启动项目

运行 mvn spring-boot:run 启动项目,即可在浏览器中访问 /account/transfer/order/create 接口来进行转账和下单操作。

Seata-AT 项目模块分析

Seata-AT 项目主要由以下几个模块组成:

  • Core Module :核心模块,提供了分布式事务的核心功能,包括事务管理器、事务协调器、事务参与者等组件。
  • Server Module :服务器模块,提供了分布式事务的服务端实现,包括事务协调器、事务参与者等组件。
  • Client Module :客户端模块,提供了分布式事务的客户端实现,包括事务管理器、事务参与者等组件。
  • Spring Boot Starter Module :Spring Boot Starter 模块,提供了 Seata 与 Spring Boot 的集成支持。

总结

Seata-AT 是一个功能强大且易于使用的分布式事务解决方案,它可以帮助我们轻松实现分布式事务的管理。在本文中,我们介绍了 Seata-AT 项目的搭建过程和遇到的坑,并对该框架的模块进行了分析。希望本文能够对读者有所帮助。