Docker-Compose + Seata 集成 Nacos + PostgreSQL 实现分布式事务
2022-12-11 08:27:24
在 Docker-Compose 中使用 Seata、Nacos 和 PostgreSQL 构建分布式事务环境
引言
微服务架构的兴起带来了许多好处,但也带来了新的挑战,其中之一就是分布式事务。当多个微服务同时操作同一份数据时,必须确保这些操作要么全部成功,要么全部失败,以维护数据的一致性。
本文将介绍如何使用 Seata、Nacos 和 PostgreSQL 在 Docker-Compose 中构建一个分布式事务环境。
什么是 Seata?
Seata 是一个开源的分布式事务框架,它提供了多种分布式事务解决方案,包括 XA、TCC 和 Saga。它可以帮助您轻松地管理和协调微服务之间的分布式事务。
什么是 Nacos?
Nacos 是一个开源的服务发现、配置管理和动态 DNS 服务。它可以帮助您轻松地管理微服务之间的通信和配置。
什么是 PostgreSQL?
PostgreSQL 是一个开源的对象关系型数据库管理系统。它提供了强大的事务支持和高性能。
准备工作
在开始之前,您需要确保已经安装了 Docker 和 Docker-Compose。您还可以下载 Seata、Nacos 和 PostgreSQL 的安装包。
搭建环境
1. 安装 Seata
- 解压 Seata 安装包,并将其复制到一个合适的目录。
- 在 Seata 目录下,运行以下命令启动 Seata 服务:
sh bin/seata-server.sh
2. 安装 Nacos
- 解压 Nacos 安装包,并将其复制到一个合适的目录。
- 在 Nacos 目录下,运行以下命令启动 Nacos 服务:
sh startup.sh
3. 安装 PostgreSQL
- 解压 PostgreSQL 安装包,并将其复制到一个合适的目录。
- 在 PostgreSQL 目录下,运行以下命令初始化数据库:
initdb -D data
- 运行以下命令启动 PostgreSQL 服务:
pg_ctl start -D data
4. 配置 Seata
- 打开 Seata 目录下的 config/seata.conf 文件,并进行如下配置:
service.vgroupMapping.default=default
service.default.switch=on
txManager.mode=seata
config.type=nacos
registry.type=nacos
transport.type=rest
store.mode=file
cluster.server.name=127.0.0.1:8091
undo.log.disk.path=/data/undo_log
undo.log.fileReserveTime=1
- 其中,
cluster.server.name
是 Seata 服务的地址和端口,undo.log.disk.path
是 Seata 事务日志的存储路径。
5. 配置 Nacos
- 打开 Nacos 目录下的 conf/application.properties 文件,并进行如下配置:
server.port=8848
nacos.standalone=true
- 其中,
server.port
是 Nacos 服务的端口。
6. 配置 PostgreSQL
- 打开 PostgreSQL 目录下的 data/postgresql.conf 文件,并进行如下配置:
max_connections = 100
shared_buffers = 128MB
effective_cache_size = 128MB
work_mem = 8MB
maintenance_work_mem = 16MB
- 其中,
max_connections
是 PostgreSQL 的最大连接数,shared_buffers
是 PostgreSQL 的共享缓冲区大小,effective_cache_size
是 PostgreSQL 的有效缓存大小,work_mem
是 PostgreSQL 的工作内存大小,maintenance_work_mem
是 PostgreSQL 的维护工作内存大小。
7. 启动 Docker-Compose
- 创建名为
docker-compose.yml
的文件,并进行如下配置:
version: '3.7'
services:
seata-server:
image: seataio/seata-server:1.4.2
ports:
- 8091:8091
nacos-server:
image: nacos/nacos-server:2.0.1
ports:
- 8848:8848
postgresql:
image: postgres:14.2
ports:
- 5432:5432
environment:
POSTGRES_PASSWORD: mypassword
-
其中,
seata-server
是 Seata 服务的镜像名称,nacos-server
是 Nacos 服务的镜像名称,postgresql
是 PostgreSQL 的镜像名称,POSTGRES_PASSWORD
是 PostgreSQL 的密码。 -
运行以下命令启动 Docker-Compose:
docker-compose up -d
测试分布式事务
1. 创建微服务
- 创建名为
account-service
的微服务,并在其中添加以下代码:
import io.seata.spring.annotation.GlobalTransactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class AccountController {
@Autowired
private AccountService accountService;
@GetMapping("/transfer")
@GlobalTransactional
public String transfer() {
accountService.transfer();
return "转账成功";
}
}
- 创建名为
account-service
的服务实现类,并在其中添加以下代码:
import io.seata.core.context.RootContext;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class AccountService {
@Transactional
public void transfer() {
System.out.println("转账开始,XID: " + RootContext.getXID());
// 从账户 A 扣款
accountAMapper.decreaseAmount(10);
// 给账户 B 加款
accountBMapper.increaseAmount(10);
System.out.println("转账结束,XID: " + RootContext.getXID());
}
}
2. 部署微服务
- 将
account-service
微服务打包成镜像,并推送到 Docker 仓库。 - 在 Docker-Compose 中添加以下配置:
services:
account-service:
image: your-account-service-image
ports:
- 8080:8080
- 运行以下命令重新启动 Docker-Compose:
docker-compose up -d
3. 测试分布式事务
- 在浏览器中输入
http://localhost:8080/transfer
,即可触发分布式事务。 - 如果转账成功,则控制台会输出以下信息:
转账开始,XID: XID_xxxx
转账结束,XID: XID_xxxx
- 如果转账失败,则控制台会输出以下信息:
转账开始,XID: XID_xxxx
转账失败,XID: XID_xxxx
结论
本文介绍了如何在 Docker-Compose 中使用 Seata、Nacos 和 PostgreSQL 构建一个分布式事务环境。通过这个环境,您可以轻松地管理和协调微服务之间的分布式事务,以确保数据的一致性和完整性。
常见问题解答
1. 什么是分布式事务?
分布式事务是跨越多个独立数据库或系统的数据操作序列,要么全部成功,要么全部失败。
2. Seata 的作用是什么?
Seata 是一个分布式事务框架,它提供了协调和管理分布式事务所需的功能。
3. Nacos 的作用是什么?
Nacos 是一个服务发现、配置管理和动态 DNS 服务,它可以帮助您管理微服务之间的通信和配置。
4. PostgreSQL 的作用是什么?
PostgreSQL 是一个强大的对象关系型数据库管理系统,它提供了事务支持和高性能。
5. 如何测试分布式事务?
您可以创建一个简单的微服务,并使用 Seata 管理分布式事务。然后,您可以通过 HTTP 请求触发分布式事务,并观察控制台输出,以了解事务是否成功或失败。