本文主要是介绍nacos服务无法注册到nacos服务中心问题及解决,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《nacos服务无法注册到nacos服务中心问题及解决》本文详细描述了在Linux服务器上使用Tomcat启动Java程序时,服务无法注册到Nacos的排查过程,通过一系列排查步骤,发现问题出在Tom...
简介
1、程序在本机用启动类启动,服务可以正常注册到nacos
2、程序在linux服务器用tomcat启动,服务无法注册到nacos
依赖
<!--客户端负载均衡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>PvrDT;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>
异常情况
服务启动后无法注册到服务中心

排查
1、检查本机与Linux服务器程序配置文件是否存在差异,导致服务无法注册
结果:配置完全相同
2、查看Linux日志,发现程序对nacos配置文件的读取是正常的,可以正常访问nacos的配置中心读取配置文件
结果:nacos配置文件可以读取,服务无法注册到nacos
3、查看Linux服务器其他程序是否可以注册到nacos
结果:同一台Linux服务器其他程序可以正常注册到nacos
4、查看可以正常注册的程序,使用的依赖版本与当前无法注册的程序依赖版本是否一致
结果:openFeign、Nacos、Spring Cloud、Spring Boot依赖版本完全一致
5、将当前程序tomcat放到其他Linux服务器启动,服务依旧无法注册到nacos
结果:排除是Linux服务器本身的问题
6、将程序放到可以正常注册的程序所在的tomcat
结果:原先可以正常注册的程序依旧正常,当前程序还是无法正常注册到nacos,排除tomcat的问题
断点调试
1、本机用启动类启动服务,可以正常触发AbstractAutoServiceRegistration监听的WebServerInitializedEvent事件,会执行服务注册逻辑onApplicationEvent()
2、Linux服务器tomcat启动,无法触发AbstractAutoServiceRegistration监听的WebServerInitializedEvent事件,没有执行服务注册逻辑onApplicationEvent()
原因
无法触发AbstractAutoServiceRegistration监听的WebServerInitializedEvent事件,没有执行服务注册逻辑onApplicationEvent()
根本原因不明!!!
解决
既然无法自动触发WebServerInitializedEvent事件,从而自动进行服务注册,那就手动进行注册
实现ApplicationRunner接口,监听服务启动事件,从而主动进行服务注册
将以下类添加到程序中即可
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;China编程 import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.phpfactory.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 注册} 获取外部Tomc编程at端口异常:",e); } registration.setPort(registerPort); nacosAutoServiceRegistration.start(); }PvrDT } /** * 获取外部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; } }
结果
服务可以正常注册到nacos

总结
这篇关于nacos服务无法注册到nacos服务中心问题及解决的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!