很多東西在時(shí)序圖中體現(xiàn)的已經(jīng)非常清楚了,沒有必要再一步一步的作介紹,所以本文以圖為主,然后對(duì)部分內(nèi)容加以簡(jiǎn)單解釋。
繪制圖形使用的工具是 PlantUML + Visual Studio Code + PlantUML Extension
本文對(duì) Tomcat 的介紹以 Tomcat-9.0.0.M22 為標(biāo)準(zhǔn)。
Tomcat-9.0.0.M22 是 Tomcat 目前最新的版本,但尚未發(fā)布,它實(shí)現(xiàn)了 Servlet4.0 及 JSP2.3 并提供了很多新特性,需要 1.8 及以上的 JDK 支持等等,詳情請(qǐng)查閱 Tomcat-9.0-doc。
https://tomcat.apache.org/tomcat-9.0-doc/index.html
- initServerSocket(),通過(guò) ServerSocketChannel.open() 打開一個(gè) ServerSocket,默認(rèn)綁定到 8080 端口,默認(rèn)的連接等待隊(duì)列長(zhǎng)度是 100, 當(dāng)超過(guò) 100 個(gè)時(shí)會(huì)拒絕服務(wù)。我們可以通過(guò)配置 conf/server.xml 中 Connector 的 acceptCount 屬性對(duì)其進(jìn)行定制。
- createExecutor() 用于創(chuàng)建 Worker 線程池。默認(rèn)會(huì)啟動(dòng) 10 個(gè) Worker 線程,Tomcat 處理請(qǐng)求過(guò)程中,Woker 最多不超過(guò) 200 個(gè)。我們可以通過(guò)配置 conf/server.xml 中 Connector 的 minSpareThreads 和 maxThreads 對(duì)這兩個(gè)屬性進(jìn)行定制。
- Pollor 用于檢測(cè)已就緒的 Socket。默認(rèn)最多不超過(guò) 2 個(gè),Math.min(2,Runtime.getRuntime().availableProcessors());。我們可以通過(guò)配置 pollerThreadCount 來(lái)定制。
- Acceptor 用于接受新連接。默認(rèn)是 1 個(gè)。我們可以通過(guò)配置 acceptorThreadCount 對(duì)其進(jìn)行定制。
Request Process
Acceptor
- 需要注意的是,基本上每一個(gè)容器的 StandardPipeline 上都會(huì)有多個(gè)已注冊(cè)的 Valve,我們只關(guān)注每個(gè)容器的 Basic Valve。其他 Valve 都是在 Basic Valve 前執(zhí)行。
- request.getHost().getPipeline().getFirst().invoke() 先獲取對(duì)應(yīng)的 StandardHost,并執(zhí)行其 pipeline。
- request.getContext().getPipeline().getFirst().invoke() 先獲取對(duì)應(yīng)的 StandardContext,并執(zhí)行其 pipeline。
- request.getWrapper().getPipeline().getFirst().invoke() 先獲取對(duì)應(yīng)的 StandardWrapper,并執(zhí)行其 pipeline。
- 最值得說(shuō)的就是 StandardWrapper 的 Basic Valve,StandardWrapperValve
- allocate() 用來(lái)加載并初始化 Servlet,值的一提的是 Servlet 并不都是單例的,當(dāng) Servlet 實(shí)現(xiàn)了 SingleThreadModel 接口后,StandardWrapper 會(huì)維護(hù)一組 Servlet 實(shí)例,這是享元模式。當(dāng)然了 SingleThreadModel在 Servlet 2.4 以后就棄用了。
- createFilterChain() 方法會(huì)從 StandardContext 中獲取到所有的過(guò)濾器,然后將匹配 Request URL 的所有過(guò)濾器挑選出來(lái)添加到 filterChain 中。
- doFilter() 執(zhí)行過(guò)濾鏈,當(dāng)所有的過(guò)濾器都執(zhí)行完畢后調(diào)用 Servlet 的 service() 方法。
Reference
- 《How Tomcat works》
- https://www.amazon.com/How-Tomcat-Works-Budi-Kurniawan/dp/097521280X
- 《Tomcat 架構(gòu)解析》– 劉光瑞
- http://product.dangdang.com/25084132.html
- Tomcat-9.0-doc
- https://tomcat.apache.org/tomcat-9.0-doc/index.html
- apache-tomcat-9.0.0.M22-src
- http://www-eu.apache.org/dist/tomcat/tomcat-9/v9.0.0.M22/src/
- tomcat架構(gòu)分析 (connector NIO 實(shí)現(xiàn))
- http://gearever.iteye.com/blog/1844203
網(wǎng)站題目:談?wù)?Tomcat 請(qǐng)求處理流程
文章地址:http://www.rwnh.cn/news/101030.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、關(guān)鍵詞優(yōu)化、定制網(wǎng)站、全網(wǎng)營(yíng)銷推廣、網(wǎng)站設(shè)計(jì)公司、App設(shè)計(jì)
廣告
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源:
創(chuàng)新互聯(lián)