1.模拟异地容灾的TC集群
计划启动两台seata的tc服务节点,分别代表上海和杭州集群:
| 节点名称 | ip地址(具体IP) | 端口号 | 集群名称 |
| -------- | ------------- | ------ | -------- |
| seata | 192.168.8.118 | 8091 | SH |
| seata2 | 192.168.8.118 | 8092 | HZ |
之前我们已经启动了一台seata服务,端口是8091,集群名为SH(注:192.168.8.118用tajia-nacos替代,在host配置)。
现在,将seata目录复制一份,起名为seata-server-2,代表杭州集群
修改seata-server-2/conf/registry.conf内容如下:
registry {
# tc服务的注册中心类,这里选择nacos,也可以是eureka、zookeeper等
# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
type = "nacos"
nacos {
application = "seata-tc-server"
serverAddr = "tajia-nacos:8848"
group = "SEATA_GROUP"
namespace = ""
cluster = "HZ"
username = "nacos"
password = "nacos"
}
}
config {
# 读取tc服务端的配置文件的方式,这里是从nacos配置中心读取,这样如果tc是集群,可以共享配置
# file、nacos 、apollo、zk、consul、etcd3
type = "nacos"
# 配置nacos地址等信息
nacos {
serverAddr = "tajia-nacos:8848"
namespace = ""
group = "SEATA_GROUP"
username = "nacos"
password = "nacos"
dataId = "seataServer.properties"
}
}
进入seata2/bin目录,然后运行命令:
D:/dev/seata-server-2/bin/seata-server.bat -p 8092
打开nacos控制台,查看服务列表:
点进详情查看:
2.将事务组映射配置到nacos
接下来,我们需要将tx-service-group与cluster的映射关系都配置到nacos配置中心。
配置的内容如下(client.properties):
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 事务组映射关系SH、HZ
service.vgroupMapping.seata-demo=SH
service.enableDegrade=false
service.disableGlobalTransaction=false
# 与TC服务的通信配置
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
# RM配置
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
# TM配置
client.tm.commitRetryCount=5
client.tm.rollbackRetryCount=5
client.tm.defaultGlobalTransactionTimeout=60000
client.tm.degradeCheck=false
client.tm.degradeCheckAllowTimes=10
client.tm.degradeCheckPeriod=2000
# undo日志配置
client.undo.dataValidation=true
client.undo.logSerialization=jackson
client.undo.onlyCareUpdateColumns=true
client.undo.logTable=undo_log
client.undo.compress.enable=true
client.undo.compress.type=zip
client.undo.compress.threshold=64k
client.log.exceptionRate=100
3.微服务读取nacos配置
接下来,需要修改每一个微服务的application.yml文件,让微服务读取nacos中的client.properties文件:
seata:
config:
type: nacos
nacos:
server-addr: tajia-nacos:8848
username: nacos
password: nacos
group: SEATA_GROUP
data-id: client.properties
seata完整配置如下:
seata:
registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址
# 参考tc服务自己的registry.conf中的配置
type: nacos
nacos: # tc
server-addr: tajia-nacos:8848
namespace: ""
group: SEATA_GROUP
application: seata-tc-server # tc服务在nacos中的服务名称
tx-service-group: seata-demo # 事务组,根据这个获取tc服务的cluster名称
#service:
# vgroup-mapping: # 事务组与TC服务cluster的映射关系
# seata-demo: SH
config:
type: nacos
nacos:
server-addr: tajia-nacos:8848
username: nacos
password: nacos
group: SEATA_GROUP
data-id: client.properties
重启微服务,现在微服务到底是连接tc的SH集群,还是tc的HZ集群,统一由nacos的client.properties来决定。
nacos配置的service.vgroupMapping.seata-demo是SH集群,此时观察微服务和seata-server控制台的日志信息,切换service.vgroupMapping.seata-demo,微服务和seata-server控制台是否也跟着变化。
storage-service、account-service、order-service控制台日志已连接到8091:
10-14 16:32:10:625 INFO 10816 --- [eoutChecker_1_1] i.s.c.r.netty.NettyClientChannelManager : will connect to 192.168.8.118:8091
10-14 16:32:10:628 INFO 10816 --- [eoutChecker_1_1] i.s.core.rpc.netty.NettyPoolableFactory : NettyPool create channel to transactionRole:TMROLE,address:192.168.8.118:8091,msg:< RegisterTMRequest{applicationId='account-service', transactionServiceGroup='seata-demo'} >
10-14 16:32:10:649 INFO 10816 --- [eoutChecker_1_1] i.s.c.rpc.netty.TmNettyRemotingClient : register TM success. client version:1.4.2, server version:1.4.2,channel:[id: 0xa0e148c9, L:/192.168.8.118:65201 - R:/192.168.8.118:8091]
10-14 16:32:10:649 INFO 10816 --- [eoutChecker_1_1] i.s.core.rpc.netty.NettyPoolableFactory : register success, cost 12 ms, version:1.4.2,role:TMROLE,channel:[id: 0xa0e148c9, L:/192.168.8.118:65201 - R:/192.168.8.118:8091]
端口8091的seata-server打印如下信息:
16:32:10.646 INFO --- [ttyServerNIOWorker_1_4_32] i.s.c.r.processor.server.RegTmProcessor : TM register success,message:RegisterTMRequest{applicationId='account-service', transactionServiceGroup='seata-demo'},channel:[id: 0x27316e88, L:/192.168.8.118:8091 - R:/192.168.8.118:65201],client version:1.4.2
16:32:14.902 INFO --- [ttyServerNIOWorker_1_5_32] i.s.c.r.processor.server.RegTmProcessor : TM register success,message:RegisterTMRequest{applicationId='storage-service', transactionServiceGroup='seata-demo'},channel:[id: 0xcf3862b2, L:/192.168.8.118:8091 - R:/192.168.8.118:65206],client version:1.4.2
16:32:55.114 INFO --- [ttyServerNIOWorker_1_6_32] i.s.c.r.processor.server.RegTmProcessor : TM register success,message:RegisterTMRequest{applicationId='order-service', transactionServiceGroup='seata-demo'},channel:[id: 0x137960bb, L:/192.168.8.118:8091 - R:/192.168.8.118:65248],client version:1.4.2
编辑nacos的client.properties配置文件,把service.vgroupMapping.seata-demo设置为HZ,微服务和seata-server控制台是否连接到8092这台seata-server。
storage-service、account-service、order-service控制台日志已连接到8092:
10-14 16:32:10:625 INFO 10816 --- [eoutChecker_1_1] i.s.c.r.netty.NettyClientChannelManager : will connect to 192.168.8.118:8091
10-14 16:32:10:628 INFO 10816 --- [eoutChecker_1_1] i.s.core.rpc.netty.NettyPoolableFactory : NettyPool create channel to transactionRole:TMROLE,address:192.168.8.118:8091,msg:< RegisterTMRequest{applicationId='account-service', transactionServiceGroup='seata-demo'} >
10-14 16:32:10:649 INFO 10816 --- [eoutChecker_1_1] i.s.c.rpc.netty.TmNettyRemotingClient : register TM success. client version:1.4.2, server version:1.4.2,channel:[id: 0xa0e148c9, L:/192.168.8.118:65201 - R:/192.168.8.118:8091]
10-14 16:32:10:649 INFO 10816 --- [eoutChecker_1_1] i.s.core.rpc.netty.NettyPoolableFactory : register success, cost 12 ms, version:1.4.2,role:TMROLE,channel:[id: 0xa0e148c9, L:/192.168.8.118:65201 - R:/192.168.8.118:8091]
10-14 16:33:27:778 INFO 10816 --- [h_RMROLE_1_1_32] i.s.c.r.p.client.RmUndoLogProcessor : rm handle undo log process:UndoLogDeleteRequest{resourceId='deduct', saveDays=7, branchType=AT}
10-14 16:33:27:778 WARN 10816 --- [h_RMROLE_1_1_32] io.seata.rm.RMHandlerAT : Failed to get dataSourceProxy for delete undolog on deduct
10-14 16:45:30:628 INFO 10816 --- [eoutChecker_1_1] i.s.c.r.netty.NettyClientChannelManager : will connect to 192.168.8.118:8092
10-14 16:45:30:629 INFO 10816 --- [eoutChecker_1_1] i.s.core.rpc.netty.NettyPoolableFactory : NettyPool create channel to transactionRole:TMROLE,address:192.168.8.118:8092,msg:< RegisterTMRequest{applicationId='account-service', transactionServiceGroup='seata-demo'} >
10-14 16:45:30:636 INFO 10816 --- [eoutChecker_1_1] i.s.c.rpc.netty.TmNettyRemotingClient : register TM success. client version:1.4.2, server version:1.4.2,channel:[id: 0x5c2d7ddb, L:/192.168.8.118:59674 - R:/192.168.8.118:8092]
10-14 16:45:30:636 INFO 10816 --- [eoutChecker_1_1] i.s.core.rpc.netty.NettyPoolableFactory : register success, cost 5 ms, version:1.4.2,role:TMROLE,channel:[id: 0x5c2d7ddb, L:/192.168.8.118:59674 - R:/192.168.8.118:8092]
10-14 16:45:30:683 INFO 10816 --- [eoutChecker_2_1] i.s.c.r.netty.NettyClientChannelManager : will connect to 192.168.8.118:8092
10-14 16:45:30:683 INFO 10816 --- [eoutChecker_2_1] i.s.c.rpc.netty.RmNettyRemotingClient : RM will register :deduct,jdbc:mysql://tajia-mysql:33064/seata_demo
10-14 16:45:30:684 INFO 10816 --- [eoutChecker_2_1] i.s.core.rpc.netty.NettyPoolableFactory : NettyPool create channel to transactionRole:RMROLE,address:192.168.8.118:8092,msg:< RegisterRMRequest{resourceIds='deduct,jdbc:mysql://tajia-mysql:33064/seata_demo', applicationId='account-service', transactionServiceGroup='seata-demo'} >
10-14 16:45:30:697 INFO 10816 --- [eoutChecker_2_1] i.s.c.rpc.netty.RmNettyRemotingClient : register RM success. client version:1.4.2, server version:1.4.2,channel:[id: 0x82653d6a, L:/192.168.8.118:59675 - R:/192.168.8.118:8092]
10-14 16:45:30:698 INFO 10816 --- [eoutChecker_2_1] i.s.core.rpc.netty.NettyPoolableFactory : register success, cost 7 ms, version:1.4.2,role:RMROLE,channel:[id: 0x82653d6a, L:/192.168.8.118:59675 - R:/192.168.8.118:8092]
端口8092的seata-server打印如下信息:
16:30:31.541 INFO --- [ main] i.s.core.rpc.netty.NettyServerBootstrap : Server started, listen port: 8092
16:45:24.980 INFO --- [ttyServerNIOWorker_1_1_32] i.s.c.r.processor.server.RegTmProcessor : TM register success,message:RegisterTMRequest{applicationId='storage-service', transactionServiceGroup='seata-demo'},channel:[id: 0x4e4ca573, L:/192.168.8.118:8092 - R:/192.168.8.118:59664],client version:1.4.2
16:45:24.977 INFO --- [rverHandlerThread_1_1_500] i.s.c.r.processor.server.RegRmProcessor : RM register success,message:RegisterRMRequest{resourceIds='jdbc:mysql://tajia-mysql:33064/seata_demo', applicationId='storage-service', transactionServiceGroup='seata-demo'},channel:[id: 0x18202467, L:/192.168.8.118:8092 - R:/192.168.8.118:59665],client version:1.4.2
16:45:25.112 INFO --- [ttyServerNIOWorker_1_3_32] i.s.c.r.processor.server.RegTmProcessor : TM register success,message:RegisterTMRequest{applicationId='order-service', transactionServiceGroup='seata-demo'},channel:[id: 0x17661c36, L:/192.168.8.118:8092 - R:/192.168.8.118:59667],client version:1.4.2
16:45:25.177 INFO --- [rverHandlerThread_1_2_500] i.s.c.r.processor.server.RegRmProcessor : RM register success,message:RegisterRMRequest{resourceIds='jdbc:mysql://tajia-mysql:33064/seata_demo', applicationId='order-service', transactionServiceGroup='seata-demo'},channel:[id: 0x9a0e8269, L:/192.168.8.118:8092 - R:/192.168.8.118:59668],client version:1.4.2
16:45:30.635 INFO --- [ttyServerNIOWorker_1_5_32] i.s.c.r.processor.server.RegTmProcessor : TM register success,message:RegisterTMRequest{applicationId='account-service', transactionServiceGroup='seata-demo'},channel:[id: 0x02348d6e, L:/192.168.8.118:8092 - R:/192.168.8.118:59674],client version:1.4.2
16:45:30.696 INFO --- [rverHandlerThread_1_3_500] i.s.c.r.processor.server.RegRmProcessor : RM register success,message:RegisterRMRequest{resourceIds='deduct,jdbc:mysql://tajia-mysql:33064/seata_demo', applicationId='account-service', transactionServiceGroup='seata-demo'},channel:[id: 0xd07a4236, L:/192.168.8.118:8092 - R:/192.168.8.118:59675],client version:1.4.2