之前寫一個簡單易用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,可見標准化是多么重要。
版權聲明:本文博主原創文章,博客,未經同意不得轉載。