SpringBoot项目War包部署无法注册到Nacos中的解决

 更新时间:2022年01月07日 10:37:07   作者:shyの程序猿  
这篇文章主要介绍了SpringBoot项目War包部署无法注册到Nacos中的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

SpringBoot项目War包部署无法注册到Nacos中

注: 其实标题的描述不是很准确,准确的说是已经注册成功并且可以正常访问,但是在服务列表却看不到。

问题

最近在进行Eureka迁移Nacos架构升级的时候,发现有两个之前的旧项目,虽然也是SpringBoot项目,但是启动方式是通过外置Tomcat启动的。就在项目改造完成后,发现启动正常,访问也正常,但就是在nacos客户端服务列表中看不到这个服务。

解决方案

我们从Nacos的注册类NacosAutoServiceRegistration 进去之后可以发现它继承了SpringCloud的AbstractAutoServiceRegistration 注册类,在AbstractAutoServiceRegistration 中有一个绑定监听事件,他的作用就是监听到内置容器启动完成之后获取容器端口向注册中心注册,如下图:

在这里插入图片描述

因为这个接口只可以监听内置容器,所以我们就可以得出结论:之所以会出现上面的问题,就是因为使用外部容器时,不会触发监听事件,所以也就注册不到nacos中。

因此我们可以借助SpringBoot提供的ApplicationRunner接口,这个接口的作用就是在应用启动完成之后执行一些定义好的初始化操作。所以我们可以在服务启动成功之后,通过这个接口将我们的项目注册到Nacos中,下面看代码

/**
 * @author shy
 * @date 2021/11/29 16:23
 */
@Component
public class NacosConfig implements ApplicationRunner {

    @Autowired(required = false)
    private NacosAutoServiceRegistration registration;

    @Value("${server.port}")
    Integer port;

    @Override
    public void run(ApplicationArguments args) {
        if (registration != null && port != null) {
            //如果getTomcatPort()端口获取异常,就采用配置文件中配置的端口
            Integer tomcatPort = port;
            try {
                tomcatPort = new Integer(getTomcatPort());
            } catch (Exception e) {
                e.printStackTrace();
            }
            registration.setPort(tomcatPort);
            registration.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 = objectNames.iterator().next().getKeyProperty("port");
        return port;
    }
}

加上这个配置类启动之后,我们就可以在Nacos客户端服务列表中看到相应的服务

SpringBoot项目war包部署及出现的问题

Failed to bind properties under 'mybatis.configuration.mapped-statements[0].

1.修改pom文件

修改打包方式 为war;

添加tomcat使用范围,provided的意思即在发布的时候有外部提供,内置的tomcat就不会打包进去 

  <groupId>com.school</groupId>
    <artifactId>daniel</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>daniel</name>
    <description>student information project for Spring Boot</description>
    <!--打包方式,发布时使用此项-->
    <packaging>war</packaging>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!--需要发布发war包时使用-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>

 

2.在启动类或者配置类中继承SpringBootServletInitializer 

如果需要打war包部署,需要继承此类,重写configure方法。

@SpringBootApplication
public class DanielApplication extends SpringBootServletInitializer {
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(DanielApplication.class);
    }
    public static void main(String[] args) {
        SpringApplication.run(DanielApplication.class, args);
    }
}

注意:

如果使用的springboot最新的版本则会报,我当时用的是

  • spring-boot-starter-parent:2.2.0.RELEASE
  • mybatis-spring-boot-starter:2.1.1

修改为下面的版本问题解决,通过查询资料发现现在的最新版本springboot与mybatis兼容性存在问题,到后面升级后应该就没有问题了。

Failed to bind properties under 'mybatis.configuration.mapped-statements[0].parameter-map.parameter-…

 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <!--<version>2.2.0.RELEASE</version>-->
        <version>2.1.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
<dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <!-- <version>2.1.1</version>-->
        <version>2.0.1</version>
</dependency>

附:以上的问题都已解决,但是我的项目中使用了shiro框架,在外置tomcat部署时,无法使用shiro。没有改版本的时候使用idea是正常的…

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Idea中springboot项目的热部署无法生效问题解决

    Idea中springboot项目的热部署无法生效问题解决

    本文主要介绍了Idea中springboot项目的热部署无法生效问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-10-10
  • Springboot实现Activemq死信队列详解

    Springboot实现Activemq死信队列详解

    这篇文章主要介绍了Springboot实现Activemq死信队列详解,Activemq服务端配置重新投递次数超过 MaximumRedeliveries ,则会进入死信队列,默认情况,有一个死信队列:AcitveMQ.DLQ,所有的消息都投递到此队列,包括过期消息,重投递失败消息,需要的朋友可以参考下
    2023-12-12
  • Java 十大排序算法之归并排序刨析

    Java 十大排序算法之归并排序刨析

    归并排序是采用分治法的一个非常典型的应用。先使每个子序列有序,再使子序列段间有序,也就是将已有的子序列合并,得到完全有序的序列;如果将两个有序表合并成一个有序表,称为二路归并
    2021-11-11
  • Spring事务annotation原理详解

    Spring事务annotation原理详解

    这篇文章主要介绍了Spring事务annotation原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • SpringCloud如何使用Eureka实现服务之间的传递数据

    SpringCloud如何使用Eureka实现服务之间的传递数据

    这篇文章主要介绍了SpringCloud使用Eureka实现服务之间的传递数据操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 剑指Offer之Java算法习题精讲数组与字符串题

    剑指Offer之Java算法习题精讲数组与字符串题

    跟着思路走,之后从简单题入手,反复去看,做过之后可能会忘记,之后再做一次,记不住就反复做,反复寻求思路和规律,慢慢积累就会发现质的变化
    2022-03-03
  • Springboot 通过FastJson实现bean对象和Json字符串互转问题

    Springboot 通过FastJson实现bean对象和Json字符串互转问题

    这篇文章主要介绍了Springboot 通过FastJson实现bean对象和Json字符串互转,本文尝试验证两种场景给大家详细介绍,对Springboot FastJson实现bean和Json互转问题,感兴趣的朋友一起看看吧
    2022-08-08
  • Java大数据处理的核心技术MapReduce框架

    Java大数据处理的核心技术MapReduce框架

    MapReduce是一种分布式计算框架,适用于大规模的数据处理。它将大数据分成多个小数据块,通过Map和Reduce两个阶段对数据进行处理和分析。MapReduce框架具有可靠、高效、可扩展等特点,已经成为大数据处理的核心技术
    2023-05-05
  • Spring boot开发web应用JPA过程解析

    Spring boot开发web应用JPA过程解析

    这篇文章主要介绍了Spring boot开发web应用JPA过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Spring超详细讲解AOP面向切面

    Spring超详细讲解AOP面向切面

    面向对象编程是一种编程方式,此编程方式的落地需要使用“类”和 “对象”来实现,所以,面向对象编程其实就是对 “类”和“对象” 的使用,面向切面编程,简单的说,就是动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程
    2022-10-10

最新评论