Docker 安装单机版的 Seata

前言

本教程将使用 Docker 安装单机版的 Seata Server、Nacos、MySQL,并实现以下配置目标:

  • (1) 配置 Seata Server 使用 Nacos 作为注册中心
  • (2) 配置 Seata Server 使用 Nacos 作为配置中心
  • (3) 配置 Nacos 将配置信息存储(持久化)到 MySQL 中
  • (4) 基于 Nacos 配置中心,配置 Seata Server 使用 MySQL 数据库来存储全局事务会话信息

官方资源

版本说明

中间件版本
Docker24.0.5
Docker Compose2.20.2
MySQL8.4.2
Nacos Server2.4.3
Seata Server(TC)2.2.0

知识回顾

Seata 的三大角色

Seata 分 TC、TM 和 RM 三个角色,TC(Server 端)需要单独作为服务端部署,TM 和 RM(Client 端)由业务系统集成(如 Maven、Gradle)。

  • TC(Transaction Coordinator):事务协调器,维护全局和分支事务的状态,负责协调并驱动全局事务的提交或回滚。
  • TM(Transaction Manager):事务管理器,控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议。
  • RM(Resource Manager):资源管理器,负责管理分支事务上的资源,向 TC 注册分支事务,上报分支事务的状态,接受 TC 的命令来提交或者回滚分支事务。

Seata 的配置文件

特别注意

Seata Server(TC) 从 1.5.0 版本开始,配置文件改为 application.yml(这也是本文使用的配置方式),同时向下兼容旧的 register.conf 和 file.conf 两个配置文件。

Seata Server(TC)有两个核心配置文件,分别是 registry.conf 与 file.conf,它们的作用与配置示例如下:

  • registry.conf 用于指定 Seata Server(TC)的注册中心和获取配置信息的方式,默认获取方式是 file。如果使用了其他注册中心,可以将 Seata Server 自身也注册到注册中心(如 Nacos)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 指定注册中心,支持 nacos、eureka、redis、zk 、consul、etcd3、sofa、seata
registry {
type = "nacos"

nacos {
application = "seata-server"
serverAddr = "127.0.0.1:8848"
group = "seata_demo"
namespace = "ee08c2b7-2b41-4e9d-aeae-aae35a8dbd1d"
cluster = "default"
username = ""
password = ""
}
}

# 指定获取配置信息的方式,支持 file, nacos、consul、apollo、zk、etcd3
config {
type = "file"

file {
name = "file.conf"
}
}
  • file.conf 用于指定 Seata Server(TC)的相关配置。如果使用了配置中心,可以将 file.conf 文件里的配置信息都存储到配置中心(如 Nacos)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
service {
vgroupMapping.default_tx_group = "default"
disableGlobalTransaction = false
}

...(省略)

# 指定存储模式,即用什么来存储 Seata Server(TC)的全局事务会话信息
store {
mode = "db"

db {
dbType = "mysql"
datasource = "druid"
driverClassName = "com.mysql.cj.jdbc.Driver"
url = "jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&useSSL=false"
user = "root"
password = "123456"
minConn = 5
maxConn = 100
globalTable = "global_table"
branchTable = "branch_table"
lockTable = "lock_table"
queryLimit = 100
maxWait = 5000
}
}

总结

  • registry.conf:管理注册中心和配置中心的配置,确保 Seata Server(TC)和 Client 在分布式系统中进行服务发现和配置共享。
  • file.conf:主要用于事务管理和存储配置,确保 Seata Server(TC)能够管理事务并进行持久化存储。
  • Seata Server(TC)的 registry.conf 和 file.conf 文件的配置示例可以参考 GitHub 项目。

Seata 的存储模式

