Servlet 容器中的 Java Web 应用程序与独立应用程序

2022-09-01 10:01:35

构建一个小型Java Web应用程序以在Servlet容器(如Tomcat)中运行,与构建一个具有内置Web服务器的独立Java应用程序并在反向代理后面运行相比,有什么优势?

我已经使用Java大约一年了。我注意到启动Tomcat需要时间,并且由于类加载器问题,并不总是能够进行热重新部署。Servlet API对我来说似乎有些复杂,特别是从配置和RESTful设计的角度来看(它并不完全支持)。

另一方面,我注意到我的IDE可以以闪电般的速度编译和运行独立应用程序。为反向代理配置Apache是小菜一碟,嵌入式Jetty似乎可以处理我能扔给它的任何东西。当我可以使用Reslet,Wicket等时,我不需要Servlets。能够更好地了解我的应用程序是如何工作的(因为它没有与庞大的应用程序服务器集成)感觉很有力量。堆栈跟踪更短。下载大小较小。最终用户配置更容易。我猜性能可能会更好,因为涉及的软件层更少。

然而,我想起了一句话,通常听起来好得令人难以置信的东西。所以我的问题是,为什么我不想让我的Web应用程序独立?Servlet 容器为我和/或我的最终用户提供了我们真正需要但不知道的什么?


答案 1

这里有2个单独的问题:

  1. 我应该使用嵌入式服务器,还是部署到容器中?

    我不认为你应该以某种方式看到很大的差异。以编程方式启动 Jetty 服务器的代码稍微多一些,并且以编程方式进行配置也更容易。尽管 IDE 对 Web 应用程序配置和部署的支持越来越好,但它仍然比对独立应用程序的支持更糟糕(根据定义,这有点有点,因为有一个超集需要支持)。

    另一方面,应用程序服务器为您提供了一些不错的好处,例如内置管理,内置作为服务运行的能力等。

    您甚至可以使用混合方法:使用嵌入式服务器在本地开发,然后在生产环境中部署到容器中。但这有点奇怪:如果你遇到麻烦制作一个正确的WAR文件,IDE应该真的能够充分处理部署到容器中。

    顺便说一句,奇怪的是你有热重新部署的问题;Tomcat不应该有问题,除非你遇到一些奇怪的角落案例......

  2. 我应该使用 Servlet API 吗?

    这与 #1 是正交的。你完全可以嵌入Jetty并实现Servlets。你也可以通过 ServerServlet http://www.restlet.org/documentation/1.0/faq#02 在 Tomcat 中使用 Restlet API。

    我个人认为Servlet API非常简单。你会得到一些好东西,比如并发和状态管理。我不太清楚这意味着不支持RESTful设计,但是如果Reslets更好地满足您的要求,那么请使用它...


答案 2

如果您不需要完整的Servlet堆栈,Embedded Jetty可能是一个不错的选择。与Tomcat不同,Jetty可以轻松摆脱您不使用的部分(JSP,JNDI等)。

另一方面,编写自己的HTTP服务器是一个可怕的想法。当然,编写处理基本请求的内容很容易。但很快你会发现一些客户端遇到了麻烦,因为它不支持完整的协议规范;或者当用户超过几百个时,它会崩溃;或者有一个漏洞,允许马来西亚的某个孩子炸毁你的打印机。所以不要重新发明轮子。

至于你对Servlet API不支持RESTful设计的抱怨 - 你错过了重点,它从来没有打算这样做。但是有很多 REST 库运行在 Servlet API 之上


推荐