Jetty 的工作原理

Jetty 目前的是一個比較被看好的 Servlet 引擎晰韵,它的架構(gòu)比較簡單吨些,也是一個可擴展性和非常靈活的應(yīng)用服務(wù)器鹏倘,它有一個基本數(shù)據(jù)模型,這個數(shù)據(jù)模型就是 Handler嘹害,所有可以被擴展的組件都可以作為一個 Handler撮竿,添加到 Server 中,Jetty 就是幫你管理這些 Handler笔呀。

基本架構(gòu)

下圖是 Jetty 的基本架構(gòu)圖幢踏,整個 Jetty 的核心組件由 Server 和 Connector 兩個組件構(gòu)成。
Server 組件是基于 Handler 容器工作的许师,它類似與 Tomcat 的 Container 容器
Connector房蝉,它負責(zé)接受客戶端的連接請求,并將請求分配給一個處理隊列去執(zhí)行

Jetty 的主要組件的類圖

從上圖可以看出整個 Jetty 的核心是圍繞著 Server 類來構(gòu)建微渠,Server 類繼承了 Handler搭幻,關(guān)聯(lián)了 Connector 和 Container。Container 是管理 Mbean 的容器逞盆。Jetty 的 Server 的擴展主要是實現(xiàn)一個個 Handler 并將 Handler 加到 Server 中檀蹋,Server 中提供了調(diào)用這些 Handler 的訪問規(guī)則。
整個 Jetty 的所有組件的生命周期管理是基于觀察者模板設(shè)計云芦,它和 Tomcat 的管理是類似的俯逾。下面是 LifeCycle 的類關(guān)系圖


每個組件都會持有一個觀察者(在這里是 Listener 類贸桶,這個類通常對應(yīng)到觀察者模式中常用的 Observer 角色)集合,當 start桌肴、fail 或 stop 等事件觸發(fā)時刨啸,這些 Listener 將會被調(diào)用,這是最簡單的一種設(shè)計方式识脆,相比 Tomcat 的 LifeCycle 要簡單的多设联。

Jetty 主要提供了兩種 Handler 類型,
一種是 HandlerWrapper灼捂,它可以將一個 Handler 委托給另外一個類去執(zhí)行离例,如我們要將一個 Handler 加到 Jetty 中,那么就必須將這個 Handler 委托給 Server 去調(diào)用悉稠。配合 ScopeHandler 類我們可以攔截 Handler 的執(zhí)行宫蛆,在調(diào)用 Handler 之前或之后,可以做一些另外的事情的猛,類似于 Tomcat 中的 Valve耀盗;
另外一個 Handler 類型是 HandlerCollection,這個 Handler 類可以將多個 Handler 組裝在一起卦尊,構(gòu)成一個 Handler 鏈叛拷,方便我們做擴展。

Jetty 的啟動過程

Jetty 的入口是 Server 類岂却,Server 類啟動完成了忿薇,就代表 Jetty 能為你提供服務(wù)了。它到底能提供哪些服務(wù)躏哩,就要看 Server 類啟動時都調(diào)用了其它組件的 start 方法署浩。從 Jetty 的配置文件我們可以發(fā)現(xiàn),配置 Jetty 的過程就是將那些類配置到 Server 的過程扫尺。下面是 Jetty 的啟動時序圖:

因為 Jetty 中所有的組件都會繼承 LifeCycle筋栋,所以 Server 的 start 方法調(diào)用就會調(diào)用所有已經(jīng)注冊到 Server 的組件,Server 啟動其它組件的順序是:首先啟動設(shè)置到 Server 的 Handler正驻,通常這個 Handler 會有很多子 Handler弊攘,這些 Handler 將組成一個 Handler 鏈。Server 會依次啟動這個鏈上的所有 Handler拨拓。接著會啟動注冊在 Server 上 JMX 的 Mbean肴颊,讓 Mbean 也一起工作起來,最后會啟動 Connector渣磷,打開端口婿着,接受客戶端請求,啟動邏輯非常簡單。

建立連接的時序圖

Jetty 創(chuàng)建接受連接環(huán)境需要三個步驟:

  • 創(chuàng)建一個隊列線程池竟宋,用于處理每個建立連接產(chǎn)生的任務(wù)提完,這個線程池可以由用戶來指定,這個和 Tomcat 是類似的丘侠。
  • 創(chuàng)建 ServerSocket徒欣,用于準備接受客戶端的 socket 請求,以及客戶端用來包裝這個 socket 的一些輔助類蜗字。
  • 創(chuàng)建一個或多個監(jiān)聽線程打肝,用來監(jiān)聽訪問端口是否有連接進來。

