Tomcat并發(fā)處理請求

Tomcat處理連接請求的模式:

  • BIO:阻塞模型
  • NIO:非阻塞模型
  • APR: 高性能埃儿,可擴(kuò)展的模式制市,Tomcat8版本默認(rèn)模式
    Tomcat連接器(Connector)是處理請求的主要組件,它負(fù)責(zé)接收請求嘉冒,創(chuàng)建Request和Response對象用于和前端進(jìn)行數(shù)據(jù)的交換亿汞;然后分配線程讓Servlet容器來處理這個請求亮垫,并把產(chǎn)生的Request和Response對象傳給Servlet容器。當(dāng)Engine處理完請求后躺涝,也會通過Connector將結(jié)果返回給請求端厨钻。即Connector進(jìn)行請求的調(diào)度和控制。
    根據(jù)協(xié)議的不同诞挨,可以分為Http Connector和AJP Connector莉撇,兩種協(xié)議的不同可以看這篇博文

一、NIO惶傻、BIO棍郎、APR

1. Connector的模式

Connector在處理HTTP請求時,會使用不同的模式银室。不同版本的Tomcat支持的模式不行同(Tomcat8+版本支持NIO以及APR去掉了對BIO的支持)
BIO與NIO大家都是比較熟悉的涂佃,APR是Apache Portable Runtime,是Apache可移植運(yùn)行庫蜈敢,利用本地庫可以實(shí)現(xiàn)高擴(kuò)展性辜荠、高性能;APR是在Tomcat上運(yùn)行高并發(fā)應(yīng)用的首選模式抓狭,但是需要安裝apr伯病、apr-utils、tomcat-native等包

2. Connector的請求流程

OverView

Connector啟動后會啟動三種線程組用于不同階段的處理:

  • Acceptor線程組否过。用于接收新連接午笛,并將新連接封裝以下,選擇一個Poller將新連接添加到Poller的事件隊(duì)列中
  • Poller線程組苗桂。用于監(jiān)聽Socket事件药磺,當(dāng)Socket可讀或可寫時,將Socket封裝一下添加到worker線程池的任務(wù)隊(duì)列中
  • Worker線程組煤伟。用于對請求進(jìn)行處理癌佩,包括分析請求報文并創(chuàng)建Request對象,調(diào)用容器的pipeline
    Acceptor便锨、Poller围辙、Worker的線程池(ThreadPoolExcutor)均維護(hù)在NioEndPoint中
Connector的初始化及啟動
tomcat-connector-start
  1. initServerSocket(),通過ServerSocketChannel.open()打開一個ServerSocket,默認(rèn)綁定到8080端口放案,默認(rèn)的連接等待隊(duì)列長度為100姚建,當(dāng)超過100時會拒絕服務(wù)。我們可以通過在conf/server.xml中的Connector的acceptCount屬性對其進(jìn)行設(shè)置卿叽。
  2. createExecutor()用于創(chuàng)建Worker線程池桥胞。默認(rèn)會啟動10個Worker線程,Tomcat處理請求過程中考婴,Worker最多不超過200個贩虾。我們可以通過配置conf/server.xml中的Connector的minSpareThreads 和 maxThreads 對這兩個屬性進(jìn)行定制。
  3. Poller用于檢測已經(jīng)就緒的Socket沥阱,默認(rèn)不超過2個線程缎罢,我們可以通過配置 pollerThreadCount 設(shè)置。
    4.Acceptor用于接收新的連接考杉,默認(rèn)1個線程策精,我們可以通過配置 acceptorThreadCount 對其進(jìn)行設(shè)置。
Acceptor請求過程
  1. Acceptor在啟動后會阻塞在ServerSocketChannel.accept()處崇棠,當(dāng)有新連接到達(dá)時咽袜,該方法返回一個SocketChannel
    2.配置完Socket以后會將Socket封裝到NioChannel中,并注冊到 Poller,由于我們一開始就啟動了多個 Poller 線程枕稀,注冊的時候询刹,連接是公平的分配到每個 Poller 的。
    3.addEvent() 方法會將 Socket 添加到該 Poller 的 PollerEvent 隊(duì)列中萎坷。到此 Acceptor 的任務(wù)就完成了凹联。
Poller過程
  1. selector.select(1000)。當(dāng) Poller 啟動后因?yàn)?selector 中并沒有已注冊的 Channel哆档,所以當(dāng)執(zhí)行到該方法時只能阻塞蔽挠。所有的 Poller 共用一個 Selector,其實(shí)現(xiàn)類是 sun.nio.ch.EPollSelectorImpl
    2.events() 方法會將通過 addEvent() 方法添加到事件隊(duì)列中的 Socket 注冊到 EPollSelectorImpl瓜浸,當(dāng) Socket 可讀時澳淑,Poller 才對其進(jìn)行處理
    3.createSocketProcessor() 方法將 Socket 封裝到 SocketProcessor 中,SocketProcessor 實(shí)現(xiàn)了 Runnable 接口斟叼。worker 線程通過調(diào)用其 run() 方法來對 Socket 進(jìn)行處理偶惠。
    4.execute(SocketProcessor) 方法將 SocketProcessor 提交到線程池,放入線程池的 workQueue 中朗涩。workQueue 是 BlockingQueue 的實(shí)例忽孽。到此 Poller 的任務(wù)就完成了。
Worker過程
  • worker 線程被創(chuàng)建以后就執(zhí)行 ThreadPoolExecutor 的 runWorker() 方法谢床,試圖從 workQueue 中取待處理任務(wù)兄一,但是一開始 workQueue 是空的,所以 worker 線程會阻塞在 workQueue.take() 方法识腿。
  • 當(dāng)新任務(wù)添加到 workQueue后出革,workQueue.take() 方法會返回一個 Runnable,通常是 SocketProcessor,然后 worker 線程調(diào)用 SocketProcessor 的 run() 方法對 Socket 進(jìn)行處理渡讼。
  • createProcessor() 會創(chuàng)建一個 Http11Processor, 它用來解析 Socket骂束,將 Socket 中的內(nèi)容封裝到 Request 中耳璧。注意這個 Request 是臨時使用的一個類,它的全類名是 org.apache.coyote.Request
  • postParseRequest() 方法封裝一下 Request展箱,并處理一下映射關(guān)系(從 URL 映射到相應(yīng)的 Host旨枯、Context、Wrapper)混驰。

參考:談?wù)?Tomcat 請求處理流程(http://www.importnew.com/27729.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末攀隔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子栖榨,更是在濱河造成了極大的恐慌昆汹,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件婴栽,死亡現(xiàn)場離奇詭異满粗,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)居夹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門败潦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人准脂,你說我怎么就攤上這事劫扒。” “怎么了狸膏?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵沟饥,是天一觀的道長。 經(jīng)常有香客問我湾戳,道長贤旷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任砾脑,我火速辦了婚禮幼驶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘韧衣。我一直安慰自己盅藻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布畅铭。 她就那樣靜靜地躺著氏淑,像睡著了一般午磁。 火紅的嫁衣襯著肌膚如雪磅甩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天者春,我揣著相機(jī)與錄音炉擅,去河邊找鬼辉懒。 笑死阳惹,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的眶俩。 我是一名探鬼主播穆端,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼仿便!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起攒巍,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤嗽仪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后柒莉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闻坚,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年兢孝,在試婚紗的時候發(fā)現(xiàn)自己被綠了窿凤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡跨蟹,死狀恐怖雳殊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情窗轩,我是刑警寧澤夯秃,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站痢艺,受9級特大地震影響仓洼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜堤舒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一色建、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧舌缤,春花似錦箕戳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至卸留,卻和暖如春走越,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背耻瑟。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工旨指, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赏酥,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓谆构,卻偏偏與公主長得像裸扶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子搬素,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

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