我们构建了一个基于 Netty/NIO 的服务,我正在考虑将该服务部署到我们的生产环境中。我们部署服务的标准方式是作为 WAR,部署在 Tomcat 中。
当我在这里提出相同的方法时,我得到了“不应该这样做”的喊叫和抱怨,因为 Netty 和 Tomcat 都是服务器,并且“在另一个服务器上托管一个服务器没有意义”。
对我来说这很有意义,因为它完全解决了我的部署问题,并且让我免于编写其他代码。为什么会有这么大的“不不”?
我们构建了一个基于 Netty/NIO 的服务,我正在考虑将该服务部署到我们的生产环境中。我们部署服务的标准方式是作为 WAR,部署在 Tomcat 中。
当我在这里提出相同的方法时,我得到了“不应该这样做”的喊叫和抱怨,因为 Netty 和 Tomcat 都是服务器,并且“在另一个服务器上托管一个服务器没有意义”。
对我来说这很有意义,因为它完全解决了我的部署问题,并且让我免于编写其他代码。为什么会有这么大的“不不”?
Tomcat 提供的动态 WAR 部署和取消部署是为 Web 应用程序设计的。您尝试部署到 Tomcat 中的 Netty 应用程序不是 Web 应用程序,而只是一个仅共享 VM 内存的单独服务器。这意味着 Tomcat 已被重新用于通用微内核,例如 OSGi。
不过,我不认为这是一个大问题。由于您的公司使用 WAR 作为标准部署机制,因此重用它可能是一个好主意。你甚至不需要编写远程关机之类的管理功能,因为 Tomcat 已经提供了它们。您需要做的就是确保在取消部署时释放所有资源。
有些人可能不喜欢这种方法。理想情况下,应该有一个通用的基础设施来部署和管理任何应用程序(又名微内核),甚至 Tomcat 也被部署为一个模块,而微内核直接管理 WAR,而不是 Tomcat。但这还有很长的路要走。
这很有意义。实际上,我们在 Tomcat 中运行一个 Java 电子邮件服务器。
Tomcat 在容纳应用程序方面有一些巨大的优势:
现在使用 Netty、Mina 或任何事件驱动的网络技术,您将无法使用大多数 MVC 框架。事实上,您将无法使用大多数 Java 企业框架,因为很多事情都依赖于每个请求的线程(事务、安全等)。
不要在Tomcat中启动任何东西,这很不方便,而且这有很多痛苦的问题。只需将 Tomcat(或 Jetty)嵌入到您的应用程序中,然后将您的应用程序作为纯 java 进程运行。