Tomcat源碼分析 -- Tomcat連接器簡介

本篇結(jié)構(gòu):

  • 前言
  • 什么是Coyote
  • Coyote支持的協(xié)議及I/O方案
  • Coyote重要組件
  • 總結(jié)

一堆缘、前言

Tomcat是一款servlet服務(wù)器,它能夠接受請(qǐng)求擂找,處理請(qǐng)求并給出響應(yīng)迄损。

前面的篇章介紹了Tomcat容器框架Catalina的相關(guān)內(nèi)容,主要介紹了Tomcat容器的初始化和啟動(dòng)澜掩,并沒有介紹這些容器啟動(dòng)之后做什么购披,其實(shí)Catalina容器啟動(dòng)后主要是負(fù)責(zé)處理來自客服端的請(qǐng)求并輸出響應(yīng)。

之所以沒有在前面的篇幅介紹這些肩榕,是因?yàn)镃atalina容器只負(fù)責(zé)處理請(qǐng)求刚陡,而請(qǐng)求的接收是由Tomcat的連接器來做的,只有把Tomcat的Tomcat的連接器搞清楚了株汉,才能完整理解Tomcat是怎樣處理Web請(qǐng)求的筐乳。

所以在正式介紹Tomcat是如何處理請(qǐng)求之前,先來了解下Tomcat的連接器乔妈。

二蝙云、什么是Coyote

如上,Coyote是Tomcat源碼中的一個(gè)包名路召,也可以說是Tomcat連接器框架的名字勃刨,是Tomcat服務(wù)器提供的供客戶端訪問的外部接口波材。客戶端通過Coyote與服務(wù)器建立連接朵你、發(fā)送請(qǐng)求并接收響應(yīng)各聘。

Coyote封裝了底層的網(wǎng)絡(luò)通信,為Catalina容器提供統(tǒng)一的接口抡医,使得Catalina容器和具體的請(qǐng)求協(xié)議及I/O方式解耦躲因。Coyote將Socket輸入轉(zhuǎn)換為自定義的Request對(duì)象,交由Catalina容器處理忌傻,處理完請(qǐng)求后大脉,Catalina容器通過Coyote提供的自定義Response對(duì)象將結(jié)果寫入輸出流。

Coyote是相對(duì)獨(dú)立的模塊水孩,和Servlet的規(guī)范實(shí)現(xiàn)沒有直接關(guān)系镰矿,它只負(fù)責(zé)網(wǎng)絡(luò)協(xié)議和I/O的處理,由它自定義的Request和Response對(duì)象也沒有實(shí)現(xiàn)Servlet規(guī)范對(duì)應(yīng)的接口俘种,而是在Catalina容器中進(jìn)一步被封裝成ServletRequest和ServletResponse秤标。

可以通過下圖簡單理解下:

三、Coyote支持的協(xié)議及I/O方案

3.1宙刘、Coyote支持的協(xié)議

在server.xml中可以看到這樣的配置:

<Service name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"/>
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>
    ...
<Service/>

這個(gè)配置是說一個(gè)Service可以配置多個(gè)Connector苍姜,支持不同的網(wǎng)絡(luò)協(xié)議。

由配置可知悬包,Tomcat主要支持兩種協(xié)議:

  1. HTTP/1.1協(xié)議:這是大部分Web應(yīng)用采用的訪問協(xié)議衙猪,多用于Tomcat單獨(dú)運(yùn)行的情況。
  2. AJP協(xié)議:用于和Web服務(wù)器集成(如Apache HTTP Server)布近,以實(shí)現(xiàn)針對(duì)靜態(tài)資源的優(yōu)化及集群部署垫释。

3.2、Coyote I/O方案

Tomcat自8.5及9.0版本起撑瞧,已經(jīng)移除了對(duì)BIO的支持棵譬,目前支持的I/O方案有:

  1. NIO:采用Java NIO類庫實(shí)現(xiàn)。
  2. NIO2:采用JDK 7最新的NIO2類庫實(shí)現(xiàn)季蚂。
  3. APR:采用APR(Apache可移植運(yùn)行庫)實(shí)現(xiàn)茫船,是使用C/C++編寫的本地庫,選擇該方案扭屁,需要單獨(dú)安裝APR庫算谈。

四、Coyote重要組件

Coyote是Tomcat連接器框架的名稱料滥,這節(jié)簡單介紹下Coyote涉及到的主要的組件然眼,了解下這些組件的概念。

先看看在之前的篇章--整體架構(gòu)中貼出的一張連接器的設(shè)計(jì)結(jié)構(gòu)圖:

可以說Connector就是Tomcat的連接器葵腹,是Coyote最直接的體現(xiàn)高每。

4.1屿岂、ProtocolHandler

ProtocolHandler是Tomcat協(xié)議接口,Connector使用ProtocolHandler來處理請(qǐng)求鲸匿。ProtocolHandler由包含了三個(gè)部件:Endpoint爷怀、Processor、Adapter带欢。

它實(shí)現(xiàn)針對(duì)具體協(xié)議的處理功能运授。按照協(xié)議和I/O有如下繼承關(guān)系:

在server.xml中設(shè)置連接器時(shí),需要指定具體的ProtocolHandler乔煞,也可以制定協(xié)議的名稱吁朦,比如HTTP/1.1。

4.2渡贾、Endpoint

Endpoint是通信端點(diǎn)逗宜,即通信監(jiān)聽的接口,是具體的Socket接收處理類空骚,是對(duì)傳輸層的抽象纺讲。由于是處理底層的Socket網(wǎng)絡(luò)連接,因此Endpoint是用來實(shí)現(xiàn)TCP/IP協(xié)議的囤屹。

Tomcat并沒有Endpoint接口刻诊,而是一個(gè)抽象類AbstractEndpoint,根據(jù)I/O方式的不同牺丙,提供了如下的實(shí)現(xiàn):

Endpoint內(nèi)部有個(gè)Handler接口,用于處理接收到的Socket复局,在內(nèi)部調(diào)用Processor進(jìn)行處理冲簿。

Acceptor是Endpoint的一個(gè)部件,用于監(jiān)聽請(qǐng)求亿昏。

4.3峦剔、Processor

Processor是協(xié)議處理接口,負(fù)責(zé)構(gòu)造Request和Response對(duì)象角钩,并通過Adapter將其提交到Catalina容器處理吝沫,是對(duì)應(yīng)用層協(xié)議的抽象。

在Coyote中递礼,根據(jù)協(xié)議的不同有三個(gè)不同的實(shí)現(xiàn)類惨险,另外還有兩個(gè)具體的升級(jí)協(xié)議處理的實(shí)現(xiàn)。

參見下圖:

image

4.4脊髓、Adapter

Adapter充當(dāng)適配器辫愉,將Processor構(gòu)造的Request對(duì)象轉(zhuǎn)換為ServletRequest交給Container進(jìn)行具體的處理。

只有一個(gè)實(shí)現(xiàn)類:CoyoteAdapter将硝。

五恭朗、總結(jié)

下面就應(yīng)該介紹Connector是怎么初始化啟動(dòng)的屏镊,了解了這些就可以真正開始看Tomcat是如何處理請(qǐng)求的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末痰腮,一起剝皮案震驚了整個(gè)濱河市而芥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌膀值,老刑警劉巖棍丐,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異虫腋,居然都是意外死亡骄酗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門悦冀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趋翻,“玉大人,你說我怎么就攤上這事盒蟆√だ樱” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵历等,是天一觀的道長讨惩。 經(jīng)常有香客問我,道長寒屯,這世上最難降的妖魔是什么荐捻? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮寡夹,結(jié)果婚禮上处面,老公的妹妹穿的比我還像新娘。我一直安慰自己菩掏,他們只是感情好魂角,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著智绸,像睡著了一般野揪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瞧栗,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天斯稳,我揣著相機(jī)與錄音,去河邊找鬼迹恐。 笑死平挑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播通熄,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼唆涝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了唇辨?” 一聲冷哼從身側(cè)響起廊酣,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赏枚,沒想到半個(gè)月后亡驰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饿幅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年凡辱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片栗恩。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡透乾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出磕秤,到底是詐尸還是另有隱情乳乌,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布市咆,位于F島的核電站汉操,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蒙兰。R本人自食惡果不足惜磷瘤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望搜变。 院中可真熱鬧膀斋,春花似錦、人聲如沸痹雅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绩社。三九已至,卻和暖如春赂苗,著一層夾襖步出監(jiān)牢的瞬間愉耙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國打工拌滋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留朴沿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像赌渣,于是被迫代替她去往敵國和親魏铅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

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