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

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

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

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

一丶Connector

在tomcat中,Connector負(fù)責(zé)開啟socket并且監(jiān)聽客戶端請(qǐng)求,返回響應(yīng)數(shù)據(jù)。

其中:

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

springboot內(nèi)嵌tomcat,一般默認(rèn)使用NioEndpoint,在NioEndpoint#start方法中,會(huì)觸發(fā)NioEndpoint#bind

三丶NioEndpoint 啟動(dòng)Poller和Acceptor線程

NioEndpoint#start方法最后會(huì)觸發(fā)Poller線程和Acceptor線程的啟動(dòng)

可以看到NioEndpoint內(nèi)部的Poller,和Acceptor都是單獨(dú)使用一個(gè)守護(hù)線程來(lái)運(yùn)行。

四丶Acceptor接收請(qǐng)求

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

其內(nèi)部使用LimitLatch#countUpOrAwait方法限制連接數(shù),如果連接數(shù)達(dá)到了上限,那將掛起當(dāng)前線程,也就是掛起Acceptor線程,從而導(dǎo)致無(wú)法有更多的請(qǐng)求連接上來(lái),最大連接數(shù)默認(rèn)為8*1024。

LimitLatch 內(nèi)部持有一個(gè)AbstractQueuedSynchronizer,限制連接數(shù)將調(diào)用其acquireSharedInterruptibly(1),然后會(huì)調(diào)用到AQS的tryAcquireShared,其內(nèi)部使用AtomicLong來(lái)進(jìn)行連接的計(jì)數(shù)。

2.NioEndpoint#serverSocketAccept 接收Socket連接

由于NioEndpoint前面調(diào)用了ServerSocketChannel#configureBlocking(true),所以serverSock#accept,在沒(méi)有連接上來(lái)時(shí),不會(huì)立馬返回null,而是阻塞直到連接來(lái)到。

3.NioEndpoint#setSocketOptions將SocketChannel注冊(cè)到Poller

在Acceptor線程接收到SocketChannel后,會(huì)調(diào)用Poller#register方法進(jìn)行注冊(cè),Acceptor只負(fù)責(zé)接受請(qǐng)求,請(qǐng)求后續(xù)的處理由Poller線程負(fù)責(zé)

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

wakeupCounter 是AtomicLong類型,Acceptor接受到請(qǐng)求,將請(qǐng)求封裝為PollerEvent后會(huì)調(diào)用wakeupCounter#incrementAndGet方法,進(jìn)行+1操作

Poller在使用Selector,進(jìn)行IO多路復(fù)用的時(shí)候,會(huì)進(jìn)行如下操作

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

也就說(shuō)Acceptor接受到請(qǐng)求越多,wakeupCounter越大,越會(huì)讓Poller調(diào)用selector.selectNow()減少阻塞,從而讓Poller更快的檢查事件是否就緒,從而讓請(qǐng)求更及時(shí)的被處理。

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

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

2.Poller 使用Selector進(jìn)行select

通過(guò)Selector獲取獲取當(dāng)前就緒的IO,keyCount記錄就緒數(shù)目。

3.Poller 處理就緒IO

processKey會(huì)調(diào)用到processSocket,最終使用tomcat線程池中的線程進(jìn)行異步處理

最終會(huì)找到Processor進(jìn)行處理(默認(rèn)使用緩存的,避免重復(fù)new對(duì)象,頻繁gc,如果緩存沒(méi)有那么使用ProtocolHandler 創(chuàng)建出一個(gè)),這里的Processor就是Http11Processor

然后根據(jù)事件類型進(jìn)行不同的處理,如果是讀事件那么會(huì)調(diào)用Http11Processor#service進(jìn)行處理,然后會(huì)繼續(xù)交給CoyoteAdapter調(diào)用其service進(jìn)行處理。

六丶CoyoteAdapter處理請(qǐng)求1.使用Mapper找到請(qǐng)求對(duì)應(yīng)的Host,Context,Wrapper

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

如下是Mapper找到的MappingData

2.Pipeline執(zhí)行

上面說(shuō)到,Mapper會(huì)找到當(dāng)前請(qǐng)求所屬的host,context和對(duì)應(yīng)的Wrapper,緊接著會(huì)進(jìn)行Pipeline的執(zhí)行。

為了增強(qiáng)擴(kuò)展性,tomcat定義了Pipeline(管道)和Valve(閥),Pipeline使用職責(zé)鏈的方式串聯(lián)多個(gè)Valve——來(lái)自客戶端的請(qǐng)求如同流水一樣流淌在管道中,受到每一個(gè)閥的作用。

Pipeline中維護(hù)了基礎(chǔ)的Valve,始終位于Pipeline末端,通過(guò)Pipeline#addValve添加的Valve違約基礎(chǔ)的Valve之前。

在Tomcat中Engine,Host,Context,Wrapper都有對(duì)應(yīng)的Valve實(shí)現(xiàn),同時(shí)維護(hù)了一個(gè)Pipeline,從而讓我們可以對(duì)請(qǐng)求的處理進(jìn)行擴(kuò)展。

下面是比較重要的Valve

StandardEngineValve :Engine對(duì)應(yīng)的Valve,負(fù)責(zé)請(qǐng)求是否通過(guò)mapper找到了對(duì)應(yīng)的Host,并觸發(fā)Host對(duì)應(yīng)的Valve

ErrorReportValve: 錯(cuò)誤報(bào)告Valve讓后續(xù)的Valve繼續(xù)執(zhí)行,如果執(zhí)行出現(xiàn)錯(cuò)誤那么會(huì)刷新響應(yīng)流,讓客戶端收到響應(yīng)

StandardHostValve:Host對(duì)應(yīng)的Valve,如果請(qǐng)求沒(méi)有匹配的context返回404,反之調(diào)用Context對(duì)應(yīng)的Valve

StandardContextValve:Context對(duì)應(yīng)的Valve,如果請(qǐng)求路徑以/META-INF/,或者/WEB-INF/開頭,會(huì)直接返回404,反之繼續(xù)調(diào)用Wrapper對(duì)應(yīng)的

StandardWrapperValve:Wrapper對(duì)應(yīng)的Valve,會(huì)負(fù)責(zé)組裝Servlet和Filter,并執(zhí)行FilterChain#doFilter方法

Filter的匹配主要通過(guò)DispatchType和Filter設(shè)置的路徑,

在SpringBoot項(xiàng)目中可以使用FilterRegistrationBean#setDispatcherTypes,和addUrlPatterns進(jìn)行指定。

3.FilterChain執(zhí)行

在Tomcat中ApplicationFilterChain實(shí)現(xiàn)了Java Servlet規(guī)范中的FilterChain。

其中使用ApplicationFilterConfig是對(duì)FilterConfig的實(shí)現(xiàn),內(nèi)部持有一個(gè)Filter。

ApplicationFilterChain包含多個(gè)ApplicationFilterConfig,使用數(shù)組和pos屬性記錄當(dāng)前執(zhí)行到第幾個(gè)Filter

Filter都執(zhí)行結(jié)束后,將執(zhí)行Servlet#service方法

在SpringMVC項(xiàng)目中,會(huì)調(diào)用到DispatcherServlet#service,最終調(diào)用到Controller。

到此這篇關(guān)于Tomcat請(qǐng)求處理流程與源碼淺析的文章就介紹到這了,更多相關(guān)Tomcat請(qǐng)求處理內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Tomcat
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美日韩 国产精品| 成人免费网站www网站高清| 日本欧美久久久久免费播放网| 青青草国产成人99久久| 欧洲一区二区三区精品| 国产亚洲激情| 国产精品一线| 香蕉久久夜色精品国产| 国产激情欧美| 精品三级久久| 性欧美长视频| 国产精品欧美三级在线观看 | 九九久久国产| 欧美久久久网站| 欧美va天堂在线| 天堂av在线| 国产日韩在线观看视频| 亚洲+小说+欧美+激情+另类| 国产亚洲精品美女久久 | 电影91久久久| 久久久久九九精品影院| 欧美自拍一区| 欧美亚洲综合视频| 蜜桃视频免费观看一区| 久久亚洲成人| 久久精品av| 久久精品国产大片免费观看| 日韩欧美三级| 99久久久久| 不卡在线一区| 久久国产88| 亚洲三级av| 亚洲精品在线国产| 激情五月综合| 福利视频一区| 精品国产鲁一鲁****| 国产欧洲在线| 91九色精品| 日韩国产欧美三级| 麻豆成人综合网| 91精品啪在线观看国产18| 性一交一乱一区二区洋洋av| 国产亚洲一区二区三区不卡| 色在线视频观看| 亚洲免费高清| 国产福利一区二区精品秒拍 | 97精品97| 免费人成精品欧美精品| 久久av影院| 不卡中文一二三区| 欧美一区网站| 久久婷婷一区| 日本不卡高清| 麻豆国产精品777777在线| 99视频精品全部免费在线视频| 伊人精品久久| 精品三级在线观看视频| 日韩亚洲精品在线| 欧美黑人做爰爽爽爽| 不卡在线一区| 乱一区二区av| 丝袜美腿亚洲色图| 久久婷婷国产| 男人操女人的视频在线观看欧美| 欧美一区成人| 在线精品视频在线观看高清| 久久狠狠久久| av亚洲一区二区三区| 美国三级日本三级久久99| 久久久久观看| 中文无码日韩欧| 韩国精品主播一区二区在线观看 | 日韩黄色大片网站| 天堂va在线高清一区| 成人羞羞视频在线看网址| 日本电影久久久| 美女一区网站| 日韩高清中文字幕一区| 秋霞影院一区二区三区| 国产欧美三级| 亚洲综合不卡| 国产精品字幕| 狠狠久久伊人| 日本精品另类| 亚洲一区亚洲| 久久久成人网| 精品香蕉视频| 国产欧美一区二区色老头| 99视频精品免费观看| 日韩av免费| 欧美国产极品| 亚洲久久在线| 免费精品视频| 激情欧美国产欧美| 欧洲av不卡| 精品国产不卡| 国产精品对白久久久久粗| 亚洲免费资源| 国产精品视区| 欧洲激情综合| 色天使综合视频| 国产一区二区三区四区五区 | 欧美交a欧美精品喷水| 97成人超碰| aa亚洲婷婷| 女人天堂亚洲aⅴ在线观看| 伊伊综合在线| 国产一区不卡| 国产一区二区三区不卡视频网站| 欧美久久精品| 久久精品av麻豆的观看方式| 一级成人国产| 亚洲无线观看| 免费日韩av片| 亚洲欧美日韩综合国产aⅴ| 亚洲精品极品少妇16p| 久久三级视频| 日韩在线观看不卡| 国产综合色区在线观看| 国产在线观看91一区二区三区| 久久久久亚洲精品中文字幕| 国产欧美一区二区三区米奇| 国产日韩视频| 国产精品第一| 国产日韩三级| 国产精品高潮呻吟久久久久| 欧美日韩精品一区二区三区视频 | 欧美亚洲网站| 国产精品一区2区3区| 日本不卡不码高清免费观看| 久久av一区| 日韩欧美高清一区二区三区| 亚洲精一区二区三区| 亚洲精品一二| 欧美日韩在线精品一区二区三区激情综合 | 乱一区二区av| 成人午夜在线| 日韩电影免费网站| 成人羞羞在线观看网站| 香蕉视频亚洲一级| 欧美日韩水蜜桃| 欧美特黄视频| 男女精品网站| 日本久久二区| 久久99久久久精品欧美| 国产激情在线播放| 日韩高清中文字幕一区二区| 99久久99久久精品国产片果冰| 精品一区在线| 日韩视频精品在线观看| 亚洲精品一二三区区别| 一本色道精品久久一区二区三区| 久久aⅴ国产紧身牛仔裤| 美国三级日本三级久久99| 91精品国产自产观看在线| 精品一区二区三区视频在线播放 | 亚洲一区观看| 婷婷成人av| 麻豆久久一区二区| 久久久777| 久久国产精品久久久久久电车| 日韩在线网址| 国产一区二区精品福利地址| 999国产精品视频| 丝袜美腿亚洲色图| 欧美日一区二区三区在线观看国产免| 国产一区二区三区不卡视频网站| 色婷婷久久久| 亚洲综合图色| 国产亚洲一区| 日本精品不卡| 手机精品视频在线观看| 国产午夜精品一区在线观看| 国产网站在线| 久久亚洲影院| 免费观看亚洲天堂| 国产精品99免费看| 婷婷亚洲成人| 国产成人免费| 免费国产亚洲视频| 精品国产亚洲日本| 99在线精品免费视频九九视| 欧美一区精品| 亚洲大片在线| 视频一区日韩| av中文资源在线资源免费观看| 亚洲经典在线| 欧美xxxx性| 国产精品毛片| 久久一区视频| 亚洲综合色婷婷在线观看| 91亚洲一区| 日本精品在线播放| 亚洲福利国产| 国产欧美在线观看免费| 红桃视频国产一区| 精品免费视频| 亚洲乱码久久| 色88888久久久久久影院| 综合亚洲自拍|