解决SpringBoot项目war部署到tomcat下无法Nacos中注册服务问题
问题说明
怎么解决Spring Boot项目部署到tomcat下无法Nacos中注册服务问题",希望能够解决您遇到有关问题。
在使用Nacos作为注册中心的Spring Boot项目,以war包形式部署到服务器上,启动项目发现该服务无法在Nacos中注册。
分析
查看源码,需从nacos的注册类找起,查找后发现,nacos注册类NacosAutoServiceRegistration继承了Spring Cloud中AbstractAutoServiceRegistration, 而在AbstractAutoServiceRegistration中绑定了一个监听事件,监听内置容器启动完成事件,监听到获取容器端口后向注册中心注册。
@EventListener({WebServerInitializedEvent.class})public void bind(WebServerInitializedEvent event) {ApplicationContext context = event.getApplicationContext();if (!(context instanceof ConfigurableWebServerApplicationContext) || !"management".equals(((ConfigurableWebServerApplicationContext)context).getServerNamespace())) {this.port.compareAndSet(0, event.getWebServer().getPort());this.start();}}
而使用外部容器时,不能监听到事件,所以自动注册失败。
解决方案
Spring Boot提供了PostConstruct注解属性和ApplicationRunner接口并实现run方法即可前者比较简单,是在应用起好之后执行一些初始化动作。通过这个接口我们可以实现启动项目后注册服务。使用这种方法,需要在配置文件中配置端口号,如果一个应用部署很多端口,每个应用都要配置,很不方便。故可获取外部tomcat自动设置端口。经测试,方法可行。
代码如下:
@Component
@Slf4j
public class NacosRegister {@Autowiredprivate NacosRegistration registration;@Autowiredprivate NacosAutoServiceRegistration nacosAutoServiceRegistration;@Value("${server.port}")String serverPort;@PostConstructpublic void registerInstance() throws Exception {if (registration != null && serverPort != null) {String tomcatPort = serverPort;try {tomcatPort = getPort();} catch (Exception e) {log.warn("获取外部Tomcat端口异常:", e);}registration.setPort(Integer.parseInt(tomcatPort));nacosAutoServiceRegistration.start();}}/*** 获取外部tomcat端口*/public String getPort() {try {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;} catch (Exception ex) {log.error("NacosRegister.getPort()动态获取端口异常:", ex.toString());return serverPort;}}
提示
部署项目要注意版本问题,如Spring Boot 2.0.6应该部署在tomcat8以上版本,tomcat8以下版本可能有些变化,导致项目启动报错。所以大家尽量使用tomcat8以上版本吧
相关文章:
解决SpringBoot项目war部署到tomcat下无法Nacos中注册服务问题
问题说明 怎么解决Spring Boot项目部署到tomcat下无法Nacos中注册服务问题",希望能够解决您遇到有关问题。 在使用Nacos作为注册中心的Spring Boot项目,以war包形式部署到服务器上,启动项目发现该服务无法在Nacos中注册。 分析 …...
C++中的##、#符号含义
在C中,## 和 # 是两个不同的预处理符号。这些符号都是在C的预处理阶段使用的,用于在代码编译之前对文本进行操作。 #(字符串化操作符): 用于将宏参数转换为字符串常量。 #define STRINGIZE(x) #x const char* str S…...
探究Vue3中的Composition API:优化组件逻辑的新利器
一、toRef函数 在 Vue 3.0 中,引入了一种新的响应式 API,即 toRef。toRef 函数可以将一个普通值转换为响应式引用类型,这样就可以在模板中直接使用这个响应式引用类型的属性,并且当该属性发生变化时,视图会自动更新。 <templat…...
Google Services Framework 谷歌服务框架的安装以及遇到的常见问题
安装谷歌三件套: 1、Google 服务框架(Google Services Framework)下载地址: https://www.apkmirror.com/apk/google-inc/google-services-framework/ 注意一定要选择与自己手机对应的安卓系统版本的服务框架。 2、Google Play Se…...
学习高级数据结构:探索平衡树与图的高级算法
文章目录 1. 平衡树:维护数据的平衡与高效性1.1 AVL 树:严格的平衡1.2 红黑树:近似平衡 2. 图的高级算法:建模复杂关系与优化2.1 最小生成树:寻找最优连接方式2.2 拓扑排序:解决依赖关系 拓展思考 …...
centos7离线安装neo4j
一、准备需要的rpm包 本地环境执行如下命令: docker pull couchbase/centos7-systemd docker run -it couchbase/centos7-systemd bash # 可能需要换源 yum update -y vi /etc/yum.conf # 修改其中的keepcache1 rpm --import https://debian.neo4j.com/neotechnol…...
【黑马头条之项目部署_持续集成Jenkins】
本笔记内容为黑马头条项目的项目部署_持续集成部分 目录 一、内容介绍 1、什么是持续集成 2、持续集成的好处 3、今日内容 二、软件开发模式 1、软件开发生命周期 2、软件开发瀑布模型 3、软件的敏捷开发 三、Jenkins安装配置 1、Jenkins介绍 2、Jenkins环境搭建 …...
前端自动化部署,Devops,CI/CD
DevOps 提到 Jenkins,想到的第一个概念就是 CI/CD 在这之前应该再了解一个概念。 DevOps Development 和 Operations 的组合,是一种方法论,并不特指某种技术或者工具。DevOps 是一种重视 Dev 开发人员和 Ops 运维人员之间沟通、协作的流程。…...
22 元类技术(面向切片编程)|ORM的实现|抽象类与接口类
文章目录 前情知识补充hasattr 函数setattr函数getattr函数join 函数 元类技术使用type创建类什么是元类(概念总结)\_\_metaclass\_\_属性使用metaclass 的函数方式进行创建类使用metaclass 的类方式进行创建类 自定义元类 元类实现ORM接口类与抽象类抽象…...
fuchsia系统介绍
fuchsia系统 Fuchsia,是由Google公司开发的继Android和Chrome OS之后的第三个系统,已在Github中公开的部分源码可以得知。Google对于Fuchsia的说明是“Pink(粉红)Purple(紫色)Fuchsia(灯笼海棠…...
解决Jenkins执行Python脚本不能实时输出打印信息的问题
问题: 在使用Jenkins的shell command来执行python脚本时,总是会等脚本执行完毕,最后一次性才把脚本中的print语句给打印出来; 解决方法: 在print语句后加上sys.stdout.flush(), 就可以达到实时输出的目的了。...
2021年03月 C/C++(五级)真题解析#中国电子学会#全国青少年软件编程等级考试
C/C++编程(1~8级)全部真题・点这里 第1题:最小新整数 给定一个十进制正整数n(0 < n < 1000000000),每个数位上数字均不为0。n的位数为m。 现在从m位中删除k位(0<k < m),求生成的新整数最小为多少? 例如: n = 9128456, k = 2, 则生成的新整数最小为12456 时间…...
【微服务】服务发现和管理技术框架选型调研
选型背景 方案对比 结论 结合实际业务和开发需要,着重考虑性能可靠性、功能和社区支持程度三方面,认为Nacos更适合作为服务发现和管理的技术框架。具体理由如下: 性能更好,可靠性更高 经过阿里、APISIX、SpringCloudAlibaba,阿…...
【核磁共振成像】观共享重建
目录 一、K空间关键孔技术-数据采集二、BRISK技术三、TRICKS技术四、实时成像和滑动窗重建五、心电触发电影(CINE)采集六、分段心脏采集和观共享 一、K空间关键孔技术-数据采集 对于笛卡尔K空间,一个相位编码行有时称为一个K空间观。一般情况下,每帧图像…...
〔020〕Stable Diffusion 之 骨骼姿势 篇
✨ 目录 🎈 姿势检测 / OpenPose🎈 姿势检测 OpenPose 参数介绍🎈 姿势检测 OpenPose 基本使用🎈 深度库 / Depth Lib🎈 深度库 Depth Lib 参数介绍🎈 3D姿势检测 / 3D Openpose Editor🎈 3D姿势检测 3D Openpose Editor 参数介绍🎈 3D姿势检测 3D Openpose Ed…...
使用Python进行Base64编码和解码
假设您有一个想要通过网络传输的二进制图像文件。您很惊讶对方没有正确接收该文件 - 该文件只是包含奇怪的字符! 嗯,您似乎试图以原始位和字节格式发送文件,而所使用的媒体是为流文本而设计的。 避免此类问题的解决方法是什么?答…...
MongoDB的数据恢复与备份
MongoDB的数据恢复与备份 在MongoDB中,备份和恢复数据是一项关键任务,可以确保数据的安全性并防止意外数据丢失。本文将介绍MongoDB的数据恢复与备份原理并提供相关的编程代码和配置。 1. 数据备份原理 MongoDB提供了多种备份数据…...
Java之SpringCloud Alibaba【五】【微服务 Sentinel整合openfeign进行降级】
一、Sentinel整合openfeign 1、复制一下order-openfeign项目(创建order-openfeign-sentinel) 然后在stock-nacos当中编写对应的接口 RequestMapping("/reduct2")public String reduct2(){int a 1/0;System.out.println("扣减库存"…...
电脑前置耳机没声音怎么办
有很多小伙伴反映在将自己的耳机连接到主机前面时没有声音,这是怎么回事呢,遇到这种情况应该怎么解决呢,下面小编就给大家详细介绍一下电脑前置耳机没声音的解决方法,有需要的小伙伴可以来看一看电脑前面耳机没声音。 解决方法&a…...
package.json 详解
文章目录 package.json1. name2. version3. description4. homepage5. bugs6. license7. author, contributors8. funding9. files10. main11. module12. browser13. bin14. man15. directories15.1 directories.bin15.2 directories.man 16. repository17. scripts18. config1…...
【Perplexity阅读推荐查询实战指南】:20年AI工具专家亲授5大精准筛选技巧,错过再等一年
更多请点击: https://kaifayun.com 第一章:Perplexity阅读推荐查询的核心价值与适用场景 Perplexity 作为一款基于大语言模型的实时问答与研究工具,其“阅读推荐查询”能力并非简单的内容聚合,而是融合语义理解、来源可信度评估…...
告别外挂SDRAM!用SWM34SRET6这颗内置8MB内存的MCU驱动4.3寸屏,成本直降
告别外挂SDRAM!用SWM34SRET6这颗内置8MB内存的MCU驱动4.3寸屏,成本直降 在嵌入式显示项目中,驱动TFT-LCD屏幕往往需要搭配外置SDRAM芯片来满足帧缓冲需求。这不仅增加了BOM成本,还占用了宝贵的PCB面积,更让布线复杂度直…...
JMeter 实战:JSON 响应中文节点 + 数值精准断言(附真实接口案例)
前言在接口自动化测试、性能测试过程中,JSON 断言是 JMeter 最常用的校验方式。日常开发中经常遇到JSON 键为中文、数组嵌套、浮点数金额校验等场景,很多同学会出现路径写错、数值匹配失败、中文节点解析异常等问题。本文以真实业务接口返回数据为例&…...
Go语言性能优化最佳实践
Go语言性能优化最佳实践 1. 优化清单 使用Benchmark定位热点减少内存分配使用goroutine池选择合适的数据结构优化数据库查询使用缓存 2. 总结 性能优化需要结合实际情况,避免过度优化。...
告别if/else地狱:从表驱动到设计模式的代码重构实战
1. 项目概述:从“屎山”到“优雅”的代码重构之旅“优雅地优化掉这些多余的if/else”,这几乎是每个有一定经验的开发者,在接手或维护一个项目时,内心最常响起的呐喊。我见过太多代码,它们最初可能只是几个简单的条件判…...
别只当普通Office用!挖掘WPS教育考试版里那些被忽略的‘学习神器’
解锁WPS教育考试版的隐藏技能:从工具到学习伙伴的进阶指南 在备考的漫长征途中,我们常常陷入"工具只是工具"的思维定式。WPS教育考试版远不止是一个文档编辑器,它更像是一位24小时待命的学习助手,只是大多数人从未真正…...
【会议征稿通知 | E3S出版 | EI 、Scopus稳定检索】第十二届能源材料与环境工程国际学术会议(ICEMEE 2026)
第十二届能源材料与环境工程国际学术会议(ICEMEE 2026) 2026 12th International Conference on Energy Materials and Environment Engineering 2026年6月12-14日 | 线上会议 大会官网:www.icemee.net 截稿时间:见官网&#x…...
ModusToolbox 3.1.0 保姆级安装与配置指南(Windows版,含GitHub访问加速方案)
ModusToolbox 3.1.0 高效安装与深度配置实战(Windows环境) 对于嵌入式开发者而言,英飞凌的ModusToolbox无疑是一把打开物联网世界的金钥匙。然而,当这把钥匙遇到网络访问的铜墙铁壁时,许多开发者的热情往往被消磨在无尽…...
专业影像场景优选:三大维度拆解分析高速稳定CFexpress存储卡如何保障拍摄顺利
文章概览:从工程视角看CFexpress存储卡选型在专业影像制作中,存储卡不仅仅是数据载体,更是整个工作流中的关键节点。针对高强度8K视频录制、RAW格式连拍、不可重拍场景下数据安全等核心诉求,本文对市场上主流CFexpress存储卡进行工…...
全息三维空间孪生,全域无感精准智位:数字孪生·视频孪生·无感定位 行业地位核心优势
在全域空间数字化、实景虚实融合与空间智能快速演进的产业周期中,镜像视界(浙江)科技有限公司持续深耕视频原生三维重构、时空AI像素解算、全域无感精准定位、跨镜轨迹智能推演底层核心领域,依托八大自主可控核心引擎构筑全栈技术…...
