Nacos集群模式下服務(wù)無(wú)法注冊(cè)問(wèn)題
Nacos集群模式下服務(wù)無(wú)法注冊(cè)
一、環(huán)境
1、服務(wù)器:騰訊云 CentOS 7.2 64位 機(jī)器三臺(tái)
2、JDK1.8.0_151(由于nacos必須1.8以上),1.8以下會(huì)有啟動(dòng)問(wèn)題,務(wù)必升級(jí)
3、nacos版本0.8.0
二、nacos服務(wù)端搭建
基本按照官網(wǎng)文檔就能搭建起來(lái),另外按照官網(wǎng)文檔修改
了cluster.conf,添加了三臺(tái)機(jī)器的IP(172.XX.XX.14:8848, 172.XX.XX.7:8848, 172.XX.XX.14:8848),啟動(dòng)發(fā)現(xiàn)報(bào)錯(cuò)
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)
不理它,先把報(bào)錯(cuò)的IP加上后,啟動(dòng)成功。
三、服務(wù)注冊(cè)
此時(shí)啟動(dòng)服務(wù)應(yīng)用進(jìn)行服務(wù)注冊(cè),發(fā)現(xiàn)報(bào)如下錯(cuò)誤:
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)
服務(wù)端應(yīng)用啟動(dòng)報(bào)調(diào)用服務(wù)注冊(cè)失敗,但nacos服務(wù)后臺(tái)三臺(tái)機(jī)器均啟動(dòng)成功,且后臺(tái)能正常進(jìn)入,通過(guò)URL訪問(wèn)/nacos/v1/ns/instance,也是能正常訪問(wèn)。實(shí)在無(wú)解,調(diào)試代碼
四、問(wèn)題追蹤
根據(jù)調(diào)試發(fā)現(xiàn),走到了no leader now,遂懷疑nacos注冊(cè)中心并未啟動(dòng)成功,之前在cluster.conf中添加的118.XX.XX.52:8848并未解決真正的問(wèn)題,所以還是不要偷懶,發(fā)現(xiàn)問(wèn)題就要找到真實(shí)原因,以免把真實(shí)原因給蓋掉了
Loggers.RAFT.info("I'm not leader, will proxy to leader."); if (RaftCore.getLeader() == null) { throw new IllegalArgumentException("no leader now."); }
后端日志里確實(shí)也打印了這個(gè)warning,日志在naming-raft.log中
然后開(kāi)始調(diào)試nacos服務(wù)代碼,通過(guò)調(diào)試發(fā)現(xiàn)nacos注冊(cè)中心在啟動(dòng)時(shí)會(huì)通過(guò)NetUtils類中InetAddress.getLocalHost()去獲取本機(jī)的IP地址,但這個(gè)IP(118.XX.XX.52:8848)并不是本機(jī)IP,導(dǎo)致了本機(jī)IP不正確,注冊(cè)中心并沒(méi)加載成功
翻閱下文檔:
深層的原因: 在大多數(shù)Linux操作系統(tǒng)中,都是以/etc/hosts中的配置查找主機(jī)名的而Java 的InetAddress.java 調(diào)用 InetAddressImpl.java 的 public native String getLocalHostName() throws UnknownHostException; 來(lái)獲取本地主機(jī)名, Java 的這個(gè)方法是native的,是本地系統(tǒng)的一個(gè)實(shí)現(xiàn),此時(shí)根據(jù)本地/etc/hostname文件中的機(jī)器名來(lái)獲取本機(jī)IP,然而這個(gè)IP并不是這臺(tái)機(jī)器的內(nèi)網(wǎng)IP,那這個(gè)IP是哪里來(lái)的?
查找到騰訊云相關(guān)配置地方,都沒(méi)有這個(gè)IP,以及在機(jī)器上也沒(méi)找到,后來(lái)通過(guò)PING本機(jī)名獲取到了以上報(bào)錯(cuò)的IP,猜測(cè)這個(gè)IP是騰訊云統(tǒng)一分配的,而且生產(chǎn)的機(jī)器PING出來(lái)的結(jié)果也一樣。
五、解決
1. 設(shè)置本機(jī)名稱:/etc/hostname mName 最好不是寫(xiě)IP地址的形式,若寫(xiě)則必須是本機(jī)的完全I(xiàn)P形式(不要只寫(xiě)一半),如果有就不用設(shè)置了
2. 在/etc/hosts里加一行 本機(jī)IP mName
3. 重啟注冊(cè)中心,注冊(cè)中心啟動(dòng)成功,發(fā)現(xiàn)不報(bào)java.lang.IllegalStateException: unable to find local peer: 118.XX.XX.52:8848這個(gè)錯(cuò)誤了,且通過(guò)調(diào)試發(fā)現(xiàn),IP確實(shí)也正確了
4. 修改cluster.conf去掉了118.XX.XX.52:8848,重啟服務(wù)應(yīng)用進(jìn)行注冊(cè),服務(wù)注冊(cè)成功
服務(wù)沒(méi)有注冊(cè)到nacos的原因分析
因?yàn)闆](méi)有加上版本號(hào),導(dǎo)致不能注冊(cè)。
? ? <dependency> ? ? ? ? <groupId>org.springframework.cloud</groupId> ? ? ? ? <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> ? ? ? ? <version>0.2.1.RELEASE</version> ? ? </dependency>
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
如何自定義hibernate validation注解示例代碼
Hibernate Validator 是 Bean Validation 的參考實(shí)現(xiàn) . Hibernate Validator 提供了 JSR 303 規(guī)范中所有內(nèi)置 constraint 的實(shí)現(xiàn),下面這篇文章主要給大家介紹了關(guān)于如何自定義hibernate validation注解的相關(guān)資料,需要的朋友可以參考下2018-04-04Java使用線程池實(shí)現(xiàn)socket編程的方法詳解
這篇文章主要為大家詳細(xì)介紹了Java使用線程池實(shí)現(xiàn)socket編程的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03java中rss解析器(rome.jar和jdom.jar)示例
這篇文章主要介紹了java中rss解析器(rome.jar和jdom.jar)示例,需要的朋友可以參考下2014-03-03