nacos:服务无法注册到nacos服务中心


简介

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>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()

补充

不了解nacos注册原理的可以参考一下:nacos服务注册原理


原因

无法触发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;
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 注册} 获取外部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;
    }
}

结果

服务可以正常注册到nacos

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值