亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2023年05月29日 08:21:34   作者:Cuzzz  
這篇文章主要介紹了Tomcat請求處理流程與源碼淺析,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

Tomcat請求處理流程與源碼淺析

一丶Connector

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

其中:

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

二丶NioEndpoint 初始化ServerSocketChannel

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

三丶NioEndpoint 啟動Poller和Acceptor線程

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

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

四丶Acceptor接收請求

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

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

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

2.NioEndpoint#serverSocketAccept 接收Socket連接

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

3.NioEndpoint#setSocketOptions將SocketChannel注冊到Poller

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

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

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

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

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

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

五丶Poller處理事件

1.events方法查看事件隊列是否具備事件

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

2.Poller 使用Selector進行select

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

3.Poller 處理就緒IO

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

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

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

六丶CoyoteAdapter處理請求

1.使用Mapper找到請求對應的Host,Context,Wrapper

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

如下是Mapper找到的MappingData

2.Pipeline執(zhí)行

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

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

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

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

下面是比較重要的Valve

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

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

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

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

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

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

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

3.FilterChain執(zhí)行

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

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

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

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

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

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

相關(guān)文章

  • 在Tomcat中配置404自定義錯誤頁面詳解

    在Tomcat中配置404自定義錯誤頁面詳解

    這篇文章主要介紹了在Tomcat中配置404自定義錯誤頁面全解,需要的朋友可以參考下
    2017-03-03
  • Tomcat配置控制臺的實現(xiàn)

    Tomcat配置控制臺的實現(xiàn)

    本文主要介紹了Tomcat配置控制臺的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • Tomcat 部署項目的三種方法詳解

    Tomcat 部署項目的三種方法詳解

    本篇文章主要介紹了Tomcat 部署項目的三種方法詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • 在IDEA 2020.3.1中部署Tomcat并且創(chuàng)建第一個web項目的過程詳解

    在IDEA 2020.3.1中部署Tomcat并且創(chuàng)建第一個web項目的過程詳解

    這篇文章主要介紹了在IDEA 2020.3.1中部署Tomcat并且創(chuàng)建第一個web項目,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • 基于tomcat映射路徑配置方法分享

    基于tomcat映射路徑配置方法分享

    下面小編就為大家分享一篇基于tomcat映射路徑配置方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • tomcat相關(guān)配置與eclipse集成_動力節(jié)點Java學院整理

    tomcat相關(guān)配置與eclipse集成_動力節(jié)點Java學院整理

    這篇文章主要介紹了tomcat相關(guān)配置與eclipse集成_動力節(jié)點Java學院整理的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • 詳解Tomcat雙擊startup.bat閃退的解決方法

    詳解Tomcat雙擊startup.bat閃退的解決方法

    這篇文章主要介紹了詳解Tomcat雙擊startup.bat閃退的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • Tomcat進程占用CPU過高的解決方法

    Tomcat進程占用CPU過高的解決方法

    本文主要介紹了Tomcat進程占用CPU過高的解決方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Tomcat服務器配置https認證(使用keytool生成證書)

    Tomcat服務器配置https認證(使用keytool生成證書)

    本文主要介紹了Tomcat服務器配置https認證,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • Linux下安裝配置tomcat

    Linux下安裝配置tomcat

    Tomcat是一個輕量級應用服務器,在中小型系統(tǒng)和并發(fā)訪問用戶不是很多的場合下被普遍使用,是開發(fā)和調(diào)試JSP程序的首選。對于一個初學者來說,可以這樣認為,當在一臺機器上配置好Apache服務器,可利用它響應對HTML 頁面的訪問請求。
    2017-05-05

最新評論