Seata Server(TC)的默认存储模式为 file,若使用 file 模式则无需改动任何配置,直接启动即可,每种模式的说明如下:

  • file 模式为单机模式,全局事务会话信息在内存中读写,并持久化为本地文件 root.data,性能较高。
  • db 模式为高可用模式,全局事务会话信息通过数据库共享,性能会差一点。
  • redis 模式在 Seata Server 1.3 及以上版本开始支持,性能较高,但存在事务信息丢失风险,需要配置适合当前业务场景的 Redis 持久化策略。

准备工作

下载 Seata 项目

Seata 的项目源码

Seata 项目最新的代码可以从 GitHub 仓库 获取,或者从 GitHub Releases 获取指定版本的项目源码(强烈推荐)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# 下载指定版本的 Seata 的项目源码
$ wget https://github.com/apache/incubator-seata/archive/refs/tags/v2.2.0.tar.gz -O incubator-seata-2.2.0.tar.gz

# 解压源码压缩文件
$ tar -xvf incubator-seata-2.2.0.tar.gz

# 重命名源码目录(方便后面直接引用)
$ mv incubator-seata-2.2.0 seata

# 进入源码目录
$ cd seata

# 查看目录结构,后面会使用 script/server/mysql.sql 来初始化 MySQL 数据库
$ tree ./script/
├── client
│   ├── at
│   │   └── db
│   │   ├── dm.sql
│   │   ├── mysql.sql
│   │   ├── oracle.sql
│   │   ├── postgresql.sql
│   │   └── sqlserver.sql
│   ├── conf
│   │   ├── file.conf
│   │   └── registry.conf
│   ├── saga
│   │   └── db
│   │   ├── db2.sql
│   │   ├── h2.sql
│   │   ├── mysql.sql
│   │   ├── oracle.sql
│   │   └── postgresql.sql
│   ├── spring
│   │   ├── application.properties
│   │   └── application.yml
│   └── tcc
│   └── db
│   ├── mysql.sql
│   ├── oracle.sql
│   └── postgresql.sql
├── config-center
│   ├── apollo
│   │   ├── apollo-config-interactive.sh
│   │   └── apollo-config.sh
│   ├── config.txt
│   ├── consul
│   │   ├── consul-config-interactive.sh
│   │   └── consul-config.sh
│   ├── etcd3
│   │   ├── etcd3-config-interactive.sh
│   │   └── etcd3-config.sh
│   ├── nacos
│   │   ├── nacos-config-interactive.py
│   │   ├── nacos-config-interactive.sh
│   │   ├── nacos-config.py
│   │   └── nacos-config.sh
│   ├── README.md
│   └── zk
│   ├── zk-config-interactive.sh
│   └── zk-config.sh
├── logstash
│   └── config
│   ├── logstash-kafka.conf
│   └── logstash-logback.conf
└── server
├── db
│   ├── dm.sql
│   ├── mysql.sql
│   ├── oracle.sql
│   ├── postgresql.sql
│   └── sqlserver.sql
├── docker-compose
│   └── docker-compose.yaml
├── helm
│   └── seata-server
│   ├── Chart.yaml
│   ├── templates
│   │   ├── deployment.yaml
│   │   ├── _helpers.tpl
│   │   ├── NOTES.txt
│   │   ├── service.yaml
│   │   └── tests
│   │   └── test-connection.yaml
│   └── values.yaml
└── kubernetes
└── seata-server.yaml

目录作用说明:

  • client:存放 Client 端 SQL 脚本(包含 undo_log 表),参数配置。
  • server:Server 端的数据库脚本(包含 lock_table、branch_table 与 global_table 表)及各个容器配置。
  • config-center:各个配置中心的参数导入脚本,其中的 config.txt(包含 Server 和 Client,原名是 nacos-config.txt)为通用参数文件。

下载 Nacos 项目

Nacos 的项目源码

Nacos 项目最新的代码可以从 GitHub 仓库 获取,或者从 GitHub Releases 获取指定版本的项目源码(强烈推荐)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 下载指定版本的 Nacos 的项目源码
$ wget https://github.com/alibaba/nacos/archive/refs/tags/2.4.3.tar.gz -O nacos-2.4.3.tar.gz

