如果你通过官方文档的指导来搭建springCloud+nacos或者nacos+seata那么应该还算有比较多现成的案例和指导,但是如果是要将三者组合起来就不太容易找到现成的文档指引。这篇文章就是我踩坑之后总结的一些内容,希望对大家有帮助(适合新手入门)
先写一下正确的示例,踩的坑后面再说。
nacos服务端的部署就不说了,没有需要特别注意的。
说一下seata服务端的部署,我们修改registry.conf文件内容如下:
registry {
# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
type = "nacos"
nacos {
application = "seata-server"
serverAddr = "192.168.10.1:8848"
#group = "SEATA_GROUP"
namespace = ""
cluster = "default"
username = ""
password = ""
}
}
config {
# file、nacos 、apollo、zk、consul、etcd3
type = "nacos"
nacos {
serverAddr = "192.168.10.1:8848"
namespace = ""
group = "SEATA_GROUP"
username = ""
password = ""
dataId = "seataServer"
}
}
如上,我们将seata-server的配置和注册均交给nacos管理(register.conf文件中默认还有一些redis,zk的代码块,那些内容可以忽略甚至删除)。
如上seata-server将从192.168.10.1:8848中去读取配置文件,所以我们再nacos中新建如下配置文件:
具体的配置信息如下:
transport.type=TCP
transport.server=NIO
transport.heartbeat=true
transport.enableClientBatchSendRequest=true
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
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.tableMetaCheckerInterval=60000
client.rm.sqlParserType=druid
client.rm.reportSuccessEnable=false
client.rm.sagaBranchRegisterEnable=false
client.rm.sagaJsonParser=fastjson
client.rm.tccActionInterceptorOrder=-2147482648
client.tm.commitRetryCount=5
client.tm.rollbackRetryCount=5
client.tm.defaultGlobalTransactionTimeout=60000
client.tm.degradeCheck=false
client.tm.degradeCheckAllowTimes=10
client.tm.degradeCheckPeriod=2000
client.tm.interceptorOrder=-2147482648
store.mode=db
store.lock.mode=file
store.session.mode=file
store.publicKey=
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=hikari
store.db.dbType=mysql
store.db.driverClassName=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://192.168.77.62/seata?useUnicode=true&rewriteBatchedStatements=true
store.db.user=mysqluser
store.db.password=mysqlPassword
store.db.minConn=5
store.db.maxConn=30
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.distributedLockTable=distributed_lock
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.distributedLockExpireTime=10000
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.undo.compress.enable=true
client.undo.compress.type=zip
client.undo.compress.threshold=64k
log.exceptionRate=100
transport.serialization=seata
transport.compressor=none
metrics.enabled=false
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898
tcc.fence.logTableName=tcc_fence_log
tcc.fence.cleanPeriod=1h
需要重点注意的是:seata-server的配置文件一定要是properties格式的,至于yml等格式我并未做测试,还有一点因为我在nacos中配置的dataId(也可以理解为配置文件的文件名)为“seatService”。通过debug源码可以看到,客户端的nacos组件是通过该dataId的后缀名来解析数据格式的,比如dataId为"aa.properties",这会将该dataId的内容以properties的格式进行解析;比如dataId为"aa.yml",这会将该dataId的内容以yml的格式进行解析。如果dataId没有后缀就默认以properties的方式进行解析。当然,在nacos中配置选择“配置格式”时,最好能和文件内容和后缀保持一致,虽然我也不知道那个属性在哪里会被用到。
另外,我这个配置文件也是从官网找的,我也只修改了store.mode=db以及db的配置信息,其他配置暂时还没来得及研究。
另外有一点也需要注意,如果你部署seata-server的机器有多网卡,为避免向nacos注册服务实例时使用的是错误的IP,那么就需要用在启动命令里加一个-h的参数:“./seat-server.sh -h 172.168.18.1”。我也曾尝试在配置文件中添加类似ip-prefix之类的参数,但是最终都失败了,通过查看代码基本可以确定只有这一种方式可以指定注册IP了,如果大家发现有其他的方法可以留言给我,不甚感激。
至此,就可以尝试启动seata-server了,如果在日志中能看到有数据库的配置信息,那基本可以确定已经成功从nacos中读取到配置文件了,启动完成之后如果能在nacos的查看到注册的服务,这表示seat-server的服务也注册成功了:
点进入可以看到集群名字和IP,一定要特别留意这两个值,我就曾经被坑的很惨(大概就是default的大小写不一致,以及注册的IP是另外一张网卡地址)
至此,seata-server就算已经搭建完成了,接下来开始讲解重头戏:acctService的配置(前面忘记讲了,我搭的服务有两个模块:acctService和storageService,acctService为client端,会调用storageService,此处会用到分布式事务)
先写到这,休息下在写–2021/11/26 16:49