Hello,大家好。最近在学习搭建seata去处理分布式事务中遇到了很多问题,搜了很多文章尝试了很多种方式终于才成功解决。这里我将自己成功部署并运行的配置过程分享给大家,希望能对大家有所帮助。由于我也是个小白,用词可能不够专业,配置过程可能也有点小笨,希望大家能指出不足或者提出问题,一起探讨。
打开powershell运行使用指令,将mysql 8.0.18的镜像下载下来:
docker pull mysql:8.0.18
1、在windows下准备以下文件,位置根据自己喜好而定:
2、在conf文件下准备文件my.conf
my.conf
文件内容如下:
[mysqld]
#Mysql服务的唯一编号 每个mysql服务Id需唯一
server-id=1
#服务端口号 默认3306
port=3306
#mysql安装根目录(default /usr)
#basedir=/usr/local/mysql
#mysql数据文件所在位置
datadir=/var/lib/mysql
#pid
pid-file=/var/run/mysqld/mysqld.pid
#设置socke文件所在目录
socket=/var/lib/mysql/mysql.sock
#设置临时目录
#tmpdir=/tmp
# 用户
user=mysql
# 允许访问的IP网段
bind-address=0.0.0.0
# 跳过密码登录
#skip-grant-tables
#主要用于MyISAM存储引擎,如果多台服务器连接一个数据库则建议注释下面内容
#skip-external-locking
#只能用IP地址检查客户端的登录,不用主机名
#skip_name_resolve=1
#事务隔离级别,默认为可重复读,mysql默认可重复读级别(此级别下可能参数很多间隙锁,影响性能)
#transaction_isolation=READ-COMMITTED
#数据库默认字符集,主流字符集支持一些特殊表情符号(特殊表情符占用4个字节)
character-set-server=utf8mb4
#数据库字符集对应一些排序等规则,注意要和character-set-server对应
collation-server=utf8mb4_general_ci
#设置client连接mysql时的字符集,防止乱码
init_connect='SET NAMES utf8mb4'
#是否对sql语句大小写敏感,1表示不敏感
lower_case_table_names=1
#最大连接数
max_connections=400
#最大错误连接数
max_connect_errors=1000
#TIMESTAMP如果没有显示声明NOT NULL,允许NULL值
explicit_defaults_for_timestamp=true
#SQL数据包发送的大小,如果有BLOB对象建议修改成1G
max_allowed_packet=128M
#MySQL连接闲置超过一定时间后(单位:秒)将会被强行关闭
#MySQL默认的wait_timeout 值为8个小时, interactive_timeout参数需要同时配置才能生效
interactive_timeout=1800
wait_timeout=1800
#内部内存临时表的最大值 ,设置成128M。
#比如大数据量的group by ,order by时可能用到临时表,
#超过了这个值将写入磁盘,系统IO压力增大
tmp_table_size=134217728
max_heap_table_size=134217728
#禁用mysql的缓存查询结果集功能
#后期根据业务情况测试决定是否开启
#大部分情况下关闭下面两项
#query_cache_size = 0
#query_cache_type = 0
#数据库错误日志文件
#log-error=/var/log/mysqld.log
#慢查询sql日志设置
#slow_query_log=1
#slow_query_log_file=/var/log/mysqld_slow.log
#检查未使用到索引的sql
log_queries_not_using_indexes=1
#针对log_queries_not_using_indexes开启后,记录慢sql的频次、每分钟记录的条数
log_throttle_queries_not_using_indexes=5
#作为从库时生效,从库复制中如何有慢sql也将被记录
log_slow_slave_statements=1
#慢查询执行的秒数,必须达到此值可被记录
long_query_time=8
#检索的行数必须达到此值才可被记为慢查询
min_examined_row_limit=100
#mysql binlog日志文件保存的过期时间,过期后自动删除
#expire_logs_days=5
binlog_expire_logs_seconds=604800
打开powershell运行使用以下指令(在使用以下指令时,最好不要直接复制使用,powershell可能会报错,先打开记事本将格式调整一下,需要先把注释删掉,缩进换行全部取消,再放进powershell运行)
docker run -d -p 3306:3306 --privileged=true
--net mynet --ip 172.18.1.30 /*--mynet是使用了docker的自定义网桥
--这样可以让你的mysql地址固定
--目的是为了能让nacos,seata,mysql能够互相访问*/
-v d:\docker\mysql\log/*你刚才创建文件的位置*/:/var/log/mysql
-v d:\docker\mysql\data/*你刚才创建文件的位置*/:/var/lib/mysql
-v d:\docker\mysql\conf\my.cnf/*你刚才创建文件的位置*/:/etc/my.cnf
-e MYSQL_ROOT_PASSWORD=abc123 /*你的数据库密码*/
--name mysql/*你给这个mysql取的名字*/ mysql:8.0.18/*mysql镜像的名字加版本号*/
打开powershell运行使用指令,将nacos 2.1.0的镜像下载下来:
/*下载nacos 2.1.0的镜像*/
docker pull nacos/nacos-server:2.1.0
/*给镜像重命名为自己喜欢的名字*/
docker tags nacos/nacos-server:2.1.0 nacos:2.1.0
2、根据Nacos官方文档要求,需要准备数据库,所以我们先在我们的数据库下创建一个数据库
然后再选中这个数据库,运行以下指令
/*
* Copyright 1999-2018 Alibaba Group Holding Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info */
/******************************************/
CREATE TABLE `config_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(255) DEFAULT NULL,
`content` longtext NOT NULL COMMENT 'content',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`src_user` text COMMENT 'source user',
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
`app_name` varchar(128) DEFAULT NULL,
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
`c_desc` varchar(256) DEFAULT NULL,
`c_use` varchar(64) DEFAULT NULL,
`effect` varchar(64) DEFAULT NULL,
`type` varchar(64) DEFAULT NULL,
`c_schema` text,
`encrypted_data_key` text NOT NULL COMMENT '秘钥',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info_aggr */
/******************************************/
CREATE TABLE `config_info_aggr` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(255) NOT NULL COMMENT 'group_id',
`datum_id` varchar(255) NOT NULL COMMENT 'datum_id',
`content` longtext NOT NULL COMMENT '内容',
`gmt_modified` datetime NOT NULL COMMENT '修改时间',
`app_name` varchar(128) DEFAULT NULL,
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租户字段';
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info_beta */
/******************************************/
CREATE TABLE `config_info_beta` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
`content` longtext NOT NULL COMMENT 'content',
`beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`src_user` text COMMENT 'source user',
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
`encrypted_data_key` text NOT NULL COMMENT '秘钥',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info_tag */
/******************************************/
CREATE TABLE `config_info_tag` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
`tag_id` varchar(128) NOT NULL COMMENT 'tag_id',
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
`content` longtext NOT NULL COMMENT 'content',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`src_user` text COMMENT 'source user',
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_tags_relation */
/******************************************/
CREATE TABLE `config_tags_relation` (
`id` bigint(20) NOT NULL COMMENT 'id',
`tag_name` varchar(128) NOT NULL COMMENT 'tag_name',
`tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
`nid` bigint(20) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`nid`),
UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = group_capacity */
/******************************************/
CREATE TABLE `group_capacity` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群',
`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值',
`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表';
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = his_config_info */
/******************************************/
CREATE TABLE `his_config_info` (
`id` bigint(64) unsigned NOT NULL,
`nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`data_id` varchar(255) NOT NULL,
`group_id` varchar(128) NOT NULL,
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
`content` longtext NOT NULL,
`md5` varchar(32) DEFAULT NULL,
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`src_user` text,
`src_ip` varchar(50) DEFAULT NULL,
`op_type` char(10) DEFAULT NULL,
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
`encrypted_data_key` text NOT NULL COMMENT '秘钥',
PRIMARY KEY (`nid`),
KEY `idx_gmt_create` (`gmt_create`),
KEY `idx_gmt_modified` (`gmt_modified`),
KEY `idx_did` (`data_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造';
/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = tenant_capacity */
/******************************************/
CREATE TABLE `tenant_capacity` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',
`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值',
`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值',
`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数',
`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值',
`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表';
CREATE TABLE `tenant_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`kp` varchar(128) NOT NULL COMMENT 'kp',
`tenant_id` varchar(128) default '' COMMENT 'tenant_id',
`tenant_name` varchar(128) default '' COMMENT 'tenant_name',
`tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',
`create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',
`gmt_create` bigint(20) NOT NULL COMMENT '创建时间',
`gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';
CREATE TABLE `users` (
`username` varchar(50) NOT NULL PRIMARY KEY,
`password` varchar(500) NOT NULL,
`enabled` boolean NOT NULL
);
CREATE TABLE `roles` (
`username` varchar(50) NOT NULL,
`role` varchar(50) NOT NULL,
UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE
);
CREATE TABLE `permissions` (
`role` varchar(50) NOT NULL,
`resource` varchar(255) NOT NULL,
`action` varchar(8) NOT NULL,
UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
);
INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);
INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');
3、数据库准备好了,回到刚才windows下创建的文件,在conf文件下继续创建一个文件application.properties
,用作nacos的配置文件
application.properties
文件的内容如下:(官网全新未更改版本)
# spring
server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.contextPath=/nacos
server.port=${NACOS_APPLICATION_PORT:8848}
spring.datasource.platform=${SPRING_DATASOURCE_PLATFORM:""}
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
db.num=${MYSQL_DATABASE_NUM:1}
db.url.0=jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT:3306}/${MYSQL_SERVICE_DB_NAME}?${MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false}
db.url.1=jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT:3306}/${MYSQL_SERVICE_DB_NAME}?${MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false}
db.user=${MYSQL_SERVICE_USER}
db.password=${MYSQL_SERVICE_PASSWORD}
### The auth system to use, currently only 'nacos' is supported:
nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}
### The token expiration in seconds:
nacos.core.auth.default.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000}
### The default token:
nacos.core.auth.default.token.secret.key=${NACOS_AUTH_TOKEN:SecretKey012345678901234567890123456789012345678901234567890123456789}
### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay.
nacos.core.auth.caching.enabled=${NACOS_AUTH_CACHE_ENABLE:false}
nacos.core.auth.enable.userAgentAuthWhite=${NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE:false}
nacos.core.auth.server.identity.key=${NACOS_AUTH_IDENTITY_KEY:serverIdentity}
nacos.core.auth.server.identity.value=${NACOS_AUTH_IDENTITY_VALUE:security}
server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D
# default current work dir
server.tomcat.basedir=
## spring security config
### turn off security
nacos.security.ignore.urls=${NACOS_SECURITY_IGNORE_URLS:/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**}
# metrics for elastic search
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false
nacos.naming.distro.taskDispatchThreadCount=10
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true
打开powershell运行使用以下指令(在使用以下指令时,最好不要直接复制使用,powershell可能会报错,先打开记事本将格式调整一下,需要先把注释删掉,缩进换行全部取消,再放进powershell运行)
docker run -d -e MODE=standalone
--net mynet --ip 172.18.1.48 /*--mynet是使用了docker的自定义网桥
--这样可以让你的mysql地址固定
--目的是为了能让nacos,seata,mysql能够互相访问*/
-p 8848:8848 -p 9848:9848 -p 9849:9849
-v d:\docker\nacos\nacos_standalone\logs/*你刚才创建文件的位置*/:/home/nacos/logs
-v d:\docker\nacos\nacos_standalone\data/*你刚才创建文件的位置*/:/home/nacos/data
-v d:\docker\nacos\nacos_standalone\conf\application.properties/*你刚才创建文件的位置*/:/home/nacos/conf/application.properties
--name nacos_standalone /*你给这个nacos取的名字*/ nacos:2.1.0/*nacos镜像的名字加版本号*/
打开powershell运行使用指令,将seata 1.5.2的镜像下载下来:
/*下载seata 1.5.2的镜像*/
docker pull seataio/seata-server:1.5.2
/*给镜像重命名为自己喜欢的名字*/
docker tags seataio/seata-server:1.5.2 seata:1.5.2
2、根据Seata官方文档要求,需要准备数据库,所以我们先在我们的数据库下创建一个数据库
然后再选中这个数据库,运行以下指令
-- -------------------------------- 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);
3、数据库准备好了,回到刚才windows下创建的文件,在resources文件下继续创建一个文件application.yml
,用作seata的配置文件
application-example.yml
文件的内容如下:(官网全新未更改版本)
server:
port: 7091
spring:
application:
name: seata-server
logging:
config: classpath:logback-spring.xml
file:
path: ${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
seata:
config:
# support: nacos 、 consul 、 apollo 、 zk 、 etcd3
type: file
nacos:
server-addr: 127.0.0.1:8848
namespace:
group: SEATA_GROUP
username:
password:
##if use MSE Nacos with auth, mutex with username/password attribute
#access-key: ""
#secret-key: ""
data-id: seataServer.properties
consul:
server-addr: 127.0.0.1:8500
acl-token:
key: seata.properties
apollo:
appId: seata-server
apollo-meta: http://192.168.1.204:8801
apollo-config-service: http://192.168.1.204:8080
namespace: application
apollo-access-key-secret:
cluster: seata
zk:
server-addr: 127.0.0.1:2181
session-timeout: 6000
connect-timeout: 2000
username:
password:
node-path: /seata/seata.properties
etcd3:
server-addr: http://localhost:2379
key: seata.properties
registry:
# support: nacos 、 eureka 、 redis 、 zk 、 consul 、 etcd3 、 sofa
type: file
preferred-networks: 30.240.*
nacos:
application: seata-server
server-addr: 127.0.0.1:8848
group: SEATA_GROUP
namespace:
cluster: default
username:
password:
##if use MSE Nacos with auth, mutex with username/password attribute
#access-key: ""
#secret-key: ""
eureka:
service-url: http://localhost:8761/eureka
application: default
weight: 1
redis:
server-addr: localhost:6379
db: 0
password:
cluster: default
timeout: 0
zk:
cluster: default
server-addr: 127.0.0.1:2181
session-timeout: 6000
connect-timeout: 2000
username: ""
password: ""
consul:
cluster: default
server-addr: 127.0.0.1:8500
acl-token:
etcd3:
cluster: default
server-addr: http://localhost:2379
sofa:
server-addr: 127.0.0.1:9603
application: default
region: DEFAULT_ZONE
datacenter: DefaultDataCenter
cluster: default
group: SEATA_GROUP
address-wait-time: 3000
server:
service-port: 8091 #If not configured, the default is '${server.port} + 1000'
max-commit-retry-timeout: -1
max-rollback-retry-timeout: -1
rollback-retry-timeout-unlock-enable: false
enable-check-auth: true
enable-parallel-request-handle: true
retry-dead-threshold: 130000
xaer-nota-retry-timeout: 60000
recovery:
handle-all-session-period: 1000
undo:
log-save-days: 7
log-delete-period: 86400000
session:
branch-async-queue-size: 5000 #branch async remove queue size
enable-branch-async-remove: false #enable to asynchronous remove branchSession
store:
# support: file 、 db 、 redis
mode: file
session:
mode: file
lock:
mode: file
file:
dir: sessionStore
max-branch-session-size: 16384
max-global-session-size: 512
file-write-buffer-cache-size: 16384
session-reload-read-size: 100
flush-disk-mode: async
db:
datasource: druid
db-type: mysql
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/seata?rewriteBatchedStatements=true
user: mysql
password: mysql
min-conn: 5
max-conn: 100
global-table: global_table
branch-table: branch_table
lock-table: lock_table
distributed-lock-table: distributed_lock
query-limit: 100
max-wait: 5000
redis:
mode: single
database: 0
min-conn: 1
max-conn: 10
password:
max-total: 100
query-limit: 100
single:
host: 127.0.0.1
port: 6379
sentinel:
master-name:
sentinel-hosts:
metrics:
enabled: false
registry-type: compact
exporter-list: prometheus
exporter-prometheus-port: 9898
transport:
rpc-tc-request-timeout: 30000
enable-tc-server-batch-send-response: false
shutdown:
wait: 3
thread-factory:
boss-thread-prefix: NettyBoss
worker-thread-prefix: NettyServerNIOWorker
boss-thread-size: 1
application.yml
文件的内容如下:(我使用的配置,给大家打个样,保守一点可以直接在这个基础上更改)
server:
port: 7091 //建议就使用这个也可以自定义
spring:
application:
name: seata-server //建议就使用这个也可以自定义
logging:
config: classpath:logback-spring.xml
file:
path: ${user.home}/logs/seata
console:
user:
username: seata //seata用户,建议就使用这个,也可以自定义
password: seata //seata密码,建议就使用这个,也可以自定义
seata:
config:
type: nacos //我们的配置中心在nacos上,所以类型为nacos
nacos:
server-addr: 172.18.1.48:8848 //刚才配置nacos自定义的ip地址加上端口号
group: "SEATA_GROUP" //nacos上的自己命名的group
namespace: "4ef5c1ec-a7cb-4975-ad8b-5efe33db2413" //nacos上的自己命名的namespace
file-extension: yaml //nacos上的自己配置文件的类型
data-id: seataServer.yaml //nacos上的自己配置文件的名字
username: "nacos" //nacos上的用户名
password: "nacos" //nacos上的密码
registry:
type: nacos
nacos:
application: seata-server //注册进nacos的名字,建议和上面的一样
server-addr: 172.18.1.48:8848 //刚才配置nacos自定义的ip地址加上端口号
group: "SEATA_GROUP" //nacos上的自己命名的group
namespace: "4ef5c1ec-a7cb-4975-ad8b-5efe33db2413" //nacos上的自己命名的namespace
cluster: default //当前seata所在的集群名(我猜)
username: "nacos" //nacos上的用户名
password: "nacos" //nacos上的密码
security:
secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017
tokenValidityInMilliseconds: 1800000
ignore:
urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/api/v1/auth/login
4、此时数据库seata的相关表和windows上的相关文件已经准备好了,现在我们来到nacos,实现配置中心里文件的实现。
首先
其次
然后
在箭头里放入以下内容(需要更改的地放入了注解,其他的我也不懂,详情见官方文档)
service:
vgroupMapping:
order_tx_group: default //其中order_tx_group可以自定义,记得统一
default_tx_group: default //其中default_tx_group可以自定义,记得统一
default:
grouplist: 127.0.0.1:8091
enableDegrade: false
disableGlobalTransaction: false
store:
mode: db
db:
datasource: druid
dbType: mysql
driverClassName: com.mysql.cj.jdbc.Driver
globalTable: global_table
lockTable: lock_table
branchTable: branch_table
distributedLockTable: distributed_lock
maxConn: 30
maxWait: 5000
minConn: 5
queryLimit: 100
//下方是数据库的经典配置,数据库指向刚才为seata创建的数据库即可
url: jdbc:mysql://172.18.1.30:3306/db_seata?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=utf-8&useSSL=false
user: root
password: abc123
client:
rm:
asyncCommitBufferLimit: 10000
lock:
retryInterval: 10
retryPolicyBranchRollbackOnConflict: true
retryTimes: 30
reportRetryCount: 5
reportSuccessEnable: false
sagaBranchRegisterEnable: false
sagaJsonParser: fastjson
sqlParserType: druid
tableMetaCheckEnable: true
tableMetaCheckerInterval: 60000
tccActionInterceptorOrder: -2147482648
tm:
commitRetryCount: 5
defaultGlobalTransactionTimeout: 60000
degradeCheck: false
degradeCheckAllowTimes: 10
degradeCheckPeriod: 2000
interceptorOrder: -2147482648
rollbackRetryCount: 5
undo:
compress:
enable: true
threshold: 64k
type: zip
dataValidation: true
logSerialization: jackson
logTable: undo_log
onlyCareUpdateColumns: true
log:
exceptionRate: 100
metrics:
enabled: false
exporterList: prometheus
exporterPrometheusPort: 9898
registryType: compact
server:
distributedLockExpireTime: 10000
enableParallelRequestHandle: false
maxCommitRetryTimeout: -1
maxRollbackRetryTimeout: -1
recovery:
asynCommittingRetryPeriod: 1000
committingRetryPeriod: 1000
rollbackingRetryPeriod: 1000
timeoutRetryPeriod: 1000
rollbackRetryTimeoutUnlockEnable: false
session:
branchAsyncQueueSize: 5000
enableBranchAsyncRemove: false
undo:
logDeletePeriod: 86400000
logSaveDays: 7
xaerNotaRetryTimeout: 60000
tcc:
fence:
cleanPeriod: 1h
logTableName: tcc_fence_log
transport:
compressor: none
enableRmClientBatchSendRequest: true
enableTcServerBatchSendResponse: false
enableTmClientBatchSendRequest: false
heartbeat: true
rpcRmRequestTimeout: 30000
rpcTcRequestTimeout: 30000
rpcTmRequestTimeout: 30000
serialization: seata
server: NIO
shutdown:
wait: 3
threadFactory:
bossThreadPrefix: NettyBoss
bossThreadSize: 1
clientSelectorThreadPrefix: NettyClientSelector
clientSelectorThreadSize: 1
clientWorkerThreadPrefix: NettyClientWorkerThread
serverExecutorThreadPrefix: NettyServerBizHandler
shareBossWorker: false
workerThreadPrefix: NettyServerNIOWorker
workerThreadSize: default
type: TCP
请先确认,windows下的文件是否准备配置完毕,seata的数据库配置是否完毕,seata数据是否准备完毕,如果全部ok,那么准备去起飞。
然后打开powershell运行使用以下指令(在使用以下指令时,最好不要直接复制使用,powershell可能会报错,先打开记事本将格式调整一下,需要先把注释删掉,缩进换行全部取消,再放进powershell运行)
docker run -d -p 8091:8091 -p 7091:7091
--net mynet --ip 172.18.1.91 /*--mynet是使用了docker的自定义网桥
--这样可以让你的mysql地址固定
--目的是为了能让nacos,seata,mysql能够互相访问*/
-v d:\docker\seata\resources\application.yaml/*你刚才创建文件的位置*/:/seata-server/resources/application.yaml
--name seata-server/*你给这个seata取的名字*/ seata:1.5.2/*nacos镜像的名字加版本号*/
首先
(假设)我们有的客户端有三个事务:(即在idea创建了三个client项目)
1、seata-order-service
2、seata-account-service
3、seata-storage-service
pom.xml
)然后对每个client下pom.xml
,建议使用以下版本(因为我是使用这些版本跑通的):
spring-boot-dependencies------>2.3.12.RELEASE
spring-cloud-dependencies------>Hoxton.SR12
spring-cloud-alibaba-dependencies------>2.2.8.RELEASE
org.springframework.boot
spring-boot-dependencies
2.3.12.RELEASE
pom
import
org.springframework.cloud
spring-cloud-dependencies
Hoxton.SR12
pom
import
com.alibaba.cloud
spring-cloud-alibaba-dependencies
2.2.8.RELEASE
pom
import
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
com.alibaba.cloud
spring-cloud-starter-alibaba-seata
seata-spring-boot-starter
io.seata
io.seata
seata-spring-boot-starter
1.5.2
org.springframework.cloud
spring-cloud-starter-openfeign
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.0.0
mysql
mysql-connector-java
8.0.20
application.yaml
)然后给每个client下面配置一下内容:
1、seata-order-service ->application.yaml
2、seata-account-service ->application.yaml
3、seata-account-service ->application.yaml
下面以seata-order-service的application.yaml
为例子:
server:
port: 1001 /*每个client的端口:(自定义就好)
seata-order-service:1001
seata-account-service:1002
seata-account-service"1003*/
spring:
application:
name: seata-order-service
/*每个client的名字:(自定义就好)
seata-order-service:seata-order-service
seata-account-service:seata-account-service
seata-account-service"seata-account-service*/
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 /*指向nacos,这里为什么是127.0.0.1,
是因为我们的客户是在windows下的,
docker里的nacos之前有配置本地端口映射*/
namespace: 4ef5c1ec-a7cb-4975-ad8b-5efe33db2413 //之前配置的namespace,一致就好
group: SEATA_GROUP //之前配置的group,一致就好
config:
server-addr: 127.0.0.1:8848 /*指向nacos,这里为什么是127.0.0.1,
是因为我们的客户是在windows下的,
docker里的nacos之前有配置本地端口映射*/
namespace: 4ef5c1ec-a7cb-4975-ad8b-5efe33db2413 //之前配置的namespace,一致就好
group: SEATA_GROUP //之前配置的group,一致就好
file-extension: yaml //配置文件格式
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
//数据库的经典配置,记得每个客户端的这里↓↓↓↓↓↓↓↓↓↓↓↓数据库名不一样
url: jdbc:mysql://localhost:3306/db_seata_order?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: abc123
//这里要和seataServer.yaml配置的一样,及seata的配置中心的文件
seata:
enable: true
application-id: seata-order-service
tx-service-group: order_tx_group
service:
vgroupMapping:
order_tx_group: default
grouplist:
default: 127.0.0.1:8091
//↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
feign:
hystrix:
enabled: false
logging:
level:
io:
seata: info
mybatis:
mapperLocations: classpath:mapper/*.xml
首先在Nacos上,用刚才创建seata配置中心文件的方法,为三个client创建三个独立的配置文件,文件命名严格按照你spring.application.name.你定义的客户端名字------->你定义的客户端名字.yaml
命名:(不然可能会出现客户端找不到nacos的配置中心的报错,我使用dataid进行自定义也不行,不知道是不是nacos2.1.0的小问题,也可能是我没搞懂)
然后配置文件为以下内容(需要更改的地方加了注解,其它的我也不懂,详情请见官方文档)
service:
vgroupMapping:
order_tx_group: default //其中order_tx_group可以自定义,记得统一
default_tx_group: default //其中default_tx_group可以自定义,记得统一
default:
grouplist: 127.0.0.1:8091
enableDegrade: false
disableGlobalTransaction: false
store:
mode: db
db:
datasource: druid
dbType: mysql
driverClassName: com.mysql.cj.jdbc.Driver
globalTable: global_table
lockTable: lock_table
branchTable: branch_table
distributedLockTable: distributed_lock
maxConn: 30
maxWait: 5000
minConn: 5
queryLimit: 100
//下方是数据库的经典配置,数据库指向刚才为seata创建的数据库即可
url: jdbc:mysql://172.18.1.30:3306/db_seata?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=utf-8&useSSL=false
user: root
password: abc123
client:
rm:
asyncCommitBufferLimit: 10000
lock:
retryInterval: 10
retryPolicyBranchRollbackOnConflict: true
retryTimes: 30
reportRetryCount: 5
reportSuccessEnable: false
sagaBranchRegisterEnable: false
sagaJsonParser: fastjson
sqlParserType: druid
tableMetaCheckEnable: true
tableMetaCheckerInterval: 60000
tccActionInterceptorOrder: -2147482648
tm:
commitRetryCount: 5
defaultGlobalTransactionTimeout: 60000
degradeCheck: false
degradeCheckAllowTimes: 10
degradeCheckPeriod: 2000
interceptorOrder: -2147482648
rollbackRetryCount: 5
undo:
compress:
enable: true
threshold: 64k
type: zip
dataValidation: true
logSerialization: jackson
logTable: undo_log
onlyCareUpdateColumns: true
log:
exceptionRate: 100
metrics:
enabled: false
exporterList: prometheus
exporterPrometheusPort: 9898
registryType: compact
tcc:
fence:
cleanPeriod: 1h
logTableName: tcc_fence_log
transport:
compressor: none
enableRmClientBatchSendRequest: true
enableTcServerBatchSendResponse: false
enableTmClientBatchSendRequest: false
heartbeat: true
rpcRmRequestTimeout: 30000
rpcTcRequestTimeout: 30000
rpcTmRequestTimeout: 30000
serialization: seata
server: NIO
shutdown:
wait: 3
threadFactory:
bossThreadPrefix: NettyBoss
bossThreadSize: 1
clientSelectorThreadPrefix: NettyClientSelector
clientSelectorThreadSize: 1
clientWorkerThreadPrefix: NettyClientWorkerThread
serverExecutorThreadPrefix: NettyServerBizHandler
shareBossWorker: false
workerThreadPrefix: NettyServerNIOWorker
workerThreadSize: default
type: TCP
每个启动类记得加上以下注解:
@EnableDiscoveryClient
@EnableFeignClients //如果要使用Feign进行负载均衡才加,另外也需要引入依赖
@SpringBootApplication
最后在你需要使用seata回滚的方法上加入注解
@GlobalTransactional(name = "seata-create-order/*自定义名字,重名会冲突*/",rollbackFor = Exception.class)
以上便是,我给大家分享的在windows中使用docker下的seata1.5.2,nacos2.1.0,mysql8.0.18的部署和客户端配置的方法。文章中有什么问题或者遇到了什么问题,可以提出大家一起探讨一起解决。我也是站在巨人的肩膀上才完成部署,所以希望大家在使用后能有一定的帮助。