构建一个小型Java Web应用程序以在Servlet容器(如Tomcat)中运行与构建具有内置Web服务器的独立Java应用程序并在反向代理服务器后面运行它有什么好处?
我已经玩Java一年了。我注意到启动Tomcat需要时间,而且由于类加载器问题,并不总是可以进行热重新部署。对我来说,Servlet API似乎有点令人费解,特别是从配置和RESTful设计的角度来看(它并没有真正完全支持)。
另一方面,我注意到我的IDE可以快速编译和运行一个独立的应用程序。配置Apache进行反向代理是一件小事,嵌入式Jetty似乎可以处理任何我可以抛出的内容。当我可以使用Restlet,Wicket等时,我不需要Servlet。能够更好地了解我的应用程序的工作方式(因为它没有与庞大的应用程序服务器集成)让人感觉更有能力。堆栈跟踪更短。下载大小更小。最终用户配置更容易。我猜测性能可能会更好,因为涉及的软件层较少。
然而,我想起了一个说法,通常听起来好得令人难以置信。所以我的问题是,为什么我不想让我的网络应用程序独立? Servlet容器给了我和/或我的最终用户我们真正需要但不了解的内容是什么?
答案 0 :(得分:13)
这里有两个单独的问题:
我应该使用嵌入式 服务器,还是部署到容器中?
我认为你不应该看到一个 这种或那种方式差异很大。 还有更多的代码 启动Jetty服务器 以编程方式和配置 以编程方式更容易。 即使IDE支持Web应用程序 配置和部署是 变得更好,它仍然更糟 而不是独立的应用程序 (这有点像定义,因为 有一个超集的东西 支持)。
另一方面,app服务器提供 你有一些像内置的好处 管理,内置的运行能力 作为服务等
你甚至可以使用混合动力车 方法:使用嵌入式服务器 在本地开发,然后部署到 生产中的容器。但那是 有点奇怪:如果你经历过 制作正确的WAR文件的麻烦, IDE应该真的能够处理 部署到容器中 充分。
顺便说一句,你有问题很奇怪 热重新部署; Tomcat不应该 除非有问题 你遇到了一些奇怪的事 角落案件......我应该使用Servlet API吗?
这与#1正交。您 可以很好地嵌入Jetty和 实现Servlets。你也可以 在Tomcat中使用Restlet API 通过ServerServlet http://www.restlet.org/documentation/1.0/faq#02
我个人发现Servlet API 非常直接。你明白了 好的东西,如并发和 国家管理。我不太清楚 这意味着RESTful设计 不支持,但如果是Restlets 更好地满足您的要求, 那就用......
答案 1 :(得分:5)
如果您不需要完整的Servlet堆栈,嵌入式Jetty可能是一个不错的选择。与Tomcat不同,Jetty可以轻松摆脱您不使用的部分(JSP,JNDI等等)。
另一方面,编写自己的HTTP服务器是一个糟糕的主意。当然,编写处理基本请求的东西很容易。但很快你会发现有些客户遇到了麻烦,因为它不支持完整的协议规范;或者当有超过几百个用户时崩溃;或者说有一个漏洞可以让马来西亚的一些孩子炸掉你的打印机。所以不要重新发明轮子。
至于你抱怨Servlet API不支持RESTful设计 - 你忽略了这一点,它从来没有打算这样做。但是有很多REST库在 Servlet API上运行。
答案 2 :(得分:3)
嵌入式Jetty也是一个servlet容器。我假设您的应用程序包含一个web.xml,您可以在其中定义wicket过滤器/ servlet,RESTlet servlet及其映射(至少)。所以你无法摆脱Servlet API(或者servlet容器,即使你嵌入它),但是你可以在框架下面以及你自己的一些main()方法中隐藏它。 RESTlet(或Jersey或任何JAX-RS实现)以及Spring MVC都基于servlet,因此Servlet API确实很好地支持REST,我想说。
P.S。 这两种方法并不相互排斥。您可以在开发期间很好地使用Jetty,然后将您的战争部署到一些(非嵌入式)容器中进行QA /生产。或者......如果真的适合您的需要,坚持使用Jetty进行生产。
答案 3 :(得分:0)
Servlet容器通常提供许多有用的东西,如自动会话管理,热部署,故障转移和集群框架等。当然,这取决于容器,但有时这些是非常有用的工具。有时他们不是。
编辑:刚刚注意到您对热重新部署的评论。是的,有时候容器很麻烦并且很难用,而且它们都有自己的怪癖。然而,有时他们确实提供了一些非常好的东西。
答案 4 :(得分:0)
进程内Servlet容器是在Web服务器的JVM内部工作的容器,这些容器提供了良好的性能,但是在可扩展性方面很差。
进程外容器是在Web服务器外部的JVM中工作的容器。性能差,但可扩展性更好 对于进程外容器,Web服务器和容器通过使用IPC等标准机制相互协商。
除了这些类型的容器之外,还有第三种类型,它是独立的servlet容器。这些是Web服务器不可或缺的一部分。
答案 5 :(得分:-1)
如果您的热部署出现问题,很可能您无法清理外部连接或其他资源。要处理这个问题,通常你想要实现一个监听器,让你知道什么时候启动或停止。
你应该在你的战争中实现类似这样的东西(tomcat 6):
public class MyTomcatInitCleanupListener implements ServletContextListener
{
@Override
public void contextInitialized(ServletContextEvent arg0)
{
super.contextInitialized(arg0);
}
@Override
public void contextDestroyed(ServletContextEvent arg0)
{
super.contextDestroyed(arg0);
}
}
对于tomcat 7+,你可以google" tomcat生命周期监听器"