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