jetty淺析

jetty

Jetty是一個servlet引擎,主要有2個核心組件:
server組件和connector組件。
整個server組件是基於handler容器工作的,類似Tomcat的container容器。
connector組件負責接收客戶端的連接請求並將請求分配給一個處理隊列去執行。
Jetty所有組件的生命週期管理基於觀察者模式。
Jetty啓動過程:jetty入口是server類,server類啓動完了,jetty就可以提供服務了。
具體提供哪些服務,得看server類啓動時調用了哪些組件的start方法,這些組件是在Jetty配置文件裏配置到server上的。
server的start方法調用所有註冊到server的組件,server啓動其他組件的順序是:
首先啓動設置到server的Handler,這個Handler會有很多子Handler,這些Handler將組成一個Handler鏈,server會依次啓動這個鏈上的所有Handler,接着會啓動註冊在server上的JMX的Mbean,讓MBean也一起工作,最後啓動connector打開端口,接受請求。

Jetty的工作過程大致如下:
1.啓動jetty服務器,監聽指定的端口,如80端口,等待客戶端的連接請求;
2.收到客戶端的連接請求時,與客戶端建立TCP連接;
3.接收客戶端的數據,然後根據協議(如HTTP,AJP等)解析數據內容,將數據轉換成Servlet可識別的ServletRequest對象;
4.通過URL找到對應的Servlet,將ServletRequest轉交給Servlet處理;
5.將Servlet的處理結果(ServletResponse對象)組裝成協議報文返回給客戶端。

Jetty做爲一個獨立的servlet引擎可以獨立提供Web服務,但是它也可以與其它Web應用服務器集成。所以它可以提供基於兩種協議工作。
一個是HTTP,一個是AJP協議。
如果將Jetty集成到JBoss或者Apache,那麼就可以讓Jetty基於AJP模式工作。

jetty基本架構

它由Server,Connector,Handler,ThreadPool着四個部分組成,其中:

1.Server代表一個Jetty服務器對象,它的作用就好象一個插線板,把Connector、Handler和ThreadPool集成在一起讓它們協同起來工作。

2.Connector是連接器,它負責建立連接。當Connector接收到一個請求後,產生一個新的HttpConnection對象,然後由Server對象調用Handler來處理HttpConnection對象。HttpConnection類就是解析Http協議的地方,它提供了附屬的Request對象和Response對象。Connector和Connectioin是緊密相關的,如果一個Connector要識別特定的協議,那麼就必須對應一個Connection實現。

3.Handler是處理器,負責處理連接請求,輸出響應。

4.ThreadPool是線程池,負責管理和調度多個線程,用來服務與HTTP connections和Handler的運行。

要讓Jetty服務器工作起來,我們首先初始化一個Server對象實例,然後給它註冊一個或多個Connector對象實例、註冊一個ThreadPool對象、註冊多個Handler對象並讓這些Handler組合起來,這樣一個Jetty服務器便組裝完成了。

基於AJP工作

通常一個web服務站點的後端服務器不是將java的應用服務器直接暴露給服務訪問者,而是在應用服務器,如JBoss的前面再加一個web服務器,如Apache或者nginx,這個原因一般有日誌分析、負責均衡、權限控制、防止惡意請求以及靜態資源預加載等
下面是通常的web服務器端的架構圖:
這裏寫圖片描述
這種架構下,servlet引擎就不需要解析和封裝返回的HTTP協議,因爲HTTP協議的解析工作已經在Apache或Nginx服務器上完成了。JBoss只有基於簡單的AJP協議工作就可以了,加速請求的響應速度。
對比HTTP協議,兩者的邏輯幾乎是相同的,不同的是替換了一個類 Ajp13Parsse而不是HttpParser,它定義瞭如何處理AJP協議以及需要哪些類來配合。
AJP處理請求相比較HTTP時唯一的不同就是在讀取到socket數據包時,如何來轉換這個數據包。
按照HTTP協議的包格式來解析就是HttpParser。按照AJP協議來解析就是Ajp13Parser。封裝返回也是如此。

讓Jetty工作在AJP協議下,需要配置connector的實現類爲Ajp13SocketConnector這個類繼承了SocketConnector類,覆蓋了父類的newConnection方法,爲的是創建Ajp13Connection對象而不是HttpConnection。這樣會使用Ajp13Parser類來解析AJP協議。
鏈接:jetty源碼解析https://www.skyreal.me/jetty-yuan-ma-fen-xi/