【问题标题】:What issues can arise from including spring-boot-starter-tomcat when deploying to a Tomcat server?部署到 Tomcat 服务器时包含 spring-boot-starter-tomcat 会出现什么问题?
【发布时间】:2019-01-27 01:32:57
【问题描述】:

我将 Spring MVC Web 服务转换为 Spring Boot(使用 spring-boot-starter-web)。该服务被打包为 .war 并已部署到 Tomcat 8 服务器,但我忘记显式添加 spring-boot-starter-tomcat 依赖项并将其标记为按照 Spring's traditional deployment instructions 提供。

该服务的行为似乎正确,即所有端点都返回或发布正确的数据,并且我在服务器或应用程序日志中看不到任何错误。

我们有一个每月发布周期,所以我目前计划在下个月更正这个。但是,我想了解任何潜在的影响,以防我遗漏某些东西并考虑在非周期内修复它。根据我的研究,似乎大多数问题都发生在部署/启动时,但服务正在成功部署和启动。现在是否可能有 2 个服务实例正在运行,即嵌入式 Tomcat 和实际的 Tomcat 服务器?还有其他潜在的错误或定时炸弹吗?

【问题讨论】:

    标签: java spring spring-boot tomcat


    【解决方案1】:
    • 如果您有 2 个运行的 tomcat 实例,它将在不同的端口上运行,因此可以通过一些 netstat 命令或 ps -ef | 看到。 grep java 显示所有正在运行的 java 进程。使用 ps 将返回的参数,您会很容易识别出您的
    • 如果你有 2 个 webapps 使用同一个 tomcat,contextPath 会不同,所以我猜在日志中可见,或者在管理器中(如果可用)或 jmx 控制台中可见
    • 为确保不存在风险,尽可能要求复制服务器并尝试部署spring的指令方式
    • 如果您有一个旧的 tomcat 正在运行并且它不是您想要的,那么您只需担心安全漏洞,它可能没有按照您的意愿进行配置并且可能会暴露漏洞(我猜是更糟糕的情况)。

    【讨论】:

    • 是的,我今天早上确实发现嵌入式实例和部署的实例都在运行。正如您所说,它们使用不同的上下文路径(使用 .war 文件名的部署版本和嵌入式版本使用空上下文路径)。客户端正在调用正确的上下文路径,所以我的理解是该服务的一个额外版本正在运行,但实际上应该没有任何内容。
    • 确保不需要的实例实际上无法访问以作为快速检查,但无论如何都应该停止它,因为即使它没有使用它也会在垃圾收集器运行时使用内存和一些 CPU 等资源,并且如果您的应用包含一些 cron/计划的工作。看看这个baeldung.com/spring-boot-war-tomcat-deploy 了解如何构建一个不包括可执行 jar 的战争,然后摆脱不需要的实例。这才是你真正想要的对吧? ;)
    • 这个关于 SO 的其他答案也可以帮助构建可以部署在常规 tomcat stackoverflow.com/a/24744389/2820344 中的战争。希望这会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 2016-01-29
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    相关资源
    最近更新 更多