日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Tomcat請求處理流程與源碼淺析(最新推薦)

瀏覽:281日期:2023-09-08 20:45:27
目錄Tomcat請求處理流程與源碼淺析一丶Connector二丶NioEndpoint 初始化ServerSocketChannel三丶NioEndpoint 啟動Poller和Acceptor線程四丶Acceptor接收請求1.endpoint.countUpOrAwaitConnection()限制連接數2.NioEndpoint#serverSocketAccept 接收Socket連接3.NioEndpoint#setSocketOptions將SocketChannel注冊到Poller五丶Poller處理事件1.events方法查看事件隊列是否具備事件2.Poller 使用Selector進行select3.Poller 處理就緒IO六丶CoyoteAdapter處理請求1.使用Mapper找到請求對應的Host,Context,Wrapper2.Pipeline執行3.FilterChain執行Tomcat請求處理流程與源碼淺析

一丶Connector

在tomcat中,Connector負責開啟socket并且監聽客戶端請求,返回響應數據。

其中:

Endpoint:tomcat中沒有這個接口,只有AbstractEndpoint,它負責啟動線程來監聽服務器端口,并且在接受到數據后交給Processor處理Processor:Processor讀取到客戶端請求后按照請求地址映射到具體的容器進行處理,這個過程請求映射,Processor實現請求映射依賴于Mapper對象,在容器發生注冊和注銷的時候,MapperListener會監聽到對應的事件,從而來變更Mapper中維護的請求映射信息。ProtocolHandler:協議處理器,針對不同的IO方式(NIO,BIO等)和不同的協議(Http,AJP)具備不同的實現,ProtocolHandler包含一個Endpoint來開啟端口監聽,并且包含一個Processor用于按照協議讀取數據并將請求交給容器處理。Acceptor:Acceptor實現了Runnable接口,可以作為一個線程啟動,使用Socket API監聽指定端口,用于接收用戶請求。Poller:主要用于監測注冊在原始 scoket 上的事件是否發生,Acceptor接受到請求后,會注冊到Poller的隊列中。二丶NioEndpoint 初始化ServerSocketChannel

springboot內嵌tomcat,一般默認使用NioEndpoint,在NioEndpoint#start方法中,會觸發NioEndpoint#bind

三丶NioEndpoint 啟動Poller和Acceptor線程

NioEndpoint#start方法最后會觸發Poller線程和Acceptor線程的啟動

可以看到NioEndpoint內部的Poller,和Acceptor都是單獨使用一個守護線程來運行。

四丶Acceptor接收請求

1.endpoint.countUpOrAwaitConnection()限制連接數

其內部使用LimitLatch#countUpOrAwait方法限制連接數,如果連接數達到了上限,那將掛起當前線程,也就是掛起Acceptor線程,從而導致無法有更多的請求連接上來,最大連接數默認為8*1024。

LimitLatch 內部持有一個AbstractQueuedSynchronizer,限制連接數將調用其acquireSharedInterruptibly(1),然后會調用到AQS的tryAcquireShared,其內部使用AtomicLong來進行連接的計數。

2.NioEndpoint#serverSocketAccept 接收Socket連接

由于NioEndpoint前面調用了ServerSocketChannel#configureBlocking(true),所以serverSock#accept,在沒有連接上來時,不會立馬返回null,而是阻塞直到連接來到。

3.NioEndpoint#setSocketOptions將SocketChannel注冊到Poller

在Acceptor線程接收到SocketChannel后,會調用Poller#register方法進行注冊,Acceptor只負責接受請求,請求后續的處理由Poller線程負責

最終請求被包裝為PollerEvent丟到Poller的事件隊列SynchronizedQueue中,SynchronizedQueue使用synchronized保證線程安全。

wakeupCounter 是AtomicLong類型,Acceptor接受到請求,將請求封裝為PollerEvent后會調用wakeupCounter#incrementAndGet方法,進行+1操作

Poller在使用Selector,進行IO多路復用的時候,會進行如下操作

可以看到,如果wakeupCounter大于0,Poller會調用 selector.selectNow()(非阻塞立馬返回),反之調用selector.select(selectorTimeout)(超時并阻塞)。

也就說Acceptor接受到請求越多,wakeupCounter越大,越會讓Poller調用selector.selectNow()減少阻塞,從而讓Poller更快的檢查事件是否就緒,從而讓請求更及時的被處理。

五丶Poller處理事件1.events方法查看事件隊列是否具備事件

上面我們說到Acceptor在建立連接后,將SocketChannel包裝成NioSocketWrapper塞到了Poller的事件隊列中。而Poller線程則會一直輪詢這個隊列進行事件的獲取

