Servlet,Tomcat,Jetty,Netty,Mina 對比


Servlet, Tomcat, Jetty, Netty,Mina


結論

先說結論吧: Servlet是一種Java EE規范,Tomcat & Jetty是Servlet容器,Tomcat包含了Servlet。Servlet本身並不能處理外部請求,需要Servlet容器的配合,Netty和MINA是網絡框架,我們可以使用Netty造出自己類似Tomcat的web服務器。簡單的關系的話 Tomcat = Jetty > Netty & MINA > Servlet。

Servlet

wiki上的定義:

Servlet 是用 Java 編寫的服務器端程序。其主要功能在於交互式地瀏覽和修改數據,生成動態 Web 內容。狹義的 Servlet 是指 Java 語言實現的一個接口,廣義的 Servlet 是指任何實現了這個 Servlet 接口的類,一般情況下,人們將 Servlet 理解為后者。


Tomcat

wiki的定義:

Tomcat 是由 Apache 軟件基金會下屬的 Jakarta 項目開發的一個 Servlet 容器,按照 Sun Microsystems 提供的技術規范,實現了對 Servlet 和 JavaServer Page(JSP) 的支持,並提供了作為 Web 服務器的一些特有功能,如 Tomcat 管理和控制平台、安全域管理和 Tomcat 閥等。由於 Tomcat 本身也內含了一個 HTTP 服務器,它也可以被視作一個單獨的 Web 服務器。但是,不能將 Tomcat 和 Apache HTTP 服務器混淆,Apache HTTP 服務器是一個用C語言實現的 HTTPWeb服務器;這兩個 HTTP web server 不是捆綁在一起的。Apache Tomcat 包含了一個配置管理工具,也可以通過編輯XML格式的配置文件來進行配置。

wiki 上跟進的很快也改成 Jakarta 了。

默認使用BIO。支持(BIO, NIO, APR(Apache Portable Runtime/Apache可移植運行庫))apr其實也是nio,是操作系統級別的支持

http協議


Jetty

wiki的定義:

Jetty是一個純粹的基於Java的網頁服務器和Java Servlet容器。盡管網頁服務器通常用來為人們呈現文檔,但是Jetty通常在較大的軟件框架中用於計算機與計算機之間的通信。Jetty作為Eclipse基金會的一部分,是一個自由和開源項目。該網頁服務器被用在Apache ActiveMQ[2]、Alfresco[3]、Apache Geronimo[4]、Apache Maven、Apache Spark、Google App Engine[5]、Eclipse[6]、FUSE[7]、Twitter’s Streaming API[8]、Zimbra[9]等產品上。Jetty也是Lift、Eucalyptus、Red5、Hadoop、I2P等開源項目的服務器。[10] Jetty支持最新的Java Servlet API(帶JSP的支持),支持SPDY和WebSocket協議。

Jetty 是一個Web服務器(HTTP),類似於Tomcat等,但比大多數servlet容器都要輕。這更接近傳統的Java服務器應用程序(servlet,WAR文件)的方式。與Netty一樣,它足夠輕巧,可以嵌入到Java應用程序中。

默認使用NIO。支持(BIO, NIO, AIO(jetty9))

http協議


Netty

wiki的定義:

Netty is a non-blocking I/O client-server framework for the development of Java network applications such as protocol servers and clients. The asynchronous event-driven network application framework and tools are used to simplify network programming such as TCP and UDP socket servers.[2] Netty includes an implementation of the reactor pattern of programming.

翻譯如下:

Netty是一個基於NIO客戶端-服務端框架,提供給諸如協議服務端與客戶端的Java網絡應用。異步事件驅動網絡應用框架和工具用來簡化TCP和UDP網絡編程。Netty包括了一種響應式編程的實現。

使用NIO。

tcp/udp協議


Mina

wiki的定義:

Apache MINA (Multipurpose Infrastructure for Network Applications)[1] is an open source Java network application framework. MINA can be used to create scalable, high performance network applications. MINA provides unified APIs for various transports like TCP, UDP, serial communication. It also makes it easy to make an implementation of custom transport type. MINA provides both high-level and low-level network APIs.

翻譯如下

Apache MINA 是一個開源Java網絡應用框架。MINA可以創建表現良好的網絡應用。MINA為各中通訊機制比如TCP,UDP提供統一的API。並且也可以很方便的實現一個自定義通訊方案。MINA提供高層和底層的API。

tcp/udp協議


關系

Servlet 一種規范

Servlet是並不是對網絡服務器的封裝,而是JEE規范當中的一個。所以它可以支持多層用戶協議。

Tomcat & Jetty 輕量級服務器

它們倆是同一級別的,都是Servlet容器。對於Servlet容器的工作機制這里有一篇很棒的blog Servlet 工作原理解析

Netty & MINA 網絡編程框架

Netty是基於NIO的,Netty也像wiki介紹中說的Netty在很多大型項目中使用,之前文章中的 ElasticSearch transport也使用了Netty。MINA也是NIO框架,和Netty處於同一級別。下面是它們的區別:

  1. mina比netty出現的早,都是Trustin Lee的作品;

  2. mina將內核和一些特性的聯系過於緊密,使得用戶在不需要這些特性3的時候無法脫離,相比下性能會有所下降;netty解決了這個設計問題;

  3. netty的文檔更清晰,很多mina的特性在netty里都有;

  4. netty更新周期更短,新版本的發布比較快;

  5. 它們的架構差別不大,mina靠apache生存,而netty靠jboss,和jboss的結合度非常高,netty有對google protocal buf的支持,有更完整的ioc容器支持(spring,guice,jbossmc和osgi);

  6. netty比mina使用起來更簡單,netty里你可以自定義的處理upstream events 或/和 downstream events,可以使用decoder和encoder來解碼和編碼發送內容;

  7. netty和mina在處理UDP時有一些不同,netty將UDP無連接的特性暴露出來;而mina對UDP進行了高級層次的抽象,可以把UDP當成”面向連接”的協議,而要netty做到這一點比較困難。mina把TCP和UDP一樣當”有連接”的處理,一個UDP請求會按照address產生一個新的 IoSession,過期時間是1分鍾,這樣做的好處是顯然的,但是對於有性能要求的項目就不好了,對一個無連接的東西cache 1分鍾,大多數時候可能是白cache了,做無用功。 Mina這樣做可能還有個初衷是連續解碼用的,比如一個包太大了,分了兩次傳輸;但是這樣的設計應該是udp大忌了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM