引言 java
該文主要參考了玄霄的分享,感受他分享的比較細。 web
應用服務器目錄結構 服務器
因爲須要用到jetty的websocket開發,所以選用的版本是8.1.7,從上圖能夠看到,主要有下面幾個主要目錄: websocket
一、bin目錄 架構
啓動腳本的目錄,也包括了start.jar,主要是用來起引導做用的,引導資源加載和服務的啓動。 app
二、etc目錄 eclipse
配置文件的目錄,也包括了start.ini,這份配置文件是用來指導start.jar的加載順序和加載模塊的,這個後面會有詳解。 webapp
三、lib目錄 socket
庫文件目錄,若是須要調試jetty的話,能夠下載源碼加到eclipse中,客戶端遠程調試便可,命令: java -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8090 -DEOS_DEBUG=true -jar start.jar 學習
四、webapps目錄
應用部署目錄
應用服務器啓動流程
一、【流程圖】
二、【start.jar】
能夠看到,最後將server啓動起來了,而jetty最核心的即server類,學習jetty的同窗不防直接從server類的doStart()或者handle(...)入手。
三、【server.start】
這幾段代碼說明了一個服務器最重要的幾個模塊分別是:
都很抽象了有木有,那咱們來點實際的,看看jetty服務器是如何的,下面是jetty.xml的配置:
其實服務器的架構大同小異,最基本的4個組件老是不可或缺的,最後一個deployService是用來管理和部署應用的,他管理能夠部署的工程類型,並管理着每一個工程部署的生命週期。
四、【deployService】
管理了三類工程的部署,掃描工程的部署目錄,匹配部署器,並執行工程的部署,到此,大體流程應如此:
五、【HttpService】
感受該service纔是最重要的模塊,也是應用服務器設計的瓶頸所在。
顧名思義,爲每一個鏈接起個線程去處理,固然TomCat默認採用BIO,而Jetty默認是NIO,關於JETTY NIO的詳細描述見後面的文章。
WebModule
你可曾想過,要實現servlet規範,一個web應用的WebModule須要哪些東西才能正常運做,能夠服務用戶的請求。
應該須要classloader來加載應用的資源,還須要context來指導server識別本身,還須要servlet,還須要filter,還須要初始化方法和請求的hanlder方法,最後須要製造request和response的方法等,以下圖,所以產生了該web模型:
我的感受是服務器驅動了servlet規範的產生,若是你要更方便理解的話,能夠等價於webdefault.xml。
而後一個web部署器管理了一個webModule集:
接下來看看WebModule是如何處理一次請求的:
代碼片斷以下:
Jetty架構
注:默認的是NIO而不是BIO