# 解压源码压缩文件
$ tar -xvf nacos-2.4.3.tar.gz

# 重命名源码目录(方便后面直接引用)
$ mv nacos-2.4.3 nacos

# 进入源码目录
$ cd nacos

# 查看目录结构,后面会使用 mysql-schema.sql 来初始化 MySQL 数据库
$ tree distribution/conf/
├── 1.4.0-ipv6_support-update.sql
├── announcement_en-US.conf
├── announcement_zh-CN.conf
├── application.properties
├── application.properties.example
├── cluster.conf.example
├── console-guide.conf
├── derby-schema.sql
├── mysql-schema.sql
└── nacos-logback.xml

下载 Nacos Docker 项目

Nacos Docker 项目源码

Nacos Docker 项目最新的代码可以从 GitHub 仓库 获取,或者从 GitHub Releases 获取指定版本的项目源码(强烈推荐)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# 下载指定版本的 Nacos Docker 的项目源码
$ wget https://github.com/nacos-group/nacos-docker/archive/refs/tags/v2.4.3.tar.gz -O nacos-docker-2.4.3.tar.gz

# 解压源码压缩文件
$ tar -xvf nacos-docker-2.4.3.tar.gz

# 重命名源码目录(方便后面直接引用)
$ mv nacos-docker-2.4.3 nacos-docker

# 进入源码目录
$ cd nacos-docker

# 查看目录结构,其中包含了 Docker 各种使用示例的配置文件,比如 standalone-mysql-8.yaml
$ tree .
├── build
│   ├── bin
│   │   └── docker-startup.sh
│   ├── conf
│   │   └── application.properties
│   ├── Dockerfile
│   └── Dockerfile.Slim
├── changlog
├── env
│   ├── custom-application-config.env
│   ├── mysql.env
│   ├── nacos-embedded.env
│   ├── nacos-hostname.env
│   ├── nacos-ip.env
│   └── nacos-standlone-mysql.env
├── example
│   ├── cluster-embedded.yaml
│   ├── cluster-hostname.yaml
│   ├── cluster-ip.yaml
│   ├── custom-application-config.yaml
│   ├── image
│   │   └── mysql
│   │   ├── 5.7
│   │   │   └── Dockerfile
│   │   └── 8
│   │   └── Dockerfile
│   ├── init.d
│   │   └── application.properties
│   ├── prometheus
│   │   ├── prometheus-cluster.yaml
│   │   └── prometheus-standalone.yaml
│   ├── standalone-derby.yaml
│   ├── standalone-mysql-5.7.yaml
│   └── standalone-mysql-8.yaml
├── README.md
└── README_ZH.md

Docker 安装 MySQL

创建数据目录

  • 在宿主机内创建数据目录,用于挂载 MySQL 容器内的数据文件
1
sudo mkdir -p /usr/local/mysql/data

创建 YML 配置文件

  • 创建 docker-compose.yml 配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
version: '3.5'

services:
mysql:
image: mysql:8.4.2
container_name: mysql-server
command: ["mysqld", "--mysql-native-password=ON"]
restart: always
ports:
- 3306:3306
environment:
- TZ=Asia/Shanghai
- MYSQL_ROOT_PASSWORD=123456
volumes:
- '/usr/local/mysql/data:/var/lib/mysql'
healthcheck:
test: ["CMD-SHELL", "mysqladmin ping -h localhost"]
interval: 5s
timeout: 10s
retries: 10
networks:
- micro-network

networks:
micro-network:
driver: bridge

创建 MySQL 容器

  • 使用 Docker Compose 创建并启动 MySQL 容器
1
docker compose up -d

为 Nacos 初始化数据库

  • 拷贝数据库初始化脚本到 MySQL 容器内部,这里的初始化脚本可以从 Nacos 项目 中获取得到。特别注意,数据库初始化脚本与 Nacos 的版本必须互相匹配
