在Tomcat内部托管Netty服务器可行/可取吗?

14
我们正在构建一个基于Netty/NIO的服务,我正在考虑将此服务部署到我们的生产环境中。我们部署服务的标准方式是作为WAR文件,部署在Tomcat内部。
当我提出同样的方法时,我遭到了抱怨和批评,因为Netty和Tomcat都是服务器,"在另一个服务器中托管一个服务器没有意义"。
对我来说,这完全解决了我的部署问题,并且使我免于编写其他代码。为什么这是一个如此大的"不推荐"呢?

你能更具体地说明一下你的“部署问题”以及“帮我避免了编写其他代码”的情况吗? - Romain Hippeau
我们的操作人员有一些脚本,可以将WAR文件部署到各种Tomcat服务器中并进行启动/停止等操作... 如果我不是在Tomcat中托管它而是作为一个独立的jar包,那么这些脚本需要进行调整。我所提到的“其他代码”是通过HTTP公开服务方法的代码 - 我们已经有了通过标准HTTP servlet这样做的代码,现在我们需要重新实现。问题是 - 将其托管在Tomcat中有什么问题呢? - ripper234
重新部署WAR有什么问题吗?好处是您拥有一个统一的代码片段,如果需要,可以回滚到该片段。 - Romain Hippeau
3个回答

18

Tomcat提供的动态WAR部署和卸载是为Web应用程序而设计的。您要部署到Tomcat的Netty应用程序不是Web应用程序,而只是一个独立的服务器,仅共享VM内存。这意味着Tomcat已被重新定位为通用微内核(例如OSGi)。

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

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


2
我们新的公司标准是使用war进行部署,几乎每个应用程序都使用netty或Mina作为我们专有协议。只需要小心关闭,但到目前为止没有大问题。现在如果netty可以为spring mvc做servlets,那就万事大吉了。 - Jason

7

这是非常明智的选择。事实上,我们在Tomcat中运行了一个Java邮件服务器。

Tomcat作为应用程序的托管有以下巨大优势:

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

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


1

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


我在生产中使用过这种方法,它很有效。结合Maven和Jenkins使用更加有趣。 - miloxe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接