2.Poller 使用Selector進行select

通過Selector獲取獲取當前就緒的IO,keyCount記錄就緒數目。

3.Poller 處理就緒IO

processKey會調用到processSocket,最終使用tomcat線程池中的線程進行異步處理

最終會找到Processor進行處理(默認使用緩存的,避免重復new對象,頻繁gc,如果緩存沒有那么使用ProtocolHandler 創建出一個),這里的Processor就是Http11Processor

然后根據事件類型進行不同的處理,如果是讀事件那么會調用Http11Processor#service進行處理,然后會繼續交給CoyoteAdapter調用其service進行處理。

六丶CoyoteAdapter處理請求1.使用Mapper找到請求對應的Host,Context,Wrapper

下圖是的模型,如果使用了SpringMVC,這里的Wrapper會存在DispatchServlet

如下是Mapper找到的MappingData

2.Pipeline執行

上面說到,Mapper會找到當前請求所屬的host,context和對應的Wrapper,緊接著會進行Pipeline的執行。

為了增強擴展性,tomcat定義了Pipeline(管道)和Valve(閥),Pipeline使用職責鏈的方式串聯多個Valve——來自客戶端的請求如同流水一樣流淌在管道中,受到每一個閥的作用。

Pipeline中維護了基礎的Valve,始終位于Pipeline末端,通過Pipeline#addValve添加的Valve違約基礎的Valve之前。

在Tomcat中Engine,Host,Context,Wrapper都有對應的Valve實現,同時維護了一個Pipeline,從而讓我們可以對請求的處理進行擴展。

下面是比較重要的Valve

StandardEngineValve :Engine對應的Valve,負責請求是否通過mapper找到了對應的Host,并觸發Host對應的Valve

ErrorReportValve: 錯誤報告Valve讓后續的Valve繼續執行,如果執行出現錯誤那么會刷新響應流,讓客戶端收到響應

StandardHostValve:Host對應的Valve,如果請求沒有匹配的context返回404,反之調用Context對應的Valve

StandardContextValve:Context對應的Valve,如果請求路徑以/META-INF/,或者/WEB-INF/開頭,會直接返回404,反之繼續調用Wrapper對應的

StandardWrapperValve:Wrapper對應的Valve,會負責組裝Servlet和Filter,并執行FilterChain#doFilter方法

Filter的匹配主要通過DispatchType和Filter設置的路徑,

在SpringBoot項目中可以使用FilterRegistrationBean#setDispatcherTypes,和addUrlPatterns進行指定。

3.FilterChain執行

在Tomcat中ApplicationFilterChain實現了Java Servlet規范中的FilterChain。

其中使用ApplicationFilterConfig是對FilterConfig的實現,內部持有一個Filter。

ApplicationFilterChain包含多個ApplicationFilterConfig,使用數組和pos屬性記錄當前執行到第幾個Filter

Filter都執行結束后,將執行Servlet#service方法

在SpringMVC項目中,會調用到DispatcherServlet#service,最終調用到Controller。

