最近在做一个新项目需要用到seata 因为之前没用过所以去网上找资料的时候就很茫然 这里粘一点 那里扣一点 然后感觉各种问题都遇到了 陆陆续续的做了有两三天 终于现在能用了 这里记录一下踩过得坑和一些注意点 同时感谢各路大佬的帮助
这里先暂时将用法记录一下 等后面有时间了就从头开始学习一下Spring Cloud Alibaba 后续再进行补充 如果有推荐的课程大家可以评论一下 感谢~
查看springcloud 对应版本 :
https://start.spring.io/actuator/info
官网里也能看到:
https://spring.io/projects/spring-cloud#overview
seata下载地址:
https://github.com/seata/seata/releases
(这里选用的1.3版本的)
seata文档:
https://seata.io/zh-cn/docs/overview/what-is-seata.html
seata源码及一些配置:
https://github.com/seata/seata/tree/1.3.0
- Spring Cloud Alibaba 版本 2.2.6.RELEASE
- boot版本 2.3.12.RELEASE
- Nacos版本1.4.2
- Mysql版本 8.0.26
依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
数据库
数据库的文件在下载的源码里面
导入后就会有这三个表
还要在每个业务库里面建一个
undo_log
用来回滚的表 后面再去了解他的用法
CREATE TABLE `undo_log` (
`id` bigint NOT NULL AUTO_INCREMENT,
`branch_id` bigint NOT NULL,
`xid` varchar(100) NOT NULL,
`context` varchar(128) NOT NULL,
`rollback_info` longblob NOT NULL,
`log_status` int NOT NULL,
`log_created` datetime NOT NULL,
`log_modified` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
server端
1. seata下载 解压
2. 修改配置文件
-
file.conf
先将store里面mode改成db,然后将数据库的连接信息改成自己的 注意如果是mysql8版本以上的要将驱动改成
com.mysql.cj.jdbc.Driver
-
registry.conf
把registry 里面的type改成nacos
namespace改成nacos中的.
注意区分大小写
用户名密码填上
下面config也是一样 其他的不要可以删掉
3. 上传配置
之前我看一些文章中就是直接把配置复制到项目中的资源文件夹下面 后面看到其实也可以上传到nacos中去 效果都是一样的
在刚刚下载的seata源码中找到
配置
transport.type=TCP
transport.server=NIO
transport.heartbeat=true
transport.enableClientBatchSendRequest=false
transport.threadFactory.bossThreadPrefix=NettyBoss
transport.threadFactory.workerThreadPrefix=NettyServerNIOWorker
transport.threadFactory.serverExecutorThreadPrefix=NettyServerBizHandler
transport.threadFactory.shareBossWorker=false
transport.threadFactory.clientSelectorThreadPrefix=NettyClientSelector
transport.threadFactory.clientSelectorThreadSize=1
transport.threadFactory.clientWorkerThreadPrefix=NettyClientWorkerThread
transport.threadFactory.bossThreadSize=1
transport.threadFactory.workerThreadSize=default
transport.shutdown.wait=3
service.vgroupMapping.my_test_tx_group=default
service.default.grouplist=127.0.0.1:8091
service.enableDegrade=false
service.disableGlobalTransaction=false
client.rm.asyncCommitBufferLimit=10000
client.rm.lock.retryInterval=10
client.rm.lock.retryTimes=30
client.rm.lock.retryPolicyBranchRollbackOnConflict=true
client.rm.reportRetryCount=5
client.rm.tableMetaCheckEnable=false
client.rm.sqlParserType=druid
client.rm.reportSuccessEnable=false
client.rm.sagaBranchRegisterEnable=false
client.tm.commitRetryCount=5
client.tm.rollbackRetryCount=5
client.tm.degradeCheck=false
client.tm.degradeCheckAllowTimes=10
client.tm.degradeCheckPeriod=2000
store.mode=file
store.file.dir=file_store/data
store.file.maxBranchSessionSize=16384
store.file.maxGlobalSessionSize=512
store.file.fileWriteBufferCacheSize=16384
store.file.flushDiskMode=async
store.file.sessionReloadReadSize=100
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true
store.db.user=username
store.db.password=password
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
store.redis.host=127.0.0.1
store.redis.port=6379
store.redis.maxConn=10
store.redis.minConn=1
store.redis.database=0
store.redis.password=null
store.redis.queryLimit=100
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
client.undo.dataValidation=true
client.undo.logSerialization=jackson
client.undo.onlyCareUpdateColumns=true
server.undo.logSaveDays=7
server.undo.logDeletePeriod=86400000
client.undo.logTable=undo_log
client.log.exceptionRate=100
transport.serialization=seata
transport.compressor=none
metrics.enabled=false
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898
然后将数据库的连接信息修改成自己的
这里需要注意一个点就是 可能因为我是mysql8版本的 所以后面启动后要报一个乱码的错 后面说是什么时区问题 在url后面加上
?rewriteBatchedStatements=true&useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
这些就好啦
找到同目录下的nacos文件夹将这两个文件复制出来就行 放到seata目录下 可以直接双击运行上传
sh nacos-config.sh
可选参数
- -h localhost //指定地址
- -p 8848 //端口
- -g SEATA_GROUP //组名
- -t test //命名空间
- -u nacos //用户名
- -w nacos //密码
然后就能在配置中心中对应的命令空间里面看到配置信息 这里项目没启动 就不贴图了 配置也很多 有八页多 你也可以单独新开一个组存放
server端就配置好啦。
client端
client端配置
spring:
cloud:
alibaba:
seata:
tx-service-group: my_test_tx_group
seata:
tx-service-group: my_test_tx_group
registry:
type: nacos
nacos:
application: seata-server
server-addr: 127.0.0.1:8848
username: "nacos"
password: "nacos"
group: SEATA_GROUP
namespace:
cluster: default
config:
type: nacos
nacos:
server-addr: 127.0.0.1:8848
group: SEATA_GROUP
username: "nacos"
password: "nacos"
namespace:
然后将
@GlobalTransactional
加在需要使用的方法上
后话 之前还加过
DataSource
的代理配置啥的 这个可能是之前的一些东西了 现在就不需要了 后面学习的还是再去理解理解
问题&报错
[ main] i.s.c.r.netty.NettyClientChannelManager : no available service ‘null’ found, please make sure registry config correct
no available service ‘null’ found, please make sure registry config correct
这个问题从我集成以来就时不时出现一下 意思就是说未找到服务 这里就是注意一下
这两个地方一定要和Nacos中的配置对应上 我当时就是因为命名空间忘了区分大小写所以一直出问题 😭