1
docker cp nacos/distribution/conf/mysql-schema.sql mysql-server:/
  • 登录 MySQL 数据库
1
2
3
4
5
# 连接进 MySQL 容器的内部
docker exec -it mysql-server /bin/bash

# 登录 MySQL 数据库
mysql -h localhost -u root -p
  • 初始化 MySQL 数据库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 创建用户
mysql> CREATE USER 'nacos'@'%' IDENTIFIED WITH mysql_native_password BY 'nacos';

# 创建数据库
mysql> create database nacos_devtest default character set utf8;

# 用户授权访问
mysql> GRANT ALL ON nacos_devtest.* TO 'nacos'@'%';

# 刷新权限
mysql> flush privileges;

# 切换数据库
mysql> use nacos_devtest;

# 执行数据库初始化脚本
mysql> source /mysql-schema.sql;

# 查看数据库表
mysql> show tables;
+------------------------+
| Tables_in_nacos_devtest |
+------------------------+
| config_info |
| config_info_aggr |
| config_info_beta |
| config_info_tag |
| config_tags_relation |
| group_capacity |
| his_config_info |
| permissions |
| roles |
| tenant_capacity |
| tenant_info |
| users |
+------------------------+

为 Seata 初始化数据库

  • 拷贝数据库初始化脚本到 MySQL 容器内部,这里的初始化脚本可以从 Seata 项目 中获取得到。特别注意,初始化脚本与 Seata Server(TC)的版本必须互相匹配
1
docker cp incubator-seata/script/server/db/mysql.sql mysql-server:/
  • 登录 MySQL 数据库
1
2
3
4
5
# 连接进 MySQL 容器的内部
docker exec -it mysql-server /bin/bash

# 登录 MySQL 数据库
mysql -h localhost -u root -p
  • 初始化 MySQL 数据库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 创建用户
mysql> CREATE USER 'seata'@'%' IDENTIFIED WITH mysql_native_password BY 'seata';

# 创建数据库
mysql> create database seata default character set utf8;

# 用户授权访问
mysql> GRANT ALL ON seata.* TO 'seata'@'%';

# 刷新权限
mysql> flush privileges;

# 切换数据库
mysql> use seata;

# 执行数据库初始化脚本
mysql> source /mysql.sql;

# 查看数据库表
mysql> show tables;
+------------------+
| Tables_in_seata |
+------------------+
| branch_table |
| distributed_lock |
| global_table |
| lock_table |
| vgroup_table |
+------------------+

Docker 安装 Nacos

创建日志目录

  • 在宿主机内创建日志目录,用于挂载 Nacos 容器内的日志文件
1
sudo mkdir -p /var/log/nacos/logs

编辑 YML 配置文件

在上面 docker-compose.yml 配置文件的基础上,添加 Nacos 的配置信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
version: '3.5'

services:
mysql:
image: mysql:8.4.2
container_name: mysql-server
command: ["mysqld", "--mysql-native-password=ON"]
restart: always
ports:
- 3306:3306
environment:
- TZ=Asia/Shanghai
- MYSQL_ROOT_PASSWORD=123456
volumes:
- '/usr/local/mysql/data:/var/lib/mysql'
healthcheck:
test: ["CMD-SHELL", "mysqladmin ping -h localhost"]
interval: 5s
timeout: 10s
retries: 10
networks:
- micro-network

nacos:
image: nacos/nacos-server:v2.4.3
container_name: nacos-server
restart: always
environment:
- PREFER_HOST_MODE=hostname
- MODE=standalone
- SPRING_DATASOURCE_PLATFORM=mysql
- MYSQL_SERVICE_HOST=mysql
- MYSQL_SERVICE_DB_NAME=nacos_devtest
- MYSQL_SERVICE_PORT=3306
- MYSQL_SERVICE_USER=nacos
- MYSQL_SERVICE_PASSWORD=nacos
- MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
- NACOS_AUTH_IDENTITY_KEY=2222
- NACOS_AUTH_IDENTITY_VALUE=2xxx
- NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789
volumes:
- /var/log/nacos/logs:/home/nacos/logs
ports:
- "8848:8848"
- "9848:9848"
depends_on:
mysql:
condition: service_healthy
networks:
- micro-network

