之前寫過一篇簡單使用Jetty的文章,Jetty對于做JAVA Web方面開發的人來說并不陌生,他是一個servlet容器,不過相對Tomcat來說設計的比較簡單,而且使用起來也比較簡單靈活,我是在學習和使用openfire時接觸的Jetty,openfire使用Jetty開發其強大的管理背景。
在我最近的一個項目裡我也想用Jetty來開發一個背景管理程式,不過用Jetty來開發背景管理程式的缺點在于叢集環境下,對于叢集環境下的管理背景最好用Tomcat這樣的單獨部署起來,友善管理。
先從代碼簡單地介紹下Jetty的幾個核心:
核心類:org.mortbay.jetty.Server
核心接口:org.mortbay.component.LifeCycle
核心線程池封裝:org.mortbay.thread.QueuedThreadPool
核心IO處理類:org.mortbay.jetty.nio.SelectChannelConnector
核心Servlet處理類:org.mortbay.jetty.servlet.ServletHandler
根據對源碼的Debug跟蹤,我畫了一個簡單的運作原理圖,該圖說明了Jetty如何HTTP請求:

圖1-- Jetty運作原理圖
我在windows上調試的Jetty,是以這裡沒有epoll,隻有selector的IO多路複用模型。
以下是我調試時的截圖:
圖2-- 調試截圖
圖2要從下往上看線程模型。
可以看出雖然處理連接配接請求的線程處理具體請求資料的線程都由QueuedThreadPool管理,但這卻是兩個完全不同的線程,在設計模式裡這其實是觀察者模式的展現,也叫釋出與訂閱模式。在NIO裡,流程的進行基本上是事件驅動的,也就是沒有事件就休息。
Jetty的原理基于NIO,這裡簡單地說一下selector的IO多路複用思想:
1,監聽者注冊要監聽的事件類型到管理器中;
2,當有事件注冊到管理器裡時,若有監聽者注冊的類型的事件,管理器就将此事件通知給之前注冊的監聽者;
3,監聽者拿到事件後将其從管理器中删除并對其進行相關的處理。
這裡建議讀者去了解下觀察者模式,畢竟他的思想還是應用挺廣的。
Jetty裡還有兩個關鍵的工具就是将Http的請求資料解析的工具類:org.mortbay.jetty.HttpParser 和用于生成響資料的工具類:org.mortbay.jetty.HttpGenerator,讀這兩個類的同時可以了解下HTTP協定和Servlet規範。
由于HTTP的底層是TCP/IP,是以這裡給出一個直覺的TCP連接配接,當然這裡用的是Socket實作的:
這是我用本地的浏覽器連接配接測試的,可以看出一些連接配接相關的參數。
當然,Jetty還支援HTTPS,如下:
和Tomcat相同,需要安全證書,可以用JDK生成一個證書,然後測試一下Jetty的HTTPS連接配接,這個以後再續,感興趣可以研究下TLS,最近暴SSL3.0和openssl都不安全,雖然TLS是在SSL3.0上标準化的,但TLS對SSL3.0的不合理之處進行了修改,畢竟标準化了還是可靠的。
關于TLS的題外話:蘋果宣布其APNS對SSL3.0關閉了,我仔細看了一下我們項目中的代碼,原來我們一直用的都是TLS,可見标準化是多麼重要。