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 Server2.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.conffile.conf 两个配置文件。

Seata Server(TC)有两个核心配置文件,分别是 registry.conffile.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.conffile.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_tablebranch_tableglobal_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.conffile.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_tablebranch_tablelock_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

常见错误

参考资料