nacos服務(wù)無(wú)法注冊(cè)到nacos服務(wù)中心問(wèn)題及解決
簡(jiǎn)介
1、程序在本機(jī)用啟動(dòng)類啟動(dòng),服務(wù)可以正常注冊(cè)到nacos
2、程序在Linux服務(wù)器用tomcat啟動(dòng),服務(wù)無(wú)法注冊(cè)到nacos
依賴
<!--客戶端負(fù)載均衡loadbalancer-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>4.1.3</version>
</dependency>
<!-- nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${spring-cloud-alibaba.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${spring-cloud-alibaba.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>${spring-cloud-bootstrap.version}</version>
</dependency>
<!-- sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>${spring-cloud-alibaba.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>${spring-cloud-openfeign.version}</version>
</dependency>
異常情況
服務(wù)啟動(dòng)后無(wú)法注冊(cè)到服務(wù)中心

排查
1、檢查本機(jī)與Linux服務(wù)器程序配置文件是否存在差異,導(dǎo)致服務(wù)無(wú)法注冊(cè)
結(jié)果:配置完全相同
2、查看Linux日志,發(fā)現(xiàn)程序?qū)acos配置文件的讀取是正常的,可以正常訪問(wèn)nacos的配置中心讀取配置文件
結(jié)果:nacos配置文件可以讀取,服務(wù)無(wú)法注冊(cè)到nacos
3、查看Linux服務(wù)器其他程序是否可以注冊(cè)到nacos
結(jié)果:同一臺(tái)Linux服務(wù)器其他程序可以正常注冊(cè)到nacos
4、查看可以正常注冊(cè)的程序,使用的依賴版本與當(dāng)前無(wú)法注冊(cè)的程序依賴版本是否一致
結(jié)果:openFeign、Nacos、Spring Cloud、Spring Boot依賴版本完全一致
5、將當(dāng)前程序tomcat放到其他Linux服務(wù)器啟動(dòng),服務(wù)依舊無(wú)法注冊(cè)到nacos
結(jié)果:排除是Linux服務(wù)器本身的問(wèn)題
6、將程序放到可以正常注冊(cè)的程序所在的tomcat
結(jié)果:原先可以正常注冊(cè)的程序依舊正常,當(dāng)前程序還是無(wú)法正常注冊(cè)到nacos,排除tomcat的問(wèn)題
斷點(diǎn)調(diào)試
1、本機(jī)用啟動(dòng)類啟動(dòng)服務(wù),可以正常觸發(fā)AbstractAutoServiceRegistration監(jiān)聽的WebServerInitializedEvent事件,會(huì)執(zhí)行服務(wù)注冊(cè)邏輯onApplicationEvent()
2、Linux服務(wù)器tomcat啟動(dòng),無(wú)法觸發(fā)AbstractAutoServiceRegistration監(jiān)聽的WebServerInitializedEvent事件,沒(méi)有執(zhí)行服務(wù)注冊(cè)邏輯onApplicationEvent()
原因
無(wú)法觸發(fā)AbstractAutoServiceRegistration監(jiān)聽的WebServerInitializedEvent事件,沒(méi)有執(zhí)行服務(wù)注冊(cè)邏輯onApplicationEvent()
根本原因不明?。?!
解決
既然無(wú)法自動(dòng)觸發(fā)WebServerInitializedEvent事件,從而自動(dòng)進(jìn)行服務(wù)注冊(cè),那就手動(dòng)進(jìn)行注冊(cè)
實(shí)現(xiàn)ApplicationRunner接口,監(jiān)聽服務(wù)啟動(dòng)事件,從而主動(dòng)進(jìn)行服務(wù)注冊(cè)
將以下類添加到程序中即可
NacosRegisterOnWar
package com.xxx.nacosregister;
import com.alibaba.cloud.nacos.ConditionalOnNacosDiscoveryEnabled;
import com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration;
import com.alibaba.cloud.nacos.registry.NacosRegistration;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.Query;
import java.lang.management.ManagementFactory;
import java.util.Set;
@Component
@ConditionalOnNacosDiscoveryEnabled
@Slf4j
public class NacosRegisterOnWar implements ApplicationRunner {
@Autowired
private NacosRegistration registration;
@Autowired
private NacosAutoServiceRegistration nacosAutoServiceRegistration;
@Value("${server.port}")
Integer port;
@Override
public void run(ApplicationArguments args) throws Exception {
if (registration != null && port != null) {
Integer registerPort = port;
try {
String tomcatPort = getTomcatPort();
if(StringUtils.isNotBlank(tomcatPort)){
registerPort = new Integer(tomcatPort);
}
} catch (Exception e) {
log.warn("{nacos 注冊(cè)} 獲取外部Tomcat端口異常:",e);
}
registration.setPort(registerPort);
nacosAutoServiceRegistration.start();
}
}
/**
* 獲取外部tomcat端口
*/
public String getTomcatPort() throws Exception {
MBeanServer beanServer = ManagementFactory.getPlatformMBeanServer();
Set<ObjectName> objectNames = beanServer.queryNames(
new ObjectName("*:type=Connector,*"),
Query.match(Query.attr("protocol"),
Query.value("HTTP/1.1")));
String port = "";
for (ObjectName objectName : objectNames) {
port = objectName.getKeyProperty("port");
if(StringUtils.isNotBlank(port)){
return port;
}
}
return port;
}
}
結(jié)果
服務(wù)可以正常注冊(cè)到nacos

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java主鍵生成之@Id和@GeneratedValue使用詳解
這篇文章主要介紹了Java主鍵生成之@Id和@GeneratedValue的使用,@Id和@GeneratedValue注解就是JPA中用于定義主鍵和主鍵生成策略的關(guān)鍵注解,理解這兩個(gè)注解的使用和不同的主鍵生成策略,對(duì)于開發(fā)高效、穩(wěn)定的數(shù)據(jù)持久化應(yīng)用至關(guān)重要,需要的朋友可以參考下2025-05-05
Java getResource()如何獲取class文件目錄位置
這篇文章主要介紹了Java getResource()如何獲取class文件目錄位置,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
Java利用trueLicense實(shí)現(xiàn)項(xiàng)目離線證書授權(quán)操作步驟
文章介紹了如何使用trueLicense實(shí)現(xiàn)離線授權(quán)控制,包括生成公私鑰、創(chuàng)建證書校驗(yàn)?zāi)K、生成證書模塊和測(cè)試模塊,通過(guò)這種方式,可以控制用戶使用的項(xiàng)目模塊、授權(quán)周期、使用的設(shè)備和服務(wù)器,感興趣的朋友跟隨小編一起看看吧2024-11-11
關(guān)于@Configuration的作用說(shuō)明
這篇文章主要介紹了關(guān)于@Configuration的作用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
IntellJ IDEA JAVA代碼任務(wù)標(biāo)記實(shí)例解析
這篇文章主要介紹了IntellJ IDEA JAVA代碼任務(wù)標(biāo)記實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
IDEA2020.1個(gè)性化設(shè)置的實(shí)現(xiàn)
這篇文章主要介紹了IDEA2020.1個(gè)性化設(shè)置的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08