networks:
micro-network:
driver: bridge
  • 重要参数说明:
    • SPRING_DATASOURCE_PLATFORM=mysql:使用 MySQL 作为存储。
    • MYSQL_SERVICE_PORT=3306:指定 MySQL 的端口。
    • MYSQL_SERVICE_USER=nacos:指定连接 MySQL 时使用的用户名。
    • MYSQL_SERVICE_PASSWORD=nacos:指定连接 MySQL 时使用的密码。
    • MYSQL_SERVICE_HOST=mysql:这里的 mysql 是在 Docker Compose 中定义的 MySQL 服务的名称,用作其他服务(如 Nacos)访问 MySQL 的主机名,Docker Compose 会自动将这个名称解析为 MySQL 容器的 IP 地址。

提示

在上面的 YML 配置文件中,Nacos 容器的环境变量参考自 Nacos Docker 项目里的 YML 配置文件,即 nacos-docker/example/standalone-mysql-8.yaml。

创建 Nacos 容器

  • 使用 Docker Compose 创建并启动 Nacos 容器
1
docker compose up -d

测试 Nacos 容器

  • 查看 Nacos 容器的日志信息
1
docker logs -f --tail 50 nacos-server
  • 或者直接查看宿主机内的 Nacos 日志文件
1
tail -f -n 50 /var/log/nacos/logs/nacos.log
  • 浏览器通过 http://127.0.0.1:8848/nacos 访问 Nacos 的控制台管理页面,若是可以正常访问,则说明 Nacos 正常运行

Docker 安装 Seata

特别注意

这里尽量不要直接拉取 latest 版本的 Seata 镜像,因为 latest 版本并不一定是稳定版本。为避免不必要的问题,请到 Docker 镜像仓库 确定要拉取的镜像版本。

创建目录文件

创建 Seata 的日志目录

  • 在宿主机内创建日志目录,用于挂载 Seata 容器内的日志文件
1
sudo mkdir -p /var/log/seata/logs

创建 Seata 的配置文件

  • 在宿主机内创建配置目录,用于挂载 Seata 容器内的配置文件
1
sudo mkdir /usr/local/seata/config
  • 启动一个 Seata 临时容器
1
docker run -d -p 8091:8091 -p 7091:7091 --name seata-server seataio/seata-server:2.0.0
  • 拷贝 Seata 临时容器内的 resources 目录文件
1
docker cp seata-server:/seata-server/resources /usr/local/seata/config
  • 销毁 Seata 临时容器
1
docker rm -f seata-server
  • 查看从 Seata 临时容器拷贝出来的配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
tree /usr/local/seata/config/resources
├── application.example.yml
├── application.raft.example.yml
├── application.yml
├── banner.txt
├── docker
├── io
├── logback
├── logback-spring.xml
├── lua
├── META-INF
├── README.md
└── README-zh.md
  • 更改从 Seata 临时容器拷贝出来的配置文件 application.yml,这里可以参考官方提供的 application.example.yml 示例配置文件来更改,最终更改后的内容如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
server:
port: 7091

spring:
application:
name: seata-server

logging:
config: classpath:logback-spring.xml
file:
path: ${log.home:${user.home}/logs/seata}
extend:
logstash-appender:
destination: 127.0.0.1:4560
kafka-appender:
bootstrap-servers: 127.0.0.1:9092
topic: logback_to_logstash

console:
user:
username: seata
password: seata

