簡體   English   中英

Servlet容器中的Java Web應用程序與獨立版本

[英]Java web application in a Servlet container vs. standalone

構建一個小型Java Web應用程序以在Servlet容器(如Tomcat)中運行與構建具有內置Web服務器的獨立Java應用程序並在反向代理后面運行它有什么好處?

我已經玩Java一年了。 我注意到啟動Tomcat需要時間,並且由於類加載器問題,並不總是可以進行熱重新部署。 對我來說,Servlet API似乎有點令人費解,特別是從配置和RESTful設計的角度來看(它並沒有真正完全支持)。

另一方面,我注意到我的IDE可以以閃電般的速度編譯和運行獨立的應用程序。 配置Apache進行反向代理是一件小事,嵌入式Jetty似乎可以處理任何我可以拋出的內容。 當我可以使用Restlet,Wicket等時,我不需要Servlet。能夠更好地了解我的應用程序是如何工作的(因為它沒有與龐大的應用程序服務器集成)讓人感覺更有能力。 堆棧跟蹤更短。 下載大小更小。 最終用戶配置更容易。 我猜測性能可能會更好,因為涉及的軟件層較少。

但是,我想起了通常聽起來好得令人難以置信的說法。 所以我的問題是,為什么我不想讓我的網絡應用程序獨立? Servlet容器給了我和/或我的最終用戶我們真正需要但不知道的是什么?

這里有兩個單獨的問題:

  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設計,但如果Restlets更好地滿足您的要求,那么使用它......

如果您不需要完整的Servlet堆棧,嵌入式Jetty可能是一個不錯的選擇。 與Tomcat不同,Jetty可以輕松擺脫您不使用的部分(JSP,JNDI等等)。

另一方面,編寫自己的HTTP服務器是一個糟糕的主意。 當然,編寫處理基本請求的東西很容易。 但很快你會發現有些客戶遇到了麻煩,因為它不支持完整的協議規范; 或者當有超過幾百個用戶時崩潰; 或者說有一個漏洞可以讓馬來西亞的一些孩子炸掉你的打印機。 所以不要重新發明輪子。

至於你抱怨Servlet API不支持RESTful設計 - 你錯過了重點,它從來沒有打算這樣做。 但是有很多REST庫在Servlet API 之上運行。

嵌入式Jetty也是一個servlet容器。 我假設您的應用程序包含一個web.xml,您可以在其中定義wicket過濾器/ servlet,RESTlet servlet及其映射(至少)。 所以你無法擺脫Servlet API(或者servlet容器,即使你嵌入它),但是你可以在框架下面以及你自己的一些main()方法中隱藏它。 RESTlet(或Jersey或任何JAX-RS實現)以及Spring MVC都基於servlet,因此Servlet API確實很好地支持REST,我會說。

PS這兩種方法並不相互排斥。 您可以在開發期間很好地使用Jetty,然后將您的戰爭部署到一些(非嵌入式)容器中進行QA /生產。 或者......如果真的適合您的需要,堅持使用Jetty進行生產。

進程內Servlet容器是在Web服務器的JVM內部工作的容器,它們提供了良好的性能但可擴展性差。

進程外容器是在Web服務器外部的JVM中工作的容器。 性能不佳但可擴展性更好在進程外容器,Web服務器和容器之間通過使用IPC等標准機制進行會話。

除了這些類型的容器之外,還有第三種類型,它是獨立的servlet容器。 這些是Web服務器不可或缺的一部分。

Servlet容器通常提供一些有用的東西,如自動會話管理,熱部署,故障轉移和集群框架等。 當然,這取決於容器,但有時這些是非常有用的工具。 有時他們不是。

編輯:剛剛注意到您對熱重新部署的評論。 是的,有時候容器很麻煩並且很難用,而且它們都有自己的怪癖。 然而,有時他們確實提供了一些非常好的東西。

如果您的熱部署存在問題,很可能您沒有清理外部連接或其他資源。 要處理這個問題,通常你想要實現一個監聽器,讓你知道什么時候啟動或停止。

你可能應該在你的戰​​爭中實現這樣的東西(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 lifecycle listener”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM