Spring Boot 构建war 部署到tomcat下无法在Nacos中注册服务

文章目录

            • 1. 问题
            • 2. 分析
            • 3. 解决方案

1. 问题

使用Nacos作为注册中心的Spring Boot项目,以war包形式部署到服务器上,启动项目发现该服务无法在Nacos中注册。

2. 分析

SpringCloud 项目打 war 包部署时,也就是使用外部 Tomcat 部署,其启动命令、端口等是由外部容器 Tomcat 配置的,而 Nacos 或者其他服务注册方式需要当前项目的端口号用于注册微服务。

以 Nacos 为例,其自动注册微服务的类是 NacosAutoServiceRegistration,我们看一下它的源码:

public class NacosAutoServiceRegistration extends AbstractAutoServiceRegistration<Registration> {private NacosRegistration registration;@Deprecatedpublic void setPort(int port) {this.getPort().set(port);}protected NacosRegistration getRegistration() {if (this.registration.getPort() < 0 && this.getPort().get() > 0) {this.registration.setPort(this.getPort().get());}Assert.isTrue(this.registration.getPort() > 0, "service.port has not been set");return this.registration;}

我们看到 NacosAutoServiceRegistration 使用了 this.registration.setPort(this.getPort().get()); 来设置端口号。

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

public abstract class AbstractAutoServiceRegistration<R extends Registration>implements AutoServiceRegistration, ApplicationContextAware,ApplicationListener<WebServerInitializedEvent> {private AtomicInteger port = new AtomicInteger(0);@Deprecatedpublic void bind(WebServerInitializedEvent event) {ApplicationContext context = event.getApplicationContext();if (context instanceof ConfigurableWebServerApplicationContext) {if ("management".equals(((ConfigurableWebServerApplicationContext) context).getServerNamespace())) {return;}}this.port.compareAndSet(0, event.getWebServer().getPort());this.start();}

这段代码监听了内置容器启动完成事件,监听获取到容器端口后,向注册中心注册服务。

因此,当使用外部容器时,如此处的 Tomcat 来部署项目,AbstractAutoServiceRegistration 就不能监听到容器启动事件了,也就不会尝试向服务注册中心注册当前这个微服务,那么注册就失败了,并且也就没有异常信息了。

SpringBoot微服务项目构建war包参考:
SpringBoot微服务项目构建war包 部署排除指定jar

3. 解决方案

自定义获取获取外部容器端口的方法, 然后监听应用启动事件,当应用被启动时,获取外部容器启动的端口号,然后将这个 port 设置到 NacosAutoServiceReigistration 中。

具体操作流程:
Spring Boot提供了ApplicationRunner接口,是在应用起好之后执行一些初始化动作。通过这个接口我们可以实现启动项目后注册服务。使用这种方法,需要在配置文件中配置端口号,如果一个应用部署很多端口,每个应用都要配置,很不方便。故可获取外部tomcat自动设置端口。经测试,方法可行。
在启动类同级目录,复制下面代码即可(不需要修改,直接构建war即可)

package com.gblfy;import java.lang.management.ManagementFactory;
import java.util.Set;import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.Query;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 com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration;
import com.alibaba.cloud.nacos.registry.NacosRegistration;import lombok.extern.slf4j.Slf4j;/*** 项目打包war情况下部署外部tomcat,需该方式注册nacos** @author gblfy* @date 2022-03-29*/
@Component
@Slf4j
public class NacosRegisterOnWar implements ApplicationRunner {@Autowiredprivate NacosRegistration registration;@Autowiredprivate NacosAutoServiceRegistration nacosAutoServiceRegistration;@Value("${server.port}")Integer port;@Overridepublic void run(ApplicationArguments args) throws Exception {if (registration != null && port != null) {Integer tomcatPort = port;try {tomcatPort = new Integer(getTomcatPort());} catch (Exception e) {log.warn("获取外部Tomcat端口异常:", e);}registration.setPort(tomcatPort);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 = objectNames.iterator().next().getKeyProperty("port");return port;}
}

提示:
在部署项目要注意版本问题,如Spring Boot 2.0.6应该部署在tomcat8以上版本

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/515814.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

掌门1对1微服务体系Solar|阿里巴巴Sentinel落地实践

前言 掌门1对1精耕在线教育领域&#xff0c;近几年业务得到了快速发展&#xff0c;但同时也遭遇了“成长的烦恼”。随着微服务数量不断增加&#xff0c;流量进一步暴增&#xff0c;硬件资源有点不堪重负&#xff0c;那么&#xff0c;如何实现更好的限流熔断降级等流量防护措施…

湘苗培优|值不值?效果告诉你

號外高校俱乐部报名ing湘苗培优REC等待优秀的你!湘苗培优参与项目交付企业内推求职简历指导CSDN技术认证你能获得优秀的企业导师&#xff01;志同道合的朋友锻造自己的平台&#xff01;面对面的交流这里有介绍湘苗培优缘起随着我国信息产业飞速发展&#xff0c;通过常规灌输式培…

软考 - 法律法规 标准化

法律法规 知识产权&#xff1a;著作权、邻接权、专利权、商标权、商业秘密权、集成电路布图设计权&#xff1b; 权生效时间有效期&#xff08;年&#xff09;专利权&#xff08;发明&#xff09;申请20专利权&#xff08;实用新型&#xff09;申请10专利权&#xff08;外观设…

Redis 分布式集群搭建2022版本+密码(linux环境)

Linux环境 安装 Redis-6.2.6 配置运行_01 https://gblfy.blog.csdn.net/article/details/105583077 文章目录一、节点分布总览二、软件配置初始化2.1. 下载2.2. 解压2.3. 编译安装2.4. 配置抽离2.5. 配置编辑2.6. 101节点操作2.7. 102 节点操作2.8. 103节点操作三、软件配置集群…

CDN百科第三讲|如果用了云服务器,还需要做CDN加速吗?

在全站上云的背景下&#xff0c;云计算已经不仅仅是大型互联网公司的独享概念&#xff0c;正在被更多的传统企业、中小企业甚至个人站长所采用。在众多云计算服务中&#xff0c;最常见两个产品就是云服务器和CDN&#xff0c;今天的CDN百科第三讲&#xff0c;就给大家介绍下你关…

如何选择适合你的企业数据管理类产品

在全站上云的背景下&#xff0c;云计算已经不仅仅是大型互联网公司的独享概念&#xff0c;正在被更多的传统企业、中小企业甚至个人站长所采用。在众多云计算服务中&#xff0c;最常见两个产品就是云服务器和CDN&#xff0c;今天的CDN百科第三讲&#xff0c;就给大家介绍下你关…

软件设计师 - 软件工程

文章目录1.风险管理2.多态3.RUP (Rational Unified Process&#xff0c;统一软件开发过程)4.可移植性5.内聚、耦合5.1.内聚类型5.2.耦合类型6.开发模型UP统一开发过程CMM软件过程成熟度软件维护类型极限编程风险1.风险管理 风险识别&#xff1a;建立风险条目检查表&#xff0c…

5G与金融行业融合应用的场景探索

来源 | 人民数字FINTECH责编 | 晋兆雨头图 | 付费下载于视觉中国5G 技术如何与银行、保险、证券业结合&#xff1f;近年来&#xff0c;金融业高度关注5G技术应用&#xff0c;一些金融机构希望抓住5G应用发展窗口期&#xff0c;积极探索新业态和新模式&#xff0c;把握5G金融应用…

云端研发新基建:Serverless与持续架构服务落地实践

在《我心中的云时代原生开发环境》这篇文章中&#xff0c;我们探讨过云厂商的愿景&#xff0c;云计算的趋势与现状以及研发团队的架构服务诉求等背景。今天&#xff0c;我想结合我们打造的云开发平台&#xff08;Cloud Workbench&#xff09;跟大家进一步聊聊&#xff0c;如何打…

Dubbo-gok8s注册中心设计方案与实现

Dubbo-go k8s注册中心设计方案与实现 随着云原生的推广&#xff0c;越来越多的公司或组织将服务容器化&#xff0c;并将容器化后的服务部署在k8s集群中。 今天这篇文章将会介绍dubbo-go将k8s作为服务注册中心的方案设计&#xff0c;以及具体实现。到目前为止该方案的实现已经被…

软件设计师 - 数据流图

文章目录解题思路物理数据流图逻辑数据流图数据流图设计原则结构化语言解题思路 1.审题&#xff0c;圈出名词。 2.根据数据流图的平衡原则&#xff0c;判断数据流正确或补充数据流图&#xff1b; 物理数据流图 关注系统物理实体&#xff0c;及文档、输入输出硬拷贝。是系统构…

vue pdfjs 在线预览

下载pdfjs 官网&#xff1a;http://mozilla.github.io/pdf.js/getting_started/#download 放入项目中 将下载下来的文件解压缩后&#xff0c;重命名为pdf&#xff0c;将里面的pdf文件夹拷贝到项目中的public文件夹中 页面中使用 <template><div class"container…

年终福利 | “社区之星”(社区核心贡献者)成长故事征集

活动简介那些积极探索技术边界并持续对社区做出贡献的开发者是真正的技术英雄&#xff0c;是开发者的学习榜样&#xff0c;也是各个技术社区发展的生命力&#xff01;2020年即将结束&#xff0c;CSDN 为所有技术社区特别准备了一份年终福利&#xff01;CSDN 向所有技术社区&…

阿里云峰会|数据库也能自动驾驶?DAS全天候给你保驾护航!

阿里云峰会直播地址 2020年6月9日&#xff0c;“全速重构”2020阿里云线上峰会即将隆重召开。 在此次峰会上&#xff0c;阿里云数据库重磅发布云原生分布式数据库 PolarDB-X 、云原生数据仓库AnalyticDB、数据库自治服务DAS、云数据库专属集群、图数据库GDB、云数据库Cassandr…

阿里云峰会|阿里云数据中台重磅升级后拟扶持100万家企业数智化

6月9日&#xff0c;在2020阿里云线上峰会上&#xff0c;阿里巴巴集团副总裁、数据技术及产品部负责人朋新宇推出Quick Audience、Quick A两款全新产品&#xff0c;并升级Dataphin和Quick BI两款现有产品。同时&#xff0c;阿里云零售、金融、政务及互联网企业等四大行业数据中台…

软件设计师 - 函数依赖 和 范式

文章目录1.函数依赖&#xff1a;1.0.前提范例&#xff1a;1.1.函数依赖定义&#xff1a;1.2. 部分依赖1.3. 完全依赖2.范式2.1. 码、候选码、主码2.2.主属性和非主属性2.3.第一范式&#xff08;1NF&#xff09;2.4.第二范式&#xff08;2NF&#xff09;2.5.第三范式&#xff08…

SpringBoot 自定义线程池

文章目录一、自定义线程池1. yml配置2. 线程池配置属性类3. 开启异步线程支持4. 创建自定义线程池配置类5. service逻辑层6. controller控制层7. 效果图二、配置默认线程池2.1. yml2.2.线程池配置属性类2.3. 开启异步线程支持2.4. 装配线程池2.5. service逻辑层2.6. controller…

可用性SLA还不懂?看完这个故事就懂了

大家好&#xff0c;我是小编云BliBli&#xff0c; 这些天 领导问了我一个暴击我灵魂的问题&#xff1a; 什么是SLA&#xff1f;那么多9到底是什么意思&#xff1f; &#xff08;瓦特&#xff1f;&#xff1f;我怎么知道&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#…

如何通过 Serverless 轻松识别验证码?

来源 | Serverless责编 | 晋兆雨头图 | 付费下载于视觉中国前言Serverless 概念自被提出就倍受关注&#xff0c;尤其是近些年来 Serverless 焕发出了前所未有的活力&#xff0c;各领域的工程师都在试图将 Serverless 架构与自身工作相结合&#xff0c;以获取到 Serverless 架构…