【问题标题】:Is hosting a Netty Server inside Tomcat feasible/desirable?在 Tomcat 中托管 Netty 服务器是否可行/可取?
【发布时间】:2011-03-12 18:59:59
【问题描述】:

我们构建了一个基于 Netty/NIO 的服务,我正在考虑将该服务部署到我们的生产环境中。我们部署服务的标准方式是作为 WAR,部署在 Tomcat 中。

当我在这里提出相同的方法时,我得到了“不应该这样做”的喊叫和抱怨,因为 Netty 和 Tomcat 都是服务器,并且“在另一台服务器上托管一个服务器没有意义”。

对我来说这很有意义,因为它完全解决了我的部署问题,并且让我免于编写其他代码。为什么是这么大的“不不”?

【问题讨论】:

  • 您能否更具体地谈谈您的“部署问题”以及“让我免于编写其他代码”?
  • @Romain - 我们的操作人员有脚本,这些脚本可以获取 WAR 并将它们部署到各种 tomcat,停止/启动它们/等等...如果我不在 Tomcat 中托管它,而是作为独立的jar,那么这些脚本需要调整。我所指的“其他代码”是通过 HTTP 公开服务方法——我们已经有了通过标准 HTTP servlet 执行此操作的代码,现在我们需要重新实现它。问题是 - 仅将其托管在 Tomcat 中有什么问题?
  • 重新部署 WAR 有什么问题?好处是你有一个统一的代码,如果需要,你可以回滚到。

标签: java deployment tomcat nio netty


【解决方案1】:

Tomcat 提供的动态 WAR 部署和取消部署是为 Web 应用程序设计的。您尝试部署到 Tomcat 中的 Netty 应用程序不是 Web 应用程序,而只是一个仅共享 VM 内存的单独服务器。这意味着 Tomcat 已被重新用于通用微内核,例如 OSGi。

不过,我认为这不是什么大问题。由于您的公司使用 WAR 作为标准部署机制,因此重用它可能是个好主意。你甚至不需要编写远程关机之类的管理功能,因为 Tomcat 已经提供了它们。您需要做的就是确保在取消部署时释放所有资源。

有些人可能不喜欢这种方法。理想情况下,应该有一个通用的基础设施来部署和管理任何应用程序(又名微内核),甚至 Tomcat 都被部署为一个模块,而微内核直接管理 WAR,而不是 Tomcat。但这还有很长的路要走。

【讨论】:

  • 我们的新公司标准是部署为战争,几乎每个应用程序都使用 netty 或 Mina 作为我们的专有协议。只需要小心关闭,但到目前为止没有大问题。现在,如果 netty 可以为 spring mvc 做 servlet,我们就万事大吉了。
【解决方案2】:

这很有意义。事实上,我们在 Tomcat 中运行一个 Java 电子邮件服务器。

Tomcat 在容纳应用程序方面有一些巨大的优势:

  1. 已经为您编写了守护程序脚本
  2. Tomcat 允许热部署(只要您不使用休眠 :))
  3. 在某些时候,您可能需要管理 UI 或管理 API
  4. 有很多工具可以监控 Tomcat,这意味着可以免费监控您的应用。

现在使用 Netty、Mina 或任何事件驱动的网络技术,您将无法使用大多数 MVC 框架。事实上,您将无法使用大多数 Java 企业框架,因为很多事情都依赖于每个请求的线程(事务、安全等...)。

【讨论】:

    【解决方案3】:

    不要在Tomcat中启动任何东西,这很不方便,而且这有很多痛苦的问题。只需将 Tomcat(或 Jetty)嵌入到您的应用程序中,然后将您的应用程序作为纯 java 进程运行即可。

    【讨论】:

    • 我在生产中使用了这种方法几次,它很有效。使用 maven 和 jenkins 会更有趣。
    猜你喜欢
    • 1970-01-01
    • 2015-10-14
    • 2010-09-17
    • 2023-03-13
    • 2023-02-15
    • 2011-02-24
    • 2015-02-16
    • 2019-08-29
    • 1970-01-01
    相关资源
    最近更新 更多