很多東西在時序圖中體現的已經非常清楚了,沒有必要再一步一步的作介紹,所以本文以圖為主,然后對部分內容加以簡單解釋。
繪制圖形使用的工具是 PlantUML + Visual Studio Code + PlantUML Extension
本文對 Tomcat 的介紹以 Tomcat-9.0.0.M22 為標準。
Tomcat-9.0.0.M22 是 Tomcat 目前最新的版本,但尚未發(fā)布,它實現了 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,默認綁定到 8080 端口,默認的連接等待隊列長度是 100, 當超過 100 個時會拒絕服務。我們可以通過配置 conf/server.xml 中 Connector 的 acceptCount 屬性對其進行定制。
- createExecutor() 用于創(chuàng)建 Worker 線程池。默認會啟動 10 個 Worker 線程,Tomcat 處理請求過程中,Woker 最多不超過 200 個。我們可以通過配置 conf/server.xml 中 Connector 的 minSpareThreads 和 maxThreads 對這兩個屬性進行定制。
- Pollor 用于檢測已就緒的 Socket。默認最多不超過 2 個,Math.min(2,Runtime.getRuntime().availableProcessors());。我們可以通過配置 pollerThreadCount 來定制。
- Acceptor 用于接受新連接。默認是 1 個。我們可以通過配置 acceptorThreadCount 對其進行定制。
Request Process
Acceptor
- 需要注意的是,基本上每一個容器的 StandardPipeline 上都會有多個已注冊的 Valve,我們只關注每個容器的 Basic Valve。其他 Valve 都是在 Basic Valve 前執(zhí)行。
- request.getHost().getPipeline().getFirst().invoke() 先獲取對應的 StandardHost,并執(zhí)行其 pipeline。
- request.getContext().getPipeline().getFirst().invoke() 先獲取對應的 StandardContext,并執(zhí)行其 pipeline。
- request.getWrapper().getPipeline().getFirst().invoke() 先獲取對應的 StandardWrapper,并執(zhí)行其 pipeline。
- 最值得說的就是 StandardWrapper 的 Basic Valve,StandardWrapperValve
- allocate() 用來加載并初始化 Servlet,值的一提的是 Servlet 并不都是單例的,當 Servlet 實現了 SingleThreadModel 接口后,StandardWrapper 會維護一組 Servlet 實例,這是享元模式。當然了 SingleThreadModel在 Servlet 2.4 以后就棄用了。
- createFilterChain() 方法會從 StandardContext 中獲取到所有的過濾器,然后將匹配 Request URL 的所有過濾器挑選出來添加到 filterChain 中。
- doFilter() 執(zhí)行過濾鏈,當所有的過濾器都執(zhí)行完畢后調用 Servlet 的 service() 方法。
Reference
- 《How Tomcat works》
- https://www.amazon.com/How-Tomcat-Works-Budi-Kurniawan/dp/097521280X
- 《Tomcat 架構解析》– 劉光瑞
- 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架構分析 (connector NIO 實現)
- http://gearever.iteye.com/blog/1844203
網站名稱:談談 Tomcat 請求處理流程
標題路徑:http://jinyejixie.com/news30/101030.html
成都網站建設公司_創(chuàng)新互聯,為您提供網站設計、品牌網站設計、網站內鏈、服務器托管、自適應網站、標簽優(yōu)化
廣告
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源:
創(chuàng)新互聯