当前位置: 代码网 > it编程>编程语言>Asp.net > nacos服务无法注册到nacos服务中心问题及解决

nacos服务无法注册到nacos服务中心问题及解决

2025年11月25日 Asp.net 我要评论
简介1、程序在本机用启动类启动,服务可以正常注册到nacos2、程序在linux服务器用tomcat启动,服务无法注册到nacos依赖<!--客户端负载均衡loadbalancer-->&

简介

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

原因

无法触发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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com