tomcat的原理-組件connector

tomcat 發(fā)展多年息裸,成熟而穩(wěn)定列吼, 但是在當今最新求快的 java web 技術棧中,這種優(yōu)秀的中間件卻與我們漸行漸遠遵蚜。
靜下心來學習 帖池, 賞析大牛們是如何設計和架構一個優(yōu)秀的中間件系統(tǒng)奈惑,如有錯誤,共同探討睡汹,共同學習肴甸。

宏觀架構

tomcat 的啟動流程: startup.sh -> catalina.sh start ->java -jar org.apache.catalina.startup.Bootstrap.main()

先上小圖,一圖以避之囚巴,看個大概原在。


image.png

所有組件:
1.server: 一個tomcat實例
2.service: 處理即將到來的socket服務
3.connector : socket 連接器 , http協(xié)議的轉化
4.container : 加載管理servlet 并處理request
其中核心組件 為connector, container

預備知識 :

  1. tomcat組件實現(xiàn)了lifeCyle接口 生命周期方法為: init-> start -> stop-> destroy
  2. tomcat組件繼承了lifeCyleBase 抽象類
  3. lifeCyleBase 抽象類 中實現(xiàn)了 lifeCycle接口的方法彤叉, 并且個主鍵在調用相應的生命周期方法會調用內部的 initInternal startInternal stopInternal destroyInternal 方法
    關于組件的初始化 啟動 停止 銷毀 我們后續(xù)探討庶柿。

connector

  1. 構造函數(shù)初始化


    image.png

connector 是通過此構造器創(chuàng)建的【上層如何創(chuàng)建這個對象 ,我們后續(xù)再說

看一下 ProtocolHandler 的創(chuàng)建過程


image.png
image.png
image.png
image.png

到這里已明白秽浇, protocolHandler 默認使用Http11NioProtocol .
Http11NioProtocol 對象創(chuàng)建時候 屬性 endpoint 被賦值為 NioEndpoint 對象浮庐。
Http11NioProtocol handler 屬性設置為 ConnectionHandler
Endpoint handler 屬性設置為 ConnectionHandler

  1. 初始化init

a> 創(chuàng)建 CoyoteAdapter 并注冊到protocolHandler 中


image.png

b> protocolHandler 【即 構造函數(shù)初始化 分析的Http11NioProtocol 】初始化, 先看下ProtocolHandler 的體系圖柬焕。


image.png

image.png

初始化過程:
Http11NioProtocol.init()->AbstractHttp11Protocol.init()->AbstractProtocol.init()
即子類初始化調用父類初始化审残。

在 AbstractProtocol.init() 中 endpoint 初始化:

image.png

c.endpoint初始化
看下endpint 的類繼承關系


image.png

類: NioEndpoint 方法 init()

image.png

類: AbstractEndpoint 方法: init()


image.png

類: NioEndpoint 方法 : bind()


image.png

類: NioEndpNioEnoint 方法 : initServerSocket()


image.png

3.啟動start() 方法
類 : Connector 方法 : startInternal()


image.png

類 : AbstractProtocol 方法: start()


image.png

類: NioEndpNioEnoint 方法 : startInternal()


image.png

我們分析下紅色箭頭 3,4 中的創(chuàng)建 poller 線程 和 acceptor 線程的作用是什么斑举?

先看Accetpor 線程:
1.實現(xiàn)了runnable 接口 搅轿,在run()方法中:

image.png

image.png

再看poller 線程:


image.png

Abs


image.png
image.png

至此,Acceptor跑在一個單獨的線程里懂昂,它在一個死循環(huán)里調用 accept方法來接收新連接介时,一旦有新的連接請求到來,accept方法返回一個 Channel 對象凌彬,接著把 Channel對象交給 Poller 去處理沸柔。
Poller 的本質是一個 Selector,也跑在單獨線程里铲敛。Poller在內部維護一個 Channel數(shù)組褐澎,它在一個死循環(huán)里不斷檢測 Channel的數(shù)據(jù)就緒狀態(tài),一旦有 Channel可讀伐蒋,就生成一個 SocketProcessor任務對象扔給 Executor去處理工三。
我們來看下processSocket方法是如何處理socketWrapper的?

類: AbstractEndpoint 方法 : processSocket


image.png

看下SocketProcessor類的作用

類: NioEndpoint.SocketProcessor
創(chuàng)建:


image.png

看下繼承關系:

image.png

當使用線程池執(zhí)行的時候,活執(zhí)行父類SocketProcessorBase 的run()方法 先鱼,父類的run()方法 會調用子類SocketProcessor的doRun()方法俭正。

類: NioEndpoint.SocketProcessor 方法 : doRun()


image.png

我們知道在創(chuàng)建Http11NioProtocol 對象的同時 ,創(chuàng)建了NioEndpoint 焙畔,并給NioEndpoint 設置handler 屬性為 ConnectionHandler 掸读, 我們看下
ConnectionHandler 的 process 方法。

image.png
image.png

會調用Http11NioProtocol 的 createProcessor方法 創(chuàng)建 Http11Processor 對象 http11Processor繼承關系如下 :


image.png

AbstractProcessorLight類中 的process() 方法


image.png

子類: Http11Processor 的service()方法


image.png

我們知道在 Connector組件初始化的時候 給protocolHandler設置了adapter屬性,如下:


image.png

也就是說: getAdapter().servcive(req , rep) 交給了CoyoteAdapter 適配器來處理。

image.png

自此儿惫, connector 組件如何處理一個socket 請求澡罚,分析完畢

總結:

1.一個connector組件 可分為 protocolHandler 和 Adapter ,protocolHandler 用于處理 網絡請求 肾请, Adapter 將內部request 留搔, response 適配成 servlet的HttpServletReqeust , HttpServiceResponse

  1. protocolHandler主要處理 網絡連接 和 應用層協(xié)議 铛铁,包含了兩個重要部件 EndPoint 和 Processor隔显, EndPoint 是用來實現(xiàn) TCP/IP 協(xié)議數(shù)據(jù)讀寫的,本質調用操作系統(tǒng)的 socket 接口 避归, Processor用于處理socket荣月, 轉換應用層協(xié)議 ,封裝內部 request 和 response

  2. adapter 用于 內部 request 和 response 轉換 成sevlet 規(guī)范的 HttpServletReqeust 梳毙, HttpServiceResponse

  3. EndPoint 一圖以避之


    image.png
  4. Processor 用來實現(xiàn) HTTP 協(xié)議,Processor 接收來自 EndPoint 的 Socket捐下,讀取字節(jié)流解析成 Tomcat Request 和 Response 對象账锹,并通過 Adapter 將其提交到容器處理,Processor 是對應用層協(xié)議的抽象


    image.png

最后簡圖總結下:

protocl.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末坷襟,一起剝皮案震驚了整個濱河市奸柬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌婴程,老刑警劉巖廓奕,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異档叔,居然都是意外死亡桌粉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門衙四,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铃肯,“玉大人,你說我怎么就攤上這事传蹈⊙罕疲” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵惦界,是天一觀的道長挑格。 經常有香客問我,道長沾歪,這世上最難降的妖魔是什么漂彤? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上显歧,老公的妹妹穿的比我還像新娘仪或。我一直安慰自己,他們只是感情好士骤,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布范删。 她就那樣靜靜地躺著,像睡著了一般拷肌。 火紅的嫁衣襯著肌膚如雪到旦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天巨缘,我揣著相機與錄音添忘,去河邊找鬼。 笑死若锁,一個胖子當著我的面吹牛搁骑,可吹牛的內容都是我干的。 我是一名探鬼主播又固,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼仲器,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了仰冠?” 一聲冷哼從身側響起乏冀,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎洋只,沒想到半個月后辆沦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡识虚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年肢扯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舷礼。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡鹃彻,死狀恐怖,靈堂內的尸體忽然破棺而出妻献,到底是詐尸還是另有隱情蛛株,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布育拨,位于F島的核電站谨履,受9級特大地震影響,放射性物質發(fā)生泄漏熬丧。R本人自食惡果不足惜笋粟,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧害捕,春花似錦绿淋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盾沫,卻和暖如春裁赠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赴精。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工佩捞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蕾哟。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓一忱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親渐苏。 傳聞我的和親對象是個殘疾皇子掀潮,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內容