踩坑 seata: no available service ‘null‘ found, please make sure registry config correct

记录自己的沙雕踩坑。

no available service ‘null’ found, please make sure registry config correct
踩坑 seata: no available service ‘null‘ found, please make sure registry config correct_第1张图片
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的服务器端不是已经有这俩个文件了吗,为什么我工程里还要这俩个文件。
踩坑 seata: no available service ‘null‘ found, please make sure registry config correct_第2张图片

于是我将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"
}

应该是这么写才对。

一句话总结,就是配置文件写错了,应该没有人和我犯一样的低级作物吧。

汗,真的是自己给自己制造麻烦


总之:

  • 配置文件好好配
  • 东西没搞清楚很难受
  • 配置文件模板不要随便用别人的 ,因为不一样的版本,配置文件可能也不相同,尽量去官网中找对应版本的配置文件

你可能感兴趣的:(springcloud,踩坑,spring,cloud)