seata:
# 指定 Seata Server(TC)使用的注册中心
registry:
# support: nacos、eureka、redis、zk 、consul、etcd3、sofa、seata
type: nacos
nacos:
application: seata-server
server-addr: nacos:8848
namespace:
group: SEATA_GROUP
cluster: default
username:
password:
##if use MSE Nacos with auth, mutex with username/password attribute
#access-key: ""
#secret-key: ""

# 指定 Seata Server(TC)获取配置信息的方式
config:
# support: nacos、consul、apollo、zk、etcd3
type: nacos
nacos:
server-addr: nacos:8848
namespace:
group: SEATA_GROUP
data-id: seata-server.properties
username:
password:
##if use MSE Nacos with auth, mutex with username/password attribute
#access-key: ""
#secret-key: ""

server:
service-port: 8091 #If not configured, the default is '${server.port} + 1000'

security:
secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017
tokenValidityInMilliseconds: 1800000
csrf-ignore-urls: /metadata/v1/**
ignore:
urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.jpeg,/**/*.ico,/api/v1/auth/login,/version.json,/health,/error

重要参数说明:

  • group: SEATA_GROUP:指定 Nacos 配置中心里面的分组名称。
  • data-id: seata-server.properties:指定 Nacos 配置中心里面的 Data ID。
  • application: seata-server:指定 Seata 注册进 Nacos 注册中心的服务名称。
  • server-addr: nacos:8848:这里的 nacos 是在 Docker Compose 中定义的 Nacos 服务的名称,用作其他服务(如 Seata)访问 Nacos 的主机名,Docker Compose 会自动将这个名称解析为 Nacos 容器的 IP 地址。

重要提示

  • (1) 上面提到的 application.yml 配置文件,其实就是 SpringBoot 项目(Seata Server)的核心配置文件,其作用相当于 Seata Server(TC)的 registry.conf 文件,主要用于管理注册中心和配置中心的配置。
  • (2) 这里除了创建临时容器之外,还可以直接拷贝 Seata 项目源码 里的 server/src/main/resources/application.yml 配置文件,然后更改对应的内容,最后将其挂载到 Seata 容器内的 /seata-server/resources/application.yml 路径位置。

编辑 YML 配置文件

在上面 docker-compose.yml 配置文件的基础上,添加 Seata 的配置信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
version: '3.5'

services:
mysql:
image: mysql:8.4.2
container_name: mysql-server
command: ["mysqld", "--mysql-native-password=ON"]
restart: always
ports:
- 3306:3306
environment:
- TZ=Asia/Shanghai
- MYSQL_ROOT_PASSWORD=123456
volumes:
- '/usr/local/mysql/data:/var/lib/mysql'
healthcheck:
test: ["CMD-SHELL", "mysqladmin ping -h localhost"]
interval: 5s
timeout: 10s
retries: 10
networks:
- micro-network

nacos:
image: nacos/nacos-server:v2.4.3
container_name: nacos-server
restart: always
environment:
- PREFER_HOST_MODE=hostname
- MODE=standalone
- SPRING_DATASOURCE_PLATFORM=mysql
- MYSQL_SERVICE_HOST=mysql
- MYSQL_SERVICE_DB_NAME=nacos_devtest
- MYSQL_SERVICE_PORT=3306
- MYSQL_SERVICE_USER=nacos
- MYSQL_SERVICE_PASSWORD=nacos
- MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
- NACOS_AUTH_IDENTITY_KEY=2222
- NACOS_AUTH_IDENTITY_VALUE=2xxx
- NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789
volumes:
- /var/log/nacos/logs:/home/nacos/logs
ports:
- "8848:8848"
- "9848:9848"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8848/nacos/v1/console/health/readiness"]
interval: 10s
timeout: 5s
retries: 10
start_period: 30s
depends_on:
mysql:
condition: service_healthy
networks:
- micro-network

