溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Tomcat NIO中整體架構是怎么樣的

發(fā)布時間:2021-11-18 09:54:33 來源:億速云 閱讀:170 作者:小新 欄目:大數據

小編給大家分享一下Tomcat NIO中整體架構是怎么樣的,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!



對于 tomcat NIO 來說,是由一系列框架類和數據讀寫類來組成的,同時這些類運行在不同的線程中,共同維持整個 tomcat NIO 架構。包括原始 socket 監(jiān)聽的acceptor 線程,監(jiān)測注冊在原始 scoket 上的事件是否發(fā)生的 poller thread 事件線程,進行數據讀寫和運行 servlet API 的 tomcat io 線程。當數據需要多次讀寫的時候,監(jiān)測注冊在原始 scoket 上的讀寫事件的 block poller 事件線程。這些類和線程共同組成的 tomcat NIO 整體結構如下所示:  

Tomcat NIO中整體架構是怎么樣的

上面我們可以發(fā)現整體架構運行著4種線程:
  • Acceptor 線程
  • Poller 線程
  • Tomcat IO 線程
  • BlockPoller 線程

Acceptor線程

  • tomcat NIO 架構中會有一個 acceptor 線程,這個線程主要監(jiān)聽端口。當有請求過來的時候,完成 tcp 三次握手,將 accept 過來的 socket 注冊OP_REGISTER 事件,并將該事件提交到 Poller 線程的事件隊列 PollerEventQueue中 。


Poller線程
  • 在 tomcat NIO 架構中會有 poller 線程,在 tomcat8 及以前的版本之中,可以通過 pollerThreadCount 配置 poller thread 的數目,但是在 tomcat 9.0.21 中 poller thread 數目始終會為 1。

  • poller thread 的核心功能主要由以前文章中介紹的 Poller 類來實現,對于每一個 poller 實例都有一個 NIO selector 實例,同時也有一個事件隊列SynchronizedQueue<PollerEvent>。

  • 對于每一個 poller thread 來說,都會去輪詢隊列 SynchronizedQueue<PollerEvent>,該隊列的事件由 acceptor 線程(監(jiān)聽到新連接時)或者 tomcat io 線程(處理完請求之后保持長連接,添加讀事件)放入,然后根據不同的事件對原始socket注冊相應的讀寫事件。

  • 每一個poller thread 來說,會調用 java NIO 對象 selector,發(fā)起系統(tǒng)調用,來監(jiān)測原始 scoket 是否有讀寫事件發(fā)生,如果有則將原始 scoket 的封裝對象交由 tomcat io 線程處理。


Tomcat IO線程
  • tomcat io 線程是一個線程池,線程池大小可由 tomcat 相關參數配置。
  • tomcat io 線程會接受 poller thread 傳入的 scoket 封裝對象后,依次調用以前文章介紹的 SocketProcessor/ConnectionHanlder(global instance)/Http11Processor/CoyoteAdapter,最后交由 servlet container 完成servlet API 的調用。
  • 對于request header 的解析,request body 的獲取,servlet API 的調用,response 數據的寫入發(fā)送,這一系列過程都是在 tomcat io 線程中完成的。
  • 對于request header,request body 有時候需要多次讀取操作,這個時候 tomcat io 線程會將原始 socket 再次進行讀事件的注冊,并交由 BlockPoller 線程處理,然后在以前文章中介紹的 readLatch (CountDownLatch) 對象上等待。
  • 對于 response data 有時候不可寫,比如原始 scoket 的發(fā)送緩沖區(qū)滿了,這個時候 tomcat io 線程同樣會將原始 socket 再次注冊寫事件,并交由 BlockPoller 線程處理,然后在以前文章介紹的 writeLatch 對象上等待。


BlockPoller線程

  • tomcat NIO 架構中會有 block poller 線程,其核心功能由以前文章中介紹的 BlockPoller 類來實現,BlockPoller 實例會有一個 NIO selector 實例,同時也會擁有一個自己的事件隊列實例SynchronizedQueue<Runnable>。

  • 對于BlockPoller thread來說, 會去輪詢隊列 SynchronizedQueue<Runnable>,該隊列的對象(RunnableAdd類型)由 tomcat io 線程放入,然后根據不同的對象對原始 socket 注冊相應的讀寫事件。

  • 對于BlockPoller thread來說, 會調用 java NIO 對象 selector,發(fā)起系統(tǒng)調用,來監(jiān)測原始 scoket 是否有讀寫事件發(fā)生。如果有,則將以前文章介紹的在 readLatch 或者 writeLatch 對象上等待的 tomcat io 線程喚醒,然后 tomcat io 線程繼續(xù)完成讀寫操作。

看完了這篇文章,相信你對“Tomcat NIO中整體架構是怎么樣的”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI