SEATA 容器部署 NACOS 注册和配置中心、数据库存储实践记录
最编程
2024-05-04 09:07:14
...
seata容器部署nacos注册&配置中心、db存储实践记录
- 说明
- seata容器初步部署(可跳过)
- seata初部署
- 获取配置文件
- springboot简单集成seata测试
- seata使用nacos注册中心、db存储
- 环境准备
- 准备nacos配置中心配置
- 准备Mysql数据库
- seata配置nacos注册中心
- 准备docker-compose.yaml文件
- 启动seata容器
说明
- 环境准备:安装有docker环境的linux服务器
- 提示:建议docker配置国内加速镜像+nacos服务
- seata版本:2.0.0
- 如果你使用的是seata 2.0.0可以直接跳过 seata容器初步部署进入 seata使用nacos注册中心、db存储部分阅读
seata容器初步部署(可跳过)
- 这里给出seata容器初步部署的教程的目的是:避免不同seata版本的配置文件的差异,导致配置错误,进而seata应用无法正常运行。
- 建议使用和使用的seata兼容的配置文件,运行seta程序。
seata初部署
- 编写
/opt/1panel/apps/seata/docker-compose.yaml
配置文件(这里的目录可以自定义,这里由于作者安装有1panel面板,为了方便统一管理容器所以放在此目录下)
version: "3"
services:
seata-server:
image: seataio/seata-server:latest
hostname: seata-server
container_name: seata
ports:
- "8091:8091"
- "7091:7091"
environment:
- SEATA_PORT=8091
- TZ=Asia/Shanghai
- 启动seata容器
# 进入compose文件目录
cd /opt/1panel/apps/seata
# 部署seata
docker-compose up -d
获取配置文件
- 存放配置文件目录(可自定义),例如:
/opt/1panel/apps/seata/data/conf/
,同时获取
# 首先,获取Seata容器的ID或名称
docker ps
# 找到Seata容器的ID或名称后,运行以下命令将文件复制到容器外部
# <container_id>Seata容器的ID或名称
#<container_path> 要复制的文件路径
#<host_path>是要复制到的主机路径
docker cp <container_id>:<container_path> <host_path>
# 例如
docker cp seata:/seata-server/resources/application.yml /opt/1panel/apps/seata/data/conf/application.yml
docker cp seata:/seata-server/resources/application.example.yml /opt/1panel/apps/seata/data/conf/application.example.yml
- 获取到该容器下的配置文件信息后,可以参照
example.yaml
进行自定义配置
springboot简单集成seata测试
- 添加maven依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-seata</artifactId> </dependency>
- 修改
application.yaml
配置事务组信息
# seata事务组配置
seata:
tx-service-group: x-group # x-group可自定义名称注意和第四行中的组名称一致即可
service:
vgroup-mapping:
x-group: default # 事务组和seata集群做关联
grouplist:
default: IP:8091 #seata集群对应的机器 IP使用服务器IP
- 集成测试结果:启动项目,查看seata容器日志,显示如下
digest=train-group,192.168.1.9,1714455823319
timestamp=1714455823319
authVersion=V4
vgroup=train-group
ip=192.168.1.9
'},channel:[id: 0x98ceee7f, L:/172.24.0.2:8091 - R:/192.168.1.9:13565],client version:2.0.0
13:43:44.623 INFO --- [rverHandlerThread_1_1_500] [rocessor.server.RegRmProcessor] [ onRegRmMessage] [] : RM register success,message:RegisterRMRequest{resourceIds='jdbc:mysql://localhost:3306/train_member', version='2.0.0', applicationId='member', transactionServiceGroup='train-group', extraData='null'},channel:[id: 0x867118d6, L:/172.24.0.2:8091 - R:/192.168.1.9:13571],client version:2.0.0
13:43:47.735 INFO --- [ettyServerNIOWorker_1_3_8] [rocessor.server.RegTmProcessor] [ onRegTmMessage] [] : TM register success,message:RegisterTMRequest{version='2.0.0', applicationId='business', transactionServiceGroup='train-group', extraData='ak=null
digest=train-group,192.168.1.9,1714455828017
timestamp=1714455828017
authVersion=V4
vgroup=train-group
ip=192.168.1.9
'},channel:[id: 0xed7931a0, L:/172.24.0.2:8091 - R:/192.168.1.9:13586],client version:2.0.0
13:43:49.125 INFO --- [rverHandlerThread_1_2_500] [rocessor.server.RegRmProcessor] [ onRegRmMessage] [] : RM register success,message:RegisterRMRequest{resourceIds='jdbc:mysql://localhost:3306/train_business', version='2.0.0', applicationId='business', transactionServiceGroup='train-group', extraData='null'},channel:[id: 0xac930450, L:/172.24.0.2:8091 - R:/192.168.1.9:13589],client version:2.0.0
seata使用nacos注册中心、db存储
- 注意:此过程保证nacos全程开启
- seta官网 nacos注册中心,db存储指导
环境准备
准备nacos配置中心配置
- 首先在nacos中创建命名空间
seata-server
,然后再该命名空间下配置seataServer.yaml
文件
- 设置Data ID为
seataServer.yaml
Group为SEATA_GROUP
配置格式设置为YAML
配置内容如下:
store:
mode: db
db:
datasource: druid
dbType: mysql
driverClassName: com.mysql.cj.jdbc.Driver
maxConn: 20
maxWait: 5000
minConn: 1
user: xxx
password: xxx
url: jdbc:mysql://mysql_server_IP:3306/seata?useUnicode=true&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
queryLimit: 100
globalTable: global_table
lockTable: lock_table
branchTable: branch_table
- 最后,点击保存
准备Mysql数据库
- 创建数据库
seata
数据库名称可以自定义,注意和上一步的seataServer.yaml
中的数据库名称保持一致即可。 - seata 2.0.0 使用nacos注册中心,db存储的数据库sql文件如下:
- seata官网文档 nacos注册中心,db存储说明文档打开**[建表脚本]**即可跳转到sql文件页面
-- -------------------------------- The script used when storeMode is 'db' --------------------------------
-- the table to store GlobalSession data
CREATE TABLE IF NOT EXISTS `global_table`
(
`xid` VARCHAR(128) NOT NULL,
`transaction_id` BIGINT,
`status` TINYINT NOT NULL,
`application_id` VARCHAR(32),
`transaction_service_group` VARCHAR(32),
`transaction_name` VARCHAR(128),
`timeout` INT,
`begin_time` BIGINT,
`application_data` VARCHAR(2000),
`gmt_create` DATETIME,
`gmt_modified` DATETIME,
PRIMARY KEY (`xid`),
KEY `idx_status_gmt_modified` (`status` , `gmt_modified`),
KEY `idx_transaction_id` (`transaction_id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
-- the table to store BranchSession data
CREATE TABLE IF NOT EXISTS `branch_table`
(
`branch_id` BIGINT NOT NULL,
`xid` VARCHAR(128) NOT NULL,
`transaction_id` BIGINT,
`resource_group_id` VARCHAR(32),
`resource_id` VARCHAR(256),
`branch_type` VARCHAR(8),
`status` TINYINT,
`client_id` VARCHAR(64),
`application_data` VARCHAR(2000),
`gmt_create` DATETIME(6),
`gmt_modified` DATETIME(6),
PRIMARY KEY (`branch_id`),
KEY `idx_xid` (`xid`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
-- the table to store lock data
CREATE TABLE IF NOT EXISTS `lock_table`
(
`row_key` VARCHAR(128) NOT NULL,
`xid` VARCHAR(128),
`transaction_id` BIGINT,
`branch_id` BIGINT NOT NULL,
`resource_id` VARCHAR(256),
`table_name` VARCHAR(32),
`pk` VARCHAR(36),
`status` TINYINT NOT NULL DEFAULT '0' COMMENT '0:locked ,1:rollbacking',
`gmt_create` DATETIME,
`gmt_modified` DATETIME,
PRIMARY KEY (`row_key`),
KEY `idx_status` (`status`),
KEY `idx_branch_id` (`branch_id`),
KEY `idx_xid` (`xid`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
CREATE TABLE IF NOT EXISTS `distributed_lock`
(
`lock_key` CHAR(20) NOT NULL,
`lock_value` VARCHAR(20) NOT NULL,
`expire` BIGINT,
primary key (`lock_key`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('AsyncCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryRollbacking', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('TxTimeoutCheck', ' ', 0);
seata配置nacos注册中心
- 在服务器上可以手动创建并编辑
application.yml
文件。如果你使用1Panel可以尝试将存储路径设置为/opt/1panel/apps/seata/data/conf/application.yml
方便容器的管理。 - 配置文件内容如下:
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:
config:
type: nacos
nacos:
server-addr: IP:8848 #请将IP修改为部署nacos服务的服务器IP 默认端口8848
namespace: seata-server #和nacos命名空间一致
group: SEATA_GROUP
username: nacos
password: nacos
data-id: seataServer.yaml #定义nacos配置文件名称,此文件配置db信息
registry:
type: nacos
nacos:
application: seata-server
server-addr: IP:8848 #请将IP修改为部署nacos服务的服务器IP 默认端口8848
group: SEATA_GROUP
namespace: seata-server
cluster: default
username: nacos
password: nacos
security:
secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017
tokenValidityInMilliseconds: 1800000
ignore:
urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.jpeg,/**/*.ico,/api/v1/auth/login,/version.json
准备docker-compose.yaml文件
- 在
/opt/1panel/apps/seata/
目录下创建docker-compose.yaml
文件
version: "3"
services:
seata-server:
image: seataio/seata-server:latest
hostname: seata-server
container_name: seata
ports:
- "8091:8091"
- "7091:7091"
environment:
- SEATA_PORT=8091
- TZ=Asia/Shanghai
- SEATA_IP=linuxServer_IP # linuxServer_IP:注册nacos时使用该地址,保证seata和其他应用正常通信
- STORE_MODE=db #设置存储模式为database
volumes:
- ./data/conf/application.yml:/seata-server/resources/application.yml
启动seata容器
# 进入compose文件目录
cd /opt/1panel/apps/seata
# 部署seata
docker-compose up -d
下一篇: 低年级趣味作文--大胆思考,合理想象