首页 > 其他分享 >SpringBoot构建war部署到tomcat中无法注册到Nacos服务

SpringBoot构建war部署到tomcat中无法注册到Nacos服务

时间:2022-11-08 11:14:22浏览次数:58  
标签:服务 SpringBoot tomcat nacos Nacos 注册 import 日志

最近项目基本开发完成,准备部署到服务器中进行功能的验证,但当把所有的环境都搭建好,启动项目后,tomcat启动日志正常,发现在服务调用时一直报错。

项目是使用SpringBoot框架搭建的,多个项目之间通过nacos进行服务调用。于是我查看的nacos的管理端,发现服务并没有注册进来。开始以为是nacos安装的有问题,仔细去查看了控制台日志和日志文件,都没有发现问题。然后就开始对比本地开发环境和部署环境项目启动时tomcat的打印日志,就发现了问题。

本地开发环境idea的打印日志    

部署环境tomcat的打印日志

可以看到本地是启动时日志打印了注册到nacos的日志,但在部署时并没有打印。于是我想到可能并不是nacos的问题,而是部署的问题,首先就想到可能与tomcat有关,经查询,还真的有这种情况,由于外部tomcat在启动时nacos的监听器没有获取到项目的端口号,就不会尝试向服务注册中心注册当前这个微服务,即使注册失败也没有异常信息。

不如来看下nacos服务注册与发现的源码,其自动注册微服务的类是

看到 NacosAutoServiceRegistration 会设置端口号:

而端口号是从其父类中的方法获取的:

在bind的方法中监听了内置容器启动完成事件,获取到容器端口后,向注册中心注册服务。而当使用外部容器Tomcat 来部署项目,bind方法就无法监听到容器启动事件,也就不会尝试向服务注册中心注册当前这个微服务,即使注册就失败了,也没有异常信息。那么该如何处理呢?

既然问题找到了,那么解铃还须系铃人。既然nacos本身无法监听到项目启动,那么我们帮它监听项目的启动然后将项目启动时的端口号取出来给NacosAutoServiceReigistration让其进行注册不就好了吗?

说干就干,大致步骤是在项目初始化时获取端口号并设置给NacosAutoServiceReigistration,然后调用其服务注册的方法。项目初始化的方法很多,这里使用@PostConstruct注解:

新建一个配置类,专门用于系统初始化的操作

package com.zxh.config;

import cn.hutool.core.util.StrUtil;
import com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration;
import com.alibaba.cloud.nacos.registry.NacosRegistration;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;
import java.util.Map;

/**
 * 系统初始化操作
 */
@Configuration
@Slf4j
public class WebAppConfig {

    @Autowired
    private NacosRegistration registration;

    @Autowired
    private NacosAutoServiceRegistration nacosAutoServiceRegistration;
    //获取运行时的环境,dev为本地开发环境
    @Value("${spring.profiles.active}")
    private String env;


    /**
     * 将服务注册到nacos
     */
    @PostConstruct
    public void nacosServerRegister() {
        if (registration != null && StrUtil.isNotEmpty(env) && !env.equals("dev")) {
            try {
                Integer tomcatPort = new Integer(getTomcatPort());
                //设置端口号
                registration.setPort(tomcatPort);
                //将服务注册到nacos
                nacosAutoServiceRegistration.start();
            } catch (Exception e) {
                log.error("获取外部Tomcat端口异常:{}", e);
            }
        }
    }

    /**
     * 获取外部tomcat端口
     *
     * @return
     */
    public static 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 = objectNames.iterator().next().getKeyProperty("port");
        return port;
    }

}

加入此类后,本地开发环境不影响,重新打war包部署到tomcat并启动tomcat,发现服务已经注册成功。

标签:服务,SpringBoot,tomcat,nacos,Nacos,注册,import,日志
From: https://www.cnblogs.com/zys2019/p/16866571.html

相关文章

  • 处理时间转换不正确-Springboot、springclound、feign、http请求
    SpringBoot、SpringCloud、feign、前后端时间解析不正确时,我们可以自定义HttpMessageConverters,以达到我们希望的结果参考链接:https://www.cnblogs.com/nhdlb/p/12783624.......
  • 聊聊springboot项目如何优雅的修改或者填充请求参数
    前言之前我们的文章记一次springboot项目自定义HandlerMethodArgumentResolver不生效原因与解法末尾留了一个思考题:在我们项目中如何优雅修改或者填充请求参数,本期就来揭......
  • 第2-1-4章 SpringBoot整合FastDFS文件存储服务
    目录5SpringBoot整合5.1操作步骤5.2项目依赖5.3客户端开发5.3.1FastDFS配置5.3.2FastDFS配置类5.3.3文件工具类5.3.4文件上传配置5.3.5配置Swagger25.3.6API接口......
  • 如果nacos注册中心挂了怎么办
     当服务异常宕机,Nacos还未反应过来时,可能会发生的状况以及现有的解决方案。 Nacos的健康检查故事还要从Nacos对服务实例的健康检查说起。Nacos目前支持临时实例使用......
  • SpringBoot参考手册
    目录LegalGettingHelpDocumentationOverviewGettingStartedUpgradingSpringBootApplicationsUsingSpringBootCoreFeaturesWebDataIOMessagingContainerImagesPro......
  • SpringBoot IO
    目录1、Caching1.1、SupportedCacheProviders2、Hazelcast3、QuartzScheduler4、SendingEmail5、Validation5.1、验证手机号是否有效示例5.1.1、定义验证注解类5.1.2、......
  • springboot多环境配置
    springboot整合多个环境配置springboot默认读取配置文件名称application,且多个环境配置文件必须按照如下命名Application-dev.yml开发环境application-test.yml......
  • springboot整合nacos config详解
    springboot整合nacos详解@value:读取application文件@ConfigurationProperties:读取指定文件@PropertySource:自定义文件引入@PropertySource+@Value:读取自定义文件@Pro......
  • springboot整合多个环境配置
    springboot整合多个环境配置​ springboot默认读取配置文件名称application,且多个环境配置文件必须按照如下命名Application-dev.yml 开发环境application-test.y......
  • springboot 上传文件设置文件大小限制
     报错内容:org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size exceeded; nested exception is java.lang.IllegalStateExce......