解决SpringBoot项目war部署到tomcat下无法Nacos中注册服务问题

这篇具有很好参考价值的文章主要介绍了解决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 {

    @Autowired
    private NacosRegistration registration;

    @Autowired
    private NacosAutoServiceRegistration nacosAutoServiceRegistration;

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

    @PostConstruct
    public 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以上版本吧  文章来源地址https://www.toymoban.com/news/detail-689764.html

到了这里,关于解决SpringBoot项目war部署到tomcat下无法Nacos中注册服务问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Docker】使用 Docker 部署的微服务在 Nacos 里注册成内网地址 导致无法微服务间互相调用的解决方案...

    遇到问题: 一般情况下,微服务采用docker部署,通常默认采用 bridge 桥接的网络模式,docker 会自动分配一个 172.x.x.x 这样的私有内网地址,存在这样的难题: 由于是 172开头的内部网络地址, 在本机的docker 内是可以访问,而 跨主机 就无法访问。 在使用了nacos 后,nacos 里注册

    2024年02月06日
    浏览(29)
  • Tomcat 部署时 war 和 war exploded区别

    在 Tomcat 调试部署的时候,我们通常会看到有下面 2 个选项。 是选择war还是war exploded 这里首先看一下他们两个的区别: war 模式:将WEB工程以包的形式上传到服务器 ; war exploded 模式:将WEB工程以当前文件夹的位置关系上传到服务器; 简单点来说就是 Tomcat 的部署方式不一样

    2024年02月10日
    浏览(27)
  • Tomcat部署war程序

    目前比较流行的服务器。Tomcat虽然和Apache或者Nginx这些服务器一样,具有处理HTML页面的功能,但处理静态HTML的能力原不足它们,所以Tomcat通常作为Servlet和JSP容器,单独运行在后端。 我们下载tomcat8: Tomcat下载连接: https://tomcat.apache.org/download-80.cgi#8.5.83 点击apache-tomcat-8.5.83.e

    2024年02月06日
    浏览(31)
  • war包如何部署在tomcat

    话说上篇找到的一个开源项目,打包时war类型而非jar类型,因此学习了一下war包如何部署在tomcat, 以及如何访问项目。 首先,我们要确认系统安装了jdk和tomcat,没有的话大家可以去官网下载。 tomcat目录如下:这里就讲一下config和webapps bin:存放一些可以执行的二进制文件,

    2024年02月12日
    浏览(27)
  • Tomcat中利用war包部署

    在Tomcat中利用war包部署Web应用程序时,默认情况下,应用程序的上下文路径(也称为项目名称)将是war文件的名称(去除.war扩展名)。这意味着您在访问Web应用程序时必须在URL中包含项目名称。例如,如果war文件名为\\\"myapp.war\\\",则您必须访问\\\"http://localhost:8080/myapp/\\\"才能访问该

    2024年02月15日
    浏览(26)
  • Tomcat部署war包并成功访问网页

    一. 什么是Servlet servlet是一种 实现动态页面 所需的技术, 是一组Tomcat提供给程序员的API,帮助程序员高效开发的一个web app 二. 如何利用Tomcat部署war包 1. 创建一个maven项目 使用idea创建一个maven项目 只需要填写好存放位置, 并选择Maven项目即可. Name选项可根据自己需要填写 创建过

    2024年02月09日
    浏览(30)
  • Linux中Tomcat发布war包后无法正常访问非静态资源

    在CentOS8中安装完WEB环境,首次部署WEB项目DEMO案例,发现可以静态的网页内容, 但是无法向后台发送异步请求,全部出现 404 问题,导致数据库数据无法渲染到界面上。 CentOS请求中提示 用来获取资源的连接不安全 因为使用的 HTTP 协议访问的项目 不安全是正常的,请暂时忽略

    2024年02月09日
    浏览(38)
  • Jenkins环境部署与应用(Tomcat+war包方式)

            本文章采用Tomcat+Jenkins.war的方式进行环境部署,这是通用环境,在任何系统下都可以这样部署。当然,Jenkins官方也有提供windows版本、linux版本、mac版本等其他安装方式。         实操环境是在windows11本地电脑安装的,也就是在本地搭建的环境,只能本地访问,作

    2024年02月16日
    浏览(33)
  • Tomcat部署SpringBoot项目

    pom.xml 里 加上 需要修改SpringBoot项目的启动类,在使用SpringBoot直接启动的时候,启动类的代码如下: 而现在如果我们想要部署到外部tomcat上面,就需要修改一下这个启动类,修改后的启动类如下: IDEA打包项目:点击Build-Build Artifacts-,然后进行build即可,生成的war包会放到对

    2024年02月13日
    浏览(24)
  • nacos上注册的SpringBoot项目服务,启动后服务ip地址与本机ip地址不相同

    SpringBoot项目服务启动后,nacos上注册的服务ip地址与本机ip地址不相同,导致服务无法访问 原因:SpringBoot项目注册到注册中心时,会随机访问选取一块网卡的ip地址进行注册。由于本机上存在v8虚拟网卡,导致注册的服务ip是v8虚拟网卡的ip。 虚拟机的V8虚拟网卡会影响到服务的

    2024年02月15日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包