博主随记,供大家参考
目录
前言
博主本人在参考了黑马的视频后,进行了springcloud整合seata1.4.2的实践,结果是频频报错,在参考与使用了官网的部署后还是出现了很多奇怪的报错,经过两天的部署终于部署完成,整理出了一份正确的部署方案和全方案的报错解决供大家参考。
一、下载seata-server?
下载并解压seata1.4.2,seata下载地址:https://github.com/seata/seata/releases/download/v1.4.2/seata-server-1.4.2.zip
二、下载nacos
nacos下载地址:Releases · alibaba/nacos · GitHub
windows环境下,在nacos/bin目录下,进入dos输入命令startup.cmd -m standalone启动nacos
三、创建mysql数据库表
新建数据库seata,然后选择seata数据库创建表
代码如下:
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_gmt_modified_status` (`gmt_modified`, `status`),
KEY `idx_transaction_id` (`transaction_id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8;-- 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 = utf8;-- 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),
`gmt_create` DATETIME,
`gmt_modified` DATETIME,
PRIMARY KEY (`row_key`),
KEY `idx_branch_id` (`branch_id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8;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-server-1.4.2配置文件
1.配置注册中心
在seata-server-1.4.2/conf文件下修改registry.conf文件,加入注册中心配置:
registry {
type = "nacos"nacos {
application = "seata-server" #注册在nacos的服务名
serverAddr = "127.0.0.1:8848" #nacos服务的地址端口
group = "SEATA_GROUP" #注册在nacos的分组
namespace = "" #指定在nacos的命名空间
cluster = "default" #集群 使用default
username = "nacos" #nacos用户名
password = "nacos" #nacos密码
}
}
2.配置-配置中心
在seata-server-1.4.2/conf文件下修改registry.conf文件,加入配置中心配置:
config {
type = "nacos"nacos {
serverAddr = "127.0.0.1:8848" #配置中心(nacos的地址)
namespace = "" #配置中心的命名空间
group = "SEATA_GROUP" #配置中心的分组
username = "nacos" #nacos用户名
password = "nacos" #nacos密码
dataId = "seataServer.properties" #nacos的seata配置文件的dataId
}}
大家可能像我一样迷惑,配置配置中心和注册中心的代码很相似,啥是注册中心?啥是配置中心呢?有啥不一样的?
注册中心就是将seata服务注册在nacos的服务列表,使用nacos管理更加的方便,而配置中心是我们将seata的配置配置在nacos的配置中心中,这样seata就可以直接在nacos中拉取配置,避免了seata集群需要配置整个集群每个服务的配置文件的问题,加快了部署效率。
五、添加seata-server的配置文件
新建配置dataId为seataServer.properties、分组为SEATA_GROUP、配置格式为properties
properties配置文件内容如下:
# 数据存储方式,db代表数据库
store.mode=db
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.cj.jdbc.Driver
store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true&rewriteBatchedStatements=TRUE&serverTimezone=GMT%2B8
store.db.user=root
store.db.password=123456
store.db.minConn=5
store.db.maxConn=30
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000
# 事务、日志等配置
server.recovery.committingRetryPeriod=1000
server.recovery.asynCommittingRetryPeriod=1000
server.recovery.rollbackingRetryPeriod=1000
server.recovery.timeoutRetryPeriod=1000
server.maxCommitRetryTimeout=-1
server.maxRollbackRetryTimeout=-1
server.rollbackRetryTimeoutUnlockEnable=false
server.undo.logSaveDays=7
server.undo.logDeletePeriod=86400000
# 客户端与服务端传输方式
transport.serialization=seata
transport.compressor=none
# 关闭metrics功能,提高性能
metrics.enabled=false
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898
1.天大的坑
注意这里还有一个天大的坑!!!需要在nacos配置中心添加一个配置service.vgroupMapping.my_text_tx_group,分组为SEATA_GROUP内容为text格式的default
这可能是一个bug,浪费我两天的时间才解决,如果不配置这个在启动微服务的项目的时候会报错找不到服务:no available service found in cluster ‘XXXXX‘
注意这个报错: Error creating bean with name 'globalTransactionScanner' defined in class path resource......
这个报错应该是垃圾的回收机制导致的问题,在项目的配置中加入:
--add-opens java.base/java.lang=ALL-UNNAMED 可以解决问题
六、微服务项目整合seata
1.在每个服务引入pom依赖(博主自行配置,供大家参考)
<!--seata依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<exclusions>
<exclusion>
<!--版本较低排除-->
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--seata 1.42版本-->
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>${seata.version}</version>
</dependency>
<!--参考官网的依赖配置-->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.4.2</version>
</dependency>
2.在yml文件中配置项目的配置文件
seata:
tx-service-group: my_test_tx_group #对应seataServer.properties中的service.vgroupMapping.my_test_tx_group 集群分组
registry:
type: nacos #注册中心类型:nacos
nacos:
application: seata-server # seata-server注册在nacos中的服务名
server-addr: 127.0.0.1:8848 # nacos的地址端口
group : SEATA_GROUP # seata-server在nacos的分组
namespace: "" # seata-server在nacos的命名空间ID
username: nacos # nacos账号
password: nacos # nacos密码
config:
type: nacos
nacos:
server-addr: 127.0.0.1:8848
group: SEATA_GROUP
namespace: "" # seata-server的配置文件的命名空间ID
dataId: seataServer.properties # seata-server在nacos的配置dataId
username: nacos
password: nacos
七、启动测试
启动nacos:startup.cmd -m standalone,后启动seata,观察nacos的服务列表和注册列表:
seata启动成功为:
观察nacos的配置中心和注册中心:
之后启动微服务的项目观察seata的日志:
如图则为seata整合成功。
总结
seata的整合确实比较费劲,因为这几天练习科目二导致两天才配置完成,因为各种的报错等等问题,总之希望对大家能有一定的帮助。