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):

# 事務組映射關系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