剖析Jetty實現原理

之前寫一個簡單易用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,可見標準化是多麼重要。