返回
对 Seata-AT 项目搭建中遇到的坑和模块进行分析
后端
2024-01-05 19:29:39
前言
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. 配置数据库
创建两个数据库,分别命名为 account
和 order
,并在其中创建相应的表:
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 项目的搭建过程和遇到的坑,并对该框架的模块进行了分析。希望本文能够对读者有所帮助。