记 Nacos 分布式事务Seata1.3的集成

  • Post author:
  • Post category:其他



最近在做一个新项目需要用到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. 修改配置文件

  1. file.conf

    先将store里面mode改成db,然后将数据库的连接信息改成自己的 注意如果是mysql8版本以上的要将驱动改成

    com.mysql.cj.jdbc.Driver


    在这里插入图片描述
  2. 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中的配置对应上 我当时就是因为命名空间忘了区分大小写所以一直出问题 😭



版权声明:本文为qq_40629521原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。