seata:
image: seataio/seata-server:2.0.0
container_name: seata-server
restart: always
ports:
- 8091:8091
- 7091:7091
environment:
- SEATA_PORT=8091
- TZ=Asia/Shanghai
volumes:
- /usr/local/seata/config/resources:/seata-server/resources
- /var/log/seata/logs:/var/log/seata
depends_on:
mysql:
condition: service_healthy
nacos:
condition: service_healthy
networks:
- micro-network

networks:
micro-network:
driver: bridge

重要提示

在上面的 Docker Compose 配置文件中,除了可以挂载包含了 application.yml 配置文件的 resources 目录之外,还可以直接挂载 Seata Server(TC)自定义的 registry.conf 和 file.conf 文件到 Seata 容器内,以此达到相同的目的,详细说明请看 这里。

创建 Nacos 配置

启动 Nacos 容器后,在 Nacos 的控制台管理页面中,创建事务分组配置,目的是将 Seata Server(TC)的 file.conf 文件里的配置信息都存储到 Nacos 配置中心。具体的配置项如下:

  • Group:SEATA_GROUP,必须与上面 Seata 的 application.yml 配置文件一致。
  • Data ID:seata-server.properties,必须与上面 Seata 的 application.yml 配置文件一致。
  • Nacos 中的配置信息如下,最关键的是将 Seata Server(TC)的存储模式指定为 db,即使用 MySQL 数据库来存储全局事务会话信息。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 指定 Seata Server(TC)的存储模式,支持 file、db、redis
store.mode=db
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.cj.jdbc.Driver
store.db.url=jdbc:mysql://mysql:3306/seata?rewriteBatchedStatements=true
store.db.user=seata
store.db.password=seata
store.db.minConn=10
store.db.maxConn=100
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.lockTable=lock_table
store.db.distributedLockTable=distributed_lock
store.db.vgroupTable=vgroup_table
store.db.queryLimit=1000
store.db.maxWait=5000

# 关闭 Metrics 功能,提高性能
metrics.enabled=false
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898

重要参数说明:

  • store.db.driverClassName=com.mysql.cj.jdbc.Driver:指定 MySQL 驱动类,由于这里使用的是 MySQL 8 数据库,所以配置为 com.mysql.cj.jdbc.Driver。
  • store.db.url=xxxx://mysql:3306:这里的 mysql 是在 Docker Compose 中定义的 MySQL 服务的名称,用作其他服务(如 Seata)访问 MySQL 的主机名,Docker Compose 会自动将这个名称解析为 MySQL 容器的 IP 地址。

重要提示

  • (1) Seata 的全局事务会话信息由三块内容构成,全局事务 –> 分支事务 –> 全局锁,对应的表分别是 global_table、branch_table、lock_table。
  • (2) 这里除了可以将 MySQL 的配置信息存储在 Nacos 配置中心,还可以将对应的配置信息写在上面 Seata 的 application.yml 配置文件中,具体写法可以参考 Seata 官方提供的 application.example.yml 示例配置文件。
  • (3) 特别注意,这里的使用的是 Properties 配置格式,跟上面 Seata 的 application.yml 配置文件中的 YML 格式有很大区别,比如使用 store.db.dbType 作为 Key,而不是使用 store.db.db-type,如果书写格式有误,会导致 Seata 无法正常启动。简而言之,在 Nacos 配置中心里,正确的配置信息都应该与 Seata Server(TC)的 file.conf 文件的内容相对应。

创建 Seata 容器

  • 使用 Docker Compose 创建并启动 Seata 容器
1
docker compose up -d

测试 Seata 容器

  • 查看 Seata 容器的日志信息,如果没有出现错误日志信息,则说明 Seata 容器启动成功(即可以读取到 Nacos 配置中心的配置信息)
1
docker logs -f --tail 50 seata-server
  • 查看 Nacos 管理页面中的服务列表,如果看到 Seata 服务,则说明 Seata 服务成功注册进 Nacos 注册中心

  • 浏览器通过 http://127.0.0.1:7091 访问 Seata 的控制台管理页面,登录用户名和密码为 seata / seata

常见错误

参考资料