處理連接時序圖

Accetptor 線程將會為這個請求創(chuàng)建 ConnectorEndPoint挪捕。HttpConnection 用來表示這個連接是一個 HTTP 協(xié)議的連接粗梭,它會創(chuàng)建 HttpParse 類解析 HTTP 協(xié)議,并且會創(chuàng)建符合 HTTP 協(xié)議的 Request 和 Response 對象级零。接下去就是將這個線程交給隊列線程池去執(zhí)行了断医。

基于 NIO 方式工作

前面所描述的 Jetty 建立客戶端連接到處理客戶端的連接都是基于 BIO 的方式,它也支持另外一種 NIO 的處理方式奏纪,其中 Jetty 的默認 connector 就是 NIO 方式鉴嗤。

Jetty 的 NIO 處理方式和 Tomcat 的幾乎一樣,唯一不同的地方是在如何把監(jiān)聽到事件分配給對應(yīng)的連接的處理方式序调。從測試效果來看 Jetty 的 NIO 處理方式更加高效醉锅。下面是 Jetty 的 NIO 處理時序圖:

執(zhí)行原理

核心類:org.mortbay.jetty.Server

核心接口:org.mortbay.component.LifeCycle

核心線程池封裝:org.mortbay.thread.QueuedThreadPool

核心IO處理類:org.mortbay.jetty.nio.SelectChannelConnector

核心Servlet處理類:org.mortbay.jetty.servlet.ServletHandler

Ref:
https://www.ibm.com/developerworks/cn/java/j-lo-jetty/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市炕置,隨后出現(xiàn)的幾起案子荣挨,更是在濱河造成了極大的恐慌,老刑警劉巖朴摊,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異此虑,居然都是意外死亡甚纲,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門朦前,熙熙樓的掌柜王于貴愁眉苦臉地迎上來介杆,“玉大人,你說我怎么就攤上這事韭寸〈荷冢” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵恩伺,是天一觀的道長赴背。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么凰荚? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任燃观,我火速辦了婚禮,結(jié)果婚禮上便瑟,老公的妹妹穿的比我還像新娘缆毁。我一直安慰自己,他們只是感情好到涂,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布脊框。 她就那樣靜靜地躺著,像睡著了一般践啄。 火紅的嫁衣襯著肌膚如雪浇雹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天往核,我揣著相機與錄音箫爷,去河邊找鬼。 笑死聂儒,一個胖子當著我的面吹牛虎锚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播衩婚,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼窜护,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了非春?” 一聲冷哼從身側(cè)響起柱徙,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奇昙,沒想到半個月后护侮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡储耐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年羊初,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片什湘。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡长赞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出闽撤,到底是詐尸還是另有隱情得哆,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布哟旗,位于F島的核電站贩据,受9級特大地震影響栋操,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜乐设,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一讼庇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧近尚,春花似錦蠕啄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至格遭,卻和暖如春哈街,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拒迅。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工骚秦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人璧微。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓作箍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親前硫。 傳聞我的和親對象是個殘疾皇子胞得,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 一、Jetty目錄剖析 bin:可執(zhí)行腳本文件demo- base:etc:Jetty模塊定義的XML配置文件的目...
    高廣超閱讀 3,969評論 0 32
  • 從三月份找實習(xí)到現(xiàn)在屹电,面了一些公司阶剑,掛了不少,但最終還是拿到小米危号、百度牧愁、阿里、京東外莲、新浪递宅、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,192評論 11 349
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理苍狰,服務(wù)發(fā)現(xiàn),斷路器烘绽,智...
    卡卡羅2017閱讀 134,600評論 18 139
  • 概述 Tomcat是一個JSP/Servlet容器淋昭。其作為Servlet容器,有三種工作模式:獨立的Servlet...
    jiangmo閱讀 2,224評論 0 13
  • 0 系列目錄# WEB請求處理 WEB請求處理一:瀏覽器請求發(fā)起處理 WEB請求處理二:Nginx請求反向代理 本...
    七寸知架構(gòu)閱讀 13,887評論 22 190