@
看源碼雖然不能馬上提升你的編碼水平。但能讓你更好的理解編程。
因為我們tomcat多是以NIO形式處理請求,所以本系列講的都是NIO類型請求的處理相關組件。
在講解過程之前,把相關概念理解是非常關鍵的。
參與者
tomcat中Connector是負責處理請求的。
協議處理ProtocolHandler
Connector使用ProtocolHandler處理器來處理請求。不同的ProtocolHandler代表不同連接類型。
ProtocolHandler處理器可以用看作是協議處理統籌者,通過管理其他工作組件實現對請求的處理。ProtocolHandler 包含了三個非常重要的組件:
-
Endpoint: 負責接受,處理socket網絡連接
-
Processor: 負責將從Endpoint接受的socket連接根據協議類型封裝成request
-
Adapter:負責將封裝好的Request交給Container進行處理。
Socket的封裝
-
NioChannel: SocketChannel的基礎包裝類,在EndPonit中使用。
-
SocketWrapper:socket的包裝類,用於攜帶(NioChannel)socket進行傳遞。
區別:NioChannel是基本包裝,SocketWrapper是對NioChannel的進一步包裝.
多種buffer
- 套接字輸入流InputStream:屬於jdk中的io包。充當操作系統從底層讀取socket字節的通道
- SokcetBuffer即ByteBuffer。位於java.nio包下,NIO層面的buffer。Tomcat在創建此類Buffer時默認的大小時8*1024,也就是8K
- InputBuffer接口(內部緩沖區):coyote包下, 用於Tomcat內部的Request緩沖區。套接字輸入緩沖裝置,即提供一種緩沖的模式從socket中讀取字節流。通過查看源碼我感覺他也是一個工具接口,更加偏向於一個工具.列如:實現類Http11InputBuffer,具有提供解析請求頭與轉義功能.
- InputBuffer類:connector包下。用於Servlet規范的Request內部的緩沖區
- MessageBytes消息字節:tomcat在接受socket傳入的字節之后並不會馬上進行編碼轉換,而是保持byte[]數組,在用到的地方再進行轉換。MessageBytes正是byte[]的抽象
- 子節塊操作工具ByteChunk: 首先他是一個工具,一個操作緩沖的工具。其次有兩個內部接口:ByteInputChannel和ByteOutputChannel讀寫數據。還有一個Chartset對象方便編碼。所以他是一個提供了編碼功能,操作緩存的工具。
兩對request,response
tomcat中存在兩組request,respone
- org.apache.coyote包下的:
屬於Tomcat內部對請求的一個定義,final類型的類不對開發者開放。主要功能就是封裝socket解析http協議的header內容。 - org.apache.catalina.connector包下的:
屬於對servlet規范的實現。也是我們開發常見的request對象。
所以tomcat中會有一個涉及request與request的轉換過程,這些過程都放到后續講,此篇只講解組件概念。
Tomcat內部使用Apache Coyote庫來處理網絡I/O的。Connector包多是用於Serlvet規范。
多種處理器
tomcat內部很多都命名為處理器。這里講講提幾個講講區別:
-
ProtocolHandler處理器:統籌或者管理級別的處理器。Connector把請求處理的工作交給ProtocolHandler去處理。剩下的是ProtocolHandler統籌。由此看出他是一個管理界別的處理器
-
ConnectionHandler:連接處理器,.內部維護Processor的map用於重用SocketProcessor. 把創建Processor的工作交給ProtocolHandler去做.
SocketProcessor處理器調用ConnectionHandler.process()將socket請求內容傳入Processor.process()進行處理.
由此可見ConnectionHandler具有承上啟下的作用.
-
SocketBufferHandler:socketBuffer處理器。包含兩個SocketBuffer,用於socket讀寫的緩沖。
-
SocketProcessor: socket處理器,針對socket的處理器。本身是一個worker,將socket內容交給Processor處理
-
(Processor)Http11Processor: HTTP協議1.1是目前使用最多的一個HTTP協議版本。從此處理器的名字我們也可以看出,他就是針對此協議的處理。此處理器是將socket轉為請求的主要組件,他從socket將HTTP協議的內容解析出來,不過在tomcat中他只負責了對http請求行,請求頭的解析;請求體的解析延遲到了servlet中去解析了。 Http11Processor 由ConnectionHandler 創建,tomcat 對關鍵的類都實現了重用,以減少頻繁創建和銷毀的開銷,會從recycledProcessors 里pop出來
總結
掌握了這些相關組件的概念后。下章講解socket如何變成request。