记录自己的沙雕踩坑。
no available service ‘null’ found, please make sure registry config correct
springboot 2.2.2
springcloud alibaba 2.1.0
seata 1.0.0
nacos 1.3.0
运到问题,如果第一眼没有头绪的话,自然而然的就跑到百度上需求帮助了。但是,有时候问题是因为自己的奇葩操作引起的,很难在网上找到同样奇葩的人😂。所以查阅了一番,并没有找到跟自己的一样的,不过也通过一些文章找到了思路。
是它让我找到了思路
阅读了上面的文章后,我停止在百度上继续找答案,而是自己尝试从去源码中找答案。
通过日志,我找到了出现错误的类NettyClientChannelManager
void reconnect(String transactionServiceGroup) {
List<String> availList = null;
try {
availList = getAvailServerList(transactionServiceGroup);
} catch (Exception e) {
LOGGER.error("Failed to get available servers: {}", e.getMessage(), e);
return;
}
if (CollectionUtils.isEmpty(availList)) {
String serviceGroup = RegistryFactory.getInstance()
.getServiceGroup(transactionServiceGroup);
//就是在这里打印出的错误日志
LOGGER.error("no available service '{}' found, please make sure registry config correct", serviceGroup);
return;
}
....
}
从源码中我们可以看出,我们的错误日志是当availList为空时,才打印出来的。所以应该就是getAvailServerList(transactionServiceGroup);
这行代码返回空集合了,追踪进去。
private List<String> getAvailServerList(String transactionServiceGroup) throws Exception {
//getInstance()会找到对应的RegistryService,这与你在regitry.conf中配置的config.type有关,默认是file,支持nacos 、apollo、zk、consul、etcd3
List<InetSocketAddress> availInetSocketAddressList = RegistryFactory.getInstance()
.lookup(transactionServiceGroup);
if (CollectionUtils.isEmpty(availInetSocketAddressList)) {
return Collections.emptyList();
}
return availInetSocketAddressList.stream()
.map(NetUtil::toStringAddress)
.collect(Collectors.toList());
}
从代码中可以看出,它会去对应的RegistryService寻找配置信息。
registry.conf文件部分内容
config {
# file、nacos 、apollo、zk、consul、etcd3
type = "nacos"
}
起初我使用的也是file,但是看了那篇给我灵感的博客后,我修改成了nacos,所以在RegistryFactory.getInstance()
时返回给我的时Nacos的实例NacosRegistryServiceImpl
。
然后去Nacos中找对配置文件的时候,找不到,返回了空集合。想想也是,我并没有在Nacos中添加配置文件。
到这里,我突然明白我工程中的file.conf和registry.conf有什么用了,我当时还纳闷,seata的服务器端不是已经有这俩个文件了吗,为什么我工程里还要这俩个文件。
于是我将registry.conf文件中,配置文件类型重新改为file
config {
# file、nacos 、apollo、zk、consul、etcd3
type = "file"
}
然而。。。问题还是没解决。。
后来,我一不小心秒到了,ERROR日志下面的WARN。
怎么会找不到呢?我仔细检查了一翻配置文件信息。
我工程项目下面的file.conf文件:
service {
#transaction service group mapping
vgroup_mapping.my_test_tx_group = "fcp_tx_group"
}
呃呃呃,犯了个低级错误😥
service {
#transaction service group mapping
vgroup_mapping.fcp_tx_group= "default"
}
应该是这么写才对。
一句话总结,就是配置文件写错了,应该没有人和我犯一样的低级作物吧。
汗,真的是自己给自己制造麻烦
总之:
- 配置文件好好配
- 东西没搞清楚很难受
- 配置文件模板不要随便用别人的 ,因为不一样的版本,配置文件可能也不相同,尽量去官网中找对应版本的配置文件