快速學習Jetty-初識Jetty
- 2019 年 11 月 5 日
- 筆記
簡單來講 Jetty 就是一個 開源HTTP 伺服器和Servlet 引擎,它可以為 JSP 和 Servlet 提供運行時環境。比如 Java web 應用最常用的 Servlet 容器 Tomcat。由於其輕量、靈活的特性,Jetty 也被應用於一些知名產品中,例如 ActiveMQ、Maven、Spark、GoogleAppEngine、Eclipse、Hadoop 等。
為什麼要使用Jetty
- 非同步的 Servlet,支援更高的並發量
- 模組化的設計,更靈活,更容易訂製,也意味著更高的資源利用率
- 在面對大量長連接的業務場景下,Jetty 默認採用的 NIO 模型是更好的選擇
- 將jetty嵌入到應用中,使一個普通應用可以快速支援 http 服務
作為一個開源的 HTTP 伺服器和 Servlet 容器,Jetty 已經在尺寸、性能以及可拓展性上超過絕大多數其他的 WEB 伺服器。因其高拓展的特性,我們可以很輕鬆的對其增加一些特殊的組件。當然,伺服器資源是珍貴的,我們完全可以將 Jetty 中的一些不必要的組件剔除,只留下我們所需要的組件,提高對伺服器資源的利用率。在性能方面,Jetty 採用的 NIO 可以讓我們處理更大量級的 WebSocket 連接,當然在處理靜態資源上也更快。
Jetty的基本架構
Jetty 的架構比較簡單, 是一個擴展性和靈活性都非常好的伺服器. 在 Jetty 中有個很重要的數據模型 Handler, Jetty 的高擴展性和靈活性主要就是來自於這個數據模型 Handler. 所有的拓展組件都可以作為一個 Handler, 而這些 Handler 都可以被添加到 Server 中, 讓 Jetty 幫你進行管理. 從下圖來看, Jetty 有兩個核心組件, Server 和 Connector. 其中 Server 是基於 Handler 容器工作了, 提到容器, 它與 Tomcat 的 Container 比較相似. 後面會詳細介紹 Jetty 與 Tomcat 的比較. 另一個核心組件就是 Connector, 他的主要職責是接收客戶端請求, 並將該請求分配給一個處理隊列去執行.

Jetty與Tomcat的區別
同樣作為 Servlet 引擎,Tomcat 自然是不得不提的了。Tomcat 的成名時間早於 Jetty,它已經廣泛的被市場接受和認可,相對於 Jetty 來說 Tomcat 還是比較穩定和成熟,尤其是在企業級應用方面,Tomcat 任然是第一選擇。不過 Jetty 在架構方面的諸多優勢,也讓 Jetty 的市場份額不斷提高。發展至今,Jetty 已經不單單只是一款 Java Web 伺服器和 Servlet 容器,而是一款功能強大的工具集。他的諸多特性都能夠滿足現在流行的服務端架構模式,包括開發、部署以及運維。
Jetty 與 Tomcat 相比,主要的一些區別如下:
- Jetty 可以比較方便的貼合第三方框架,比如可以直接在 Spring 中配置 Jetty 伺服器、也可以將會話交給 NoSql 資料庫進行管理
- Jetty 提供組件化的方式直接將 Jetty 作為 HTTP 組件集成到應用中,從而使應用快速支援 HTTP 服務
- 從架構上來看,Jetty 可以說是面向 Handler 的架構,它的所有組件都是基於 Handler 實現的。而 Tomcat 則是面向容器的架構,它是以容器封層的方式去提高拓展性
- 性能方面來看,它們之間的區別主要在於處理短連接與長連接上,Tomcat 在處理生命周期較短的連接比較有優勢。而 Jetty 則剛好相反,Jetty 默認採用的 NIO 技術在處理大量長連接時比較有優勢,並且在靜態資源的處理上 Jetty 的 NIO 也更勝一籌
- 從功能特性來看,Jetty 的更新速度是要高於 Tomcat 的,比如 Jetty 9.3 版本開始支援 HTTP/2 的支援,而 Tomcat 9 版本才開始支援 HTTP/2
- Jetty 的高度模組化使我們可以很方便的對一些依賴的組件進行管理,在將 Jetty 嵌入項目使用時,我們可以隨便通過 Maven 去添加我們所需的一些其他的模組,如 WebSocket。而 Tomcat 在這方面則比較欠缺
綜合來看,Tomcat 容器分層的架構體系更為成熟,能夠滿足各種場景的部署需求,而 Jetty 則更加輕量。Jetty 比較適合組件化應用,集成到應用系統中提供 HTTP 服務。Jetty 更適組件化的應用,將其集成到應用系統中提供 HTTP 服務,也適合於以更輕量的方式管理與部署應用服務,如微服務。

