Nacos集群模式下服务无法注册问题

 更新时间:2022年01月07日 11:30:19   作者:hwk1986  
这篇文章主要介绍了Nacos集群模式下服务无法注册问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Nacos集群模式下服务无法注册

一、环境

1、服务器:腾讯云 CentOS 7.2 64位 机器三台

2、JDK1.8.0_151(由于nacos必须1.8以上),1.8以下会有启动问题,务必升级

3、nacos版本0.8.0

二、nacos服务端搭建

基本按照官网文档就能搭建起来,另外按照官网文档修改
了cluster.conf,添加了三台机器的IP(172.XX.XX.14:8848, 172.XX.XX.7:8848, 172.XX.XX.14:8848),启动发现报错

java.lang.IllegalStateException: unable to find local peer: 118.XX.XX.52:8848, all peers: [172.XX.XX.14:8848, 172.XX.XX.7:8848, 172.XX.XX.14:8848]
        at com.alibaba.nacos.naming.raft.PeerSet.local(PeerSet.java:191)
        at com.alibaba.nacos.naming.monitor.PerformanceLoggerThread.collectmetrics(PerformanceLoggerThread.java:114)
        at sun.reflect.GeneratedMethodAccessor74.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)

不理它,先把报错的IP加上后,启动成功。

三、服务注册

此时启动服务应用进行服务注册,发现报如下错误:

java.lang.IllegalStateException: failed to req API:/nacos/v1/ns/instance after all servers([172.XX.XX.23:80]) tried
        at com.alibaba.nacos.client.naming.net.NamingProxy.reqAPI(NamingProxy.java:335)
        at com.alibaba.nacos.client.naming.net.NamingProxy.reqAPI(NamingProxy.java:267)
        at com.alibaba.nacos.client.naming.net.NamingProxy.registerService(NamingProxy.java:167)
        at com.alibaba.nacos.client.naming.NacosNamingService.registerInstance(NacosNamingService.java:170)
        at org.springframework.cloud.alibaba.nacos.registry.NacosServiceRegistry.register(NacosServiceRegistry.java:56)
        at org.springframework.cloud.alibaba.nacos.registry.NacosServiceRegistry.register(NacosServiceRegistry.java:29)
        at org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration.register(AbstractAutoServiceRegistration.java:209)
        at org.springframework.cloud.alibaba.nacos.registry.NacosAutoServiceRegistration.register(NacosAutoServiceRegistration.java:75)
        at org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration.start(AbstractAutoServiceRegistration.java:108)
        at org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration.bind(AbstractAutoServiceRegistration.java:73)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)

服务端应用启动报调用服务注册失败,但nacos服务后台三台机器均启动成功,且后台能正常进入,通过URL访问/nacos/v1/ns/instance,也是能正常访问。实在无解,调试代码

四、问题追踪

根据调试发现,走到了no leader now,遂怀疑nacos注册中心并未启动成功,之前在cluster.conf中添加的118.XX.XX.52:8848并未解决真正的问题,所以还是不要偷懒,发现问题就要找到真实原因,以免把真实原因给盖掉了

Loggers.RAFT.info("I'm not leader, will proxy to leader.");
            if (RaftCore.getLeader() == null) {
                throw new IllegalArgumentException("no leader now.");
            }

后端日志里确实也打印了这个warning,日志在naming-raft.log中

在这里插入图片描述

然后开始调试nacos服务代码,通过调试发现nacos注册中心在启动时会通过NetUtils类中InetAddress.getLocalHost()去获取本机的IP地址,但这个IP(118.XX.XX.52:8848)并不是本机IP,导致了本机IP不正确,注册中心并没加载成功

翻阅下文档:

深层的原因: 在大多数Linux操作系统中,都是以/etc/hosts中的配置查找主机名的而Java 的InetAddress.java 调用 InetAddressImpl.java 的 public native String getLocalHostName() throws UnknownHostException; 来获取本地主机名, Java 的这个方法是native的,是本地系统的一个实现,此时根据本地/etc/hostname文件中的机器名来获取本机IP,然而这个IP并不是这台机器的内网IP,那这个IP是哪里来的?

查找到腾讯云相关配置地方,都没有这个IP,以及在机器上也没找到,后来通过PING本机名获取到了以上报错的IP,猜测这个IP是腾讯云统一分配的,而且生产的机器PING出来的结果也一样。

五、解决

1. 设置本机名称:/etc/hostname   mName     最好不是写IP地址的形式,若写则必须是本机的完全IP形式(不要只写一半),如果有就不用设置了

2. 在/etc/hosts里加一行 本机IP mName

3. 重启注册中心,注册中心启动成功,发现不报java.lang.IllegalStateException: unable to find local peer: 118.XX.XX.52:8848这个错误了,且通过调试发现,IP确实也正确了

4. 修改cluster.conf去掉了118.XX.XX.52:8848,重启服务应用进行注册,服务注册成功

服务没有注册到nacos的原因分析

因为没有加上版本号,导致不能注册。

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>0.2.1.RELEASE</version>
    </dependency>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 如何自定义hibernate validation注解示例代码

    如何自定义hibernate validation注解示例代码

    Hibernate Validator 是 Bean Validation 的参考实现 . Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,下面这篇文章主要给大家介绍了关于如何自定义hibernate validation注解的相关资料,需要的朋友可以参考下
    2018-04-04
  • Java反射机制及Method.invoke详解

    Java反射机制及Method.invoke详解

    这篇文章主要介绍了Java反射机制及Method.invoke详解,本文讲解了JAVA反射机制、得到某个对象的属性、得到某个类的静态属性、执行某对象的方法、执行某个类的静态方法等内容,需要的朋友可以参考下
    2015-03-03
  • Java使用线程池实现socket编程的方法详解

    Java使用线程池实现socket编程的方法详解

    这篇文章主要为大家详细介绍了Java使用线程池实现socket编程的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • JVM中最耗cpu的线程查找方法

    JVM中最耗cpu的线程查找方法

    这篇文章主要为大家介绍了JVM中最耗cpu的线程查找方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Mapreduce分布式并行编程

    Mapreduce分布式并行编程

    这篇文章主要为大家介绍了Mapreduce分布式并行编程使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Java的后台文件夹下文件的遍历完整代码

    Java的后台文件夹下文件的遍历完整代码

    这篇文章主要介绍了Java的后台文件夹下文件的遍历完整代码,首先分享了java中遍历一个文件夹里边的所有文件,然后介绍了用Java遍历一个文件夹并获取它里面的所有内容详细代码,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • JavaWeb文件上传与下载功能解析

    JavaWeb文件上传与下载功能解析

    这篇文章主要为大家详细介绍了JavaWeb文件上传与下载功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • 学习Java中Class类及其用法

    学习Java中Class类及其用法

    这篇文章分为三大部分,主要内容有Class类原理详解、用法及泛化,需要的朋友可以参考下
    2015-07-07
  • java中rss解析器(rome.jar和jdom.jar)示例

    java中rss解析器(rome.jar和jdom.jar)示例

    这篇文章主要介绍了java中rss解析器(rome.jar和jdom.jar)示例,需要的朋友可以参考下
    2014-03-03
  • Java中IO的NIO通道解析

    Java中IO的NIO通道解析

    这篇文章主要介绍了Java中IO的NIO通道解析,NIO 提供了与传统 BIO 模型中的 Socket 和 ServerSocket 相对应的 SocketChannel 和 ServerSocketChannel 两种不同的套接字通道实现,需要的朋友可以参考下
    2024-01-01

最新评论