Tomcat是一款我們平時開發過程中最常用到的Servlet容器。本系列博客會記錄Tomcat(以Tomcat 7為列)的整體架構、核心組件、IO線程模型、請求在Tomcat內部的流轉過程以及一些Tomcat調優的相關知識點。力求能達到以下幾個目的:
- 更加熟悉Tomcat的工作機制,工作中遇到Tomcat相關問題能夠快速定位,從源頭來解決;
- 對於一些高並發場景能夠對Tomcat進行調優;
- 通過對Tomcat源碼的分析,吸收一些Tomcat的設計的理念,應用到自己的軟件開發過程中。
1. 什么是Tomcat
Tomcat是一款Apache下面的開源的Servlet容器,實現了對Servlet和JSP規范的支持。另外 Tomcat 本身內含了一個 HTTP 服務器,所以也可以被當作一個 Web 服務器來使用。但是Tomcat作為一個Web服務器,它對靜態資源的處理能力要比Apache或者Nginx這類的Web服務器差很多,所以我們經常將Apache和Tomcat(或者是Nginx和Tomcat)組合使用,Apache來充當Web服務器處理靜態資源的請求,Tomcat充當Servlet容器來處理動態請求。
Web服務器和應用服務器
Web服務器,是指一台在互聯網上具有獨立IP地址的高性能計算機,可以向互聯網上的用戶提供“WWW(萬維網)、Email(電子郵件)和FTP(文件傳輸)”等各種互聯網服務。根據Web服務器提供的服務類型的不同,Web服務器又可以分為Http服務器,Email服務器和FTP服務器等。
一般的Web服務器只提供頁面瀏覽,文件下載和郵件等服務。如果要產生一些動態的響應,Web服務器一般不會自己處理,而是會委托給一些其它的程序例如CGI腳本,JSP(JavaServer Pages)腳本,servlets和ASP(Active Server Pages)等腳本。這些能處理動態響應的服務器就稱為應用服務器。
2. 技術對比
作為一名Java開發人員,你也一定聽說過或者使用過一些其他的服務器中間件軟件,比如JBOSS、Weblogic、Websphere、Apache、Nginx、Jetty和Undertow。那么這些軟件和tomcat有什么區別?各自的適用場景又是什么?下面來做下簡單的介紹。
1. Weblogic和Websphere
這邊可以將Weblogic和Websphere歸為一類,他們都是收費軟件,而且價格不菲。但是收費肯定有收費的原因,WebLogic 與 WebSphere 對業內多種標准有全面支持, 包括 EJB、 JSB、 JMS、 JDBC、XML 和 WML,使 Web 應用系統的實施更為簡單,並且保護了投資,同 時也使基於標准的解決方案的開發更加簡便。另外他們的安全性也非常高。WebLogic 和 WebSphere 的技術文檔和相關服務也很到位,如果你的服務器哪一天 出問題了,只要你能出的起錢,他們的技術工程師立刻就能出現在你面前。
2. JBOSS
JBoss 是一個管理 EJB 的容器和服務器,支持 EJB 1.1、EJB 2.0 和 EJB3.0 的 規范。但 JBoss 核心服務不包括支持 servlet/JSP 的 WEB 容器,一般與 Tomcat 或 Jetty 綁定使用。JBOSS也是免費的。
為什么Weblogic、Websphere和JBOSS等服務器在我們平時開發中很少被用到?
經過上面的介紹我們發現Weblogic和Websphere有很多優點:對業界標准全方位的支持、安全性高、對並發的支持量大以及到位的技術支持。但是為什么我們在開發過程中很少使用呢?最重要的原因還是因為這些軟件價格昂貴。現在開發過程中我們對EJB這種規范使用越來越少,而且軟件開發人員的水平逐漸提升,硬件價格下降。我們發現Weblogic和Websphere給我們帶來的優勢我們完全可以通過其他途徑獲得,為什么還要花大價錢呢?另外非開源的資料也較少,這些原因加在一起導致Weblogic和Websphere在我們平時開發中幾乎不會使用。當然如果你們公司是一個不缺錢的公司的話,完全可以使用。
至於JBoss我們發現它是通過集成Tomcat來獲得Servlet容器功能的,而它本身的EJB功能也越來越式微,JBoss的使用量自然上不去。因為現在都只需要Servlet容器功能,為什么不直接使用Tomcat呢?
3. Jetty
Jetty也是一個Servlet引擎,和Tomcat相比,Jetty的架構設計更加簡單。在性能上兩者有各自的使用場景。從架構上來看 Tomcat 在處理少數非常繁忙的連接上更有優勢,也就是說連接的生命周期如果短的話,Tomcat 的總體性能更高。而 Jetty 剛好相反,Jetty 可以同時處理大量連接而且可以長時間保持這些連接。例如像一些 web 聊天應用非常適合用 Jetty 做服務器,像淘寶的 web 旺旺就是用 Jetty 作為 Servlet 引擎。
4. Undertow
和Jetty類似,Undertow也是一個Servlet容器。
5. Apache
Apache是一款高性能的Web服務器,和Tomcat相比,Apache更加專注於提供高性能的Web服務,而Tomcat是最主要的還是被當做Servlet容器來使用的,雖然它也有Web服務的功能,但這不是Tomcat的主要功能也不是它擅長的功能。所以Apache和Tomcat能搭配成一個好的組合:Apache提供Web服務,處理靜態資源,Tomcat作為Servlet容器處理動態請求。
6. Nginx
Nginx和Tomcat的關系和Apche和Tomcat的關系差不多。Nginx也是一個高性能的Web服務器,同時我們還經常拿Nginx當做反向代理服務器和負載均衡服務器。
3. Tomcat的優缺點
Tomcat開源,免費, 經過長時間的發展(先發優勢),它已經廣泛的被市場接受和認可,相對 Jetty 和 Undertow來說 Tomcat 還是更加穩定和成熟的,尤其在企業級應用方面,Tomcat 仍然是第一選擇。