返回

Docker-Compose + Seata 集成 Nacos + PostgreSQL 实现分布式事务

后端

在 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

  1. 解压 Seata 安装包,并将其复制到一个合适的目录。
  2. 在 Seata 目录下,运行以下命令启动 Seata 服务:
sh bin/seata-server.sh

2. 安装 Nacos

  1. 解压 Nacos 安装包,并将其复制到一个合适的目录。
  2. 在 Nacos 目录下,运行以下命令启动 Nacos 服务:
sh startup.sh

3. 安装 PostgreSQL

  1. 解压 PostgreSQL 安装包,并将其复制到一个合适的目录。
  2. 在 PostgreSQL 目录下,运行以下命令初始化数据库:
initdb -D data
  1. 运行以下命令启动 PostgreSQL 服务:
pg_ctl start -D data

4. 配置 Seata

  1. 打开 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
  1. 其中,cluster.server.name 是 Seata 服务的地址和端口,undo.log.disk.path 是 Seata 事务日志的存储路径。

5. 配置 Nacos

  1. 打开 Nacos 目录下的 conf/application.properties 文件,并进行如下配置:
server.port=8848
nacos.standalone=true
  1. 其中,server.port 是 Nacos 服务的端口。

6. 配置 PostgreSQL

  1. 打开 PostgreSQL 目录下的 data/postgresql.conf 文件,并进行如下配置:
max_connections = 100
shared_buffers = 128MB
effective_cache_size = 128MB
work_mem = 8MB
maintenance_work_mem = 16MB
  1. 其中,max_connections 是 PostgreSQL 的最大连接数,shared_buffers 是 PostgreSQL 的共享缓冲区大小,effective_cache_size 是 PostgreSQL 的有效缓存大小,work_mem 是 PostgreSQL 的工作内存大小,maintenance_work_mem 是 PostgreSQL 的维护工作内存大小。

7. 启动 Docker-Compose

  1. 创建名为 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
  1. 其中,seata-server 是 Seata 服务的镜像名称,nacos-server 是 Nacos 服务的镜像名称,postgresql 是 PostgreSQL 的镜像名称,POSTGRES_PASSWORD 是 PostgreSQL 的密码。

  2. 运行以下命令启动 Docker-Compose:

docker-compose up -d

测试分布式事务

1. 创建微服务

  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 "转账成功";
    }
}
  1. 创建名为 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. 部署微服务

  1. account-service 微服务打包成镜像,并推送到 Docker 仓库。
  2. 在 Docker-Compose 中添加以下配置:
services:
  account-service:
    image: your-account-service-image
    ports:
      - 8080:8080
  1. 运行以下命令重新启动 Docker-Compose:
docker-compose up -d

3. 测试分布式事务

  1. 在浏览器中输入 http://localhost:8080/transfer,即可触发分布式事务。
  2. 如果转账成功,则控制台会输出以下信息:
转账开始,XID: XID_xxxx
转账结束,XID: XID_xxxx
  1. 如果转账失败,则控制台会输出以下信息:
转账开始,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 请求触发分布式事务,并观察控制台输出,以了解事务是否成功或失败。