说明: SSM + SpringBoot + SpringCloud + nacos + seata + MySQL实现
nacos版本1.3.1
seata版本1.3.0
nacos作为项目的服务注册中心, 也作为seata的服务注册中心
坑很多很多, 搞了两三天才搞好, 踩坑无数, 所以做这个记录.
首先是nacos配置
下载的nacos包里有nacos-mysql.sql文件, 到数据库导入. 并修改包里的application.properties文件, 修改数据源为mysql并配上对应的信息
修改nacos启动命令, windows修改cmd的, linux修改.sh文件, 设置启动类型为standalone
MODE="standalone"
到这里最简单的nacos配置就完成了, 可以直接启动.
PS: 很多时候nacos出问题时百度出来的内容都是把application.properties的名字改为bootstrap.properties, 经尝试, 这个完全没用. 主要还是自己检查配置正确就可以.
然后是seata配置, 这里全部都是坑
seata主要就是两个配置文件 registry.conf 和 file.conf
这里先说 registry.conf
这个文件主要是配置seata去哪里注册服务, 默认的里面有很多种选项, 这里选择nacos并配置对应地址和group
下面的config代表着其他配置去哪里读取, type = file的时候代表读取file.conf文件
file.conf文件说明
你在官方下载1.3.0之后, 里面的file.conf内容其实是比较少的, 哪怕是示例file.conf.example中, 也是有所缺失, 我百度了很久, 结合了网上博客加上官方示例, 整理出来了一份如下
transport {
# tcp udt unix-domain-socket
type = "TCP"
#NIO NATIVE
server = "NIO"
#enable heartbeat
heartbeat = true
# the client batch send request enable
enableClientBatchSendRequest = true
#thread factory for netty
threadFactory {
bossThreadPrefix = "NettyBoss"
workerThreadPrefix = "NettyServerNIOWorker"
serverExecutorThread-prefix = "NettyServerBizHandler"
shareBossWorker = false
clientSelectorThreadPrefix = "NettyClientSelector"
clientSelectorThreadSize = 1
clientWorkerThreadPrefix = "NettyClientWorkerThread"
# netty boss thread size,will not be used for UDT
bossThreadSize = 1
#auto default pin or 8
workerThreadSize = "default"
}
shutdown {
# when destroy server, wait seconds
wait = 3
}
serialization = "seata"
compressor = "none"
}
service {
#transaction service group mapping
vgroupPapping.my_test_tx_group= "default"
enableDegrade = false
#disable seata
disableGlobalTransaction = false
}
store {
mode = "db"
db {
## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp)/HikariDataSource(hikari) etc.
datasource = "druid"
## mysql/oracle/postgresql/h2/oceanbase etc.
dbType = "mysql"
driverClassName = "com.mysql.jdbc.Driver"
url = "jdbc:mysql://192.168.88.104:3306/seata"
user = "test"
password = "test123"
minConn = 5
maxConn = 30
globalTable = "global_table"
branchTable = "branch_table"
lockTable = "lock_table"
queryLimit = 100
maxWait = 5000
}
}
client {
rm {
asyncCommitBufferLimit = 10000
lock {
retryInterval = 10
retryTimes = 30
retryPolicyBranchRollbackOnConflict = true
}
reportRetryCount = 5
tableMetaCheckEnable = false
reportSuccessEnable = false
}
tm {
commitRetryCount = 5
rollbackRetryCount = 5
}
undo {
dataValidation = true
logSerialization = "jackson"
logTable = "undo_log"
}
log {
exceptionRate = 100
}
}
store 里面选择db并配置mysql数据库, 建表语句可以到这里找 https://github.com/seata/seata/tree/develop/script/server/db
注意! 你需要开启分布式事务的数据库要加上undo_log这张表, 语句如下:
CREATE TABLE `undo_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`branch_id` bigint(20) NOT NULL,
`xid` varchar(100) NOT NULL,
`context` varchar(128) NOT NULL,
`rollback_info` longblob NOT NULL,
`log_status` int(11) NOT NULL,
`log_created` datetime NOT NULL,
`log_modified` datetime NOT NULL,
`ext` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
例如下单, 需要订单服务生成订单, 用户服务扣减金额 , 这时订单服务的数据库需要, 用户服务的数据库也需要, 如果同一个库, 只要一个也可以
seata至此配置完成, 启动后nacos中显示如下
最后加上项目配置
首先是依赖, 常加的ssm 和 springboot, 数据库啊啥的就不说了, 贴几个关键的
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-seata</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
注意这个依赖 "spring-cloud-alibaba-seata", 如果不加, 按照这个教程配也不会有任何启动问题, 但分布式事务不生效
配置文件如下
server:
port: 8080
spring:
application:
name: seata-gateway
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.88.104:3306/yjj_account?useSSL=false&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&serverTimezone=Asia/Shanghai
username: test
password: test123
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
group: SEATA_SERVER_GROUP
alibaba:
seata:
tx-service-group: my_test_tx_group
mybatis:
mapper-locations: classpath*:mapping/*.xml
这里注意:
1. nacos.discovery.group要和seata的registry.conf的group一致
2. alibaba.seata.tx-service-group的值要和seata的file.conf里的vgroupPapping.xxx="default" 这里的XXX一致
然后把seata的那两个配置文件复制到项目中
启动类如下
openFeginClient如下
大体配置就到这里就完了, 照着这个配, 需要开启分布式事务的地方加上注解
调用的服务实现方法加上注解
即可实现分布式事务的功能.
启动日志截图:
可以看到, seata注册和nacos注册都成功
这里我建了三个服务, A/B/C, 三个服务对应不同的数据库, 最后实验成功了, 如下图
希望这篇文章给大家带来帮助, 毕竟坑, 实在太多了, 这两天踩得我痛不欲生