到此這篇關于Tomcat請求處理流程與源碼淺析的文章就介紹到這了,更多相關Tomcat請求處理內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Tomcat
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
香蕉视频成人在线观看| 香蕉成人av| 欧美私人啪啪vps| 免费在线播放第一区高清av| 国产videos久久| 桃色一区二区| 久久成人精品| 国产精品一区二区三区美女 | 日韩成人高清| 久久国产高清| 国产精品极品在线观看| 黑人精品一区| 视频一区二区中文字幕| 久久精品国产999大香线蕉| 久久五月天小说| 日韩不卡免费视频| 丝袜诱惑一区二区| 美女尤物久久精品| 精品高清久久| 蘑菇福利视频一区播放| 精品中文字幕一区二区三区 | 蜜桃久久av一区| 国产福利资源一区| 精品一区在线| 国产伦精品一区二区三区视频| 国精品产品一区| 亚洲自啪免费| 久久三级中文| 99在线精品免费视频九九视 | 国产极品嫩模在线观看91精品| 亚洲va中文在线播放免费| 视频国产精品| 国产传媒av在线| 亚洲人www| 精品国产第一福利网站| 日韩精品成人| 亚洲激情婷婷| 岛国av在线网站| 日本91福利区| 亚洲精品极品少妇16p| 免费观看亚洲天堂| 首页国产欧美日韩丝袜| 风间由美中文字幕在线看视频国产欧美 | 国语精品一区| 午夜视频一区二区在线观看| 日韩电影免费网站| 欧美午夜网站| 每日更新成人在线视频| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 亚洲一区成人| 国产a亚洲精品| 荡女精品导航| 老牛影视精品| 蜜臀av一区二区三区| 精品一区二区三区亚洲| 欧美日韩国产探花| 丝袜美腿诱惑一区二区三区| 久久亚洲不卡| 人人草在线视频| 久久的色偷偷| 视频精品一区| 丝袜脚交一区二区| av亚洲在线观看| 色偷偷色偷偷色偷偷在线视频| 国产乱码精品| 美国三级日本三级久久99| 欧美a级片一区| 四虎8848精品成人免费网站| 欧美亚洲综合视频| 亚洲精品欧美| 亚洲欧美激情诱惑| 久久精品不卡| 国产精品成人a在线观看| 少妇精品久久久一区二区| 激情综合网站| 久久久久免费av| 国精品产品一区| 美腿丝袜亚洲一区| 国产精品亚洲综合久久| 国产日韩欧美三区| 日韩精品第二页| 日韩高清不卡一区二区| 蜜臀av性久久久久蜜臀aⅴ四虎 | 免费精品视频在线| 亚洲精品1区| 999久久久精品国产| 四虎884aa成人精品最新| 亚洲啊v在线| 日韩伦理一区| 日韩精品dvd| 国产在线观看www| 亚洲午夜天堂| 日韩国产激情| 久久久久99| 欧美成a人免费观看久久| 综合日韩av| 日韩精品dvd| 秋霞国产精品| 99久久99久久精品国产片果冰| 久久精品一区二区不卡| 四虎成人av| 黑森林国产精品av| 午夜av不卡| 日韩精品水蜜桃| 99久久夜色精品国产亚洲狼 | 五月天综合网站| 99热精品在线观看| 亚洲精品伊人| 国产日韩欧美在线播放不卡| 国产精品高清一区二区| 久久免费福利| 日韩在线看片| 激情综合自拍| 水野朝阳av一区二区三区| 亚洲精品成人一区| 欧美日韩夜夜| 国产一区二区三区久久久久久久久| 精品视频在线你懂得| 国产日韩电影| 国产精品88久久久久久| 丝袜诱惑制服诱惑色一区在线观看| 一区二区三区网站| 欧美久久亚洲| 精品一区二区三区中文字幕在线| av在线最新| 好吊视频一区二区三区四区| 亚洲字幕久久| 日本不卡中文字幕| 成人午夜在线| 亚洲成人三区| 亚洲网址在线观看| 国产亚洲精品美女久久 | 香蕉视频成人在线观看| 日韩国产欧美视频| bbw在线视频| 国产亚洲毛片在线| 日本一不卡视频| 免费视频一区二区三区在线观看 | 久久aⅴ国产紧身牛仔裤| 日韩欧美中文字幕在线视频| 牛牛精品成人免费视频| 日韩精品一区二区三区免费观影| 亚洲精品小说| 国产日韩一区二区三区在线| av资源中文在线| 欧美一区=区| 国产精品99久久久久久董美香| 日韩一区亚洲二区| 蜜桃视频一区二区三区 | 国产精品一区二区三区美女| 成午夜精品一区二区三区软件| 精品一区在线| 国产福利一区二区三区在线播放| 一区二区三区视频免费观看| 日韩黄色av| 日韩在线看片| 日本欧美一区二区在线观看| 国产白浆在线免费观看| 亚洲一区有码| 日本午夜大片a在线观看| 91在线成人| 婷婷精品在线观看| 成人午夜在线| 国产精品嫩草99av在线| 日韩欧美中文字幕电影| 亚洲精品在线a| 久久三级毛片| 女人天堂亚洲aⅴ在线观看| 日本va欧美va精品| 日韩在线综合| 亚洲欧洲专区| 电影91久久久| 国产精品日韩| 国产精品一区二区三区av麻| 免费在线小视频| 亚洲制服欧美另类| 国产一区二区亚洲| 日韩精品一级二级| 国产一区福利| 丝袜美腿亚洲色图| 久久gogo国模啪啪裸体| 亚洲不卡av不卡一区二区| 中文不卡在线| 电影天堂国产精品| 日韩综合一区二区三区| 中文在线а√在线8| 亚洲精品国产精品粉嫩| 超级白嫩亚洲国产第一| 男人的天堂久久精品| 久久久久伊人| 欧美精品中文| 欧美午夜不卡| 精品日韩一区| 喷白浆一区二区| 精品丝袜久久| 亚洲一级大片| 精品一区二区三区中文字幕| 视频一区在线播放| 深夜视频一区二区| 日本精品久久|