我们用的Seata版本是1.2 springcloud版本是springcloud hoxton.SR3
先记录下这个错的方法所在地,调用链是在Seata-all-1.2.0.jar
io.seata.core.rpc.netty.TmRpcClient.init() ->io.seata.core.rpc.netty.AbstractRpcRemotingClient.init()的reconnect(AbstractRpcRemotingClient.this.getTransactionServiceGroup())方法里
availList是从getAvailServerList方法获取,该方法调用链
io.seata.core.rpc.netty.NettyClientChannelManager.getAvailServerList.getAvailServerList
->RegistryFactory.getInstance().lookup()
->NacosRegistryServiceImpl.lookup() 因为我是使用Nacos做为注册中心所以这里调用的是NocosRegisterServiceImpl
->RegistryService.getServiceGroup 这里的参数Key就是tx-service-group的值 然后会拼成service.vgroupMapping.+key 就是完整的属性名 然后会根据完整属性名去获取值,再根据值去拿到对应的服务列表
根据这个调用链,会报这个错就是因为根据完整的属性名找不到对应的属性,所以更无法根据属性值去拿服务列表。
根据我打的断点,我发现在启动时
TmRpcClient.getInstance这个方法获取到的transactionServiceGroup还是我配置的那个,比如说my_test_tx_group
然后到了io.seata.core.rpc.netty.AbstractRpcRemotingClient.init()的reconnect(AbstractRpcRemotingClient.this.getTransactionServiceGroup()) 这一步时,
AbstractRpcRemotingClient.this.getTransactionServiceGroup()获取的值就已经变成服务名+“seata-service-group" 所以到这里,比如说服务名叫trade 完整的属性名就变成service.vgroupMapping.trade -seata-service-group
虽然nacos里seata的配置属性列表中也有service.vgroupMapping.trade -seata-service-group,这个属性也有值,但他还是会报这个错
上面transactionServiceGroup的变化在seata正常的服务里,是不会变的,只有在报这个错的服务里才有,所以我估计中间是有什么判断逻辑。
以上是发现到的现象。下面是解决方案,原先只是加了register,后面加了config就不会再报这个问题了
seata:
enabled: true
enable-auto-data-source-proxy: true
registry:
type: nacos
nacos:
server-addr: seata的服务器端口
namespace: pre
#config就是新加的
config:
type: nacos
nacos:
server-addr: seata的服务器端口
namespace: seata