Connector是Tomcat中非常重要的一個組成部分,說白了,就是如何從客戶端獲取到相應的請求信息。這部分主要包括的難點有這樣幾個部分:
1、客戶端與服務端的協議
客戶端與服務端的協議是多種多樣的,Tomcat肯定不能僅僅支持HTTP協議
2、數據I/O方式
I/O通常有NIO、BIO等多種方式,如何提高數據傳輸的效率?
一、Coyote
1、Coyote簡介
Tomcat中的Connector就是Coyote,功能主要是封裝了底層的網絡通信。為Catalina容器提供了統一的接口,使容器與具體的協議以及I/O解耦。如圖:
注:Catalina就是Tomcat中servlet容器實現。
2、Tomcat支持的協議與I/O方式
HTTP/1.1、AJP協議(用於和一些web服務器集成,如nginx等等)、HTTP/2.0
BIO(8.0版本后就不用了,畢竟慢)、NIO、NIO2、APR
協議和I/O方式分別是用於應用層以及傳輸層,如下圖所示:
二、web請求處理
以下動圖為tomcat處理請求的過程:
1、Connector設計
endpoint:Tomcat中提供了AbstractEndpoint抽象類,用於監聽客戶端的請求,收取客戶端的socket,並且根據不同的I/O方式提供了NioEndpoint、AprEndpoint、Nio2Endpoint。
processor:Coyete協議處理接口,負責構造request以及response對象,並通過adapter提交到catalina容器。主要包括HTTP11Processor、AjpProcessor、StreamProcessor(HTTP/2.0)
protocolHandler:封裝了endpoint以及processor
upgradeProtocol:表示HTTP升級協議,根據請求創建一個用於升級處理的令牌upgradeToken
2、請求處理過程
上圖是Tomcat8.5版本前的處理過程,在8.5之后,由於增加了upgradeProtocol支持HTTP升級協議處理,過程變成下圖:
過程解釋:
三、Tomcat支持的相關協議
1、HTTP
a、請求信息示例:
b、響應信息示例:
在Tomcat中,相關配置可以在server.xml中查看,例如:
2、AJP
一般在應用服務器(Tomcat、JBoss等等)的前端布置web服務器(apache server、nginx等等)。目的有如下:
a、可以做負載均衡,將請求合理的分配到應用服務器上;
b、靜態資源優化,web服務器在靜態資源處理上有性能優勢。
那這樣布置的話也會產生問題,web服務器與應用服務器之間需要通過TCP建立連接,那這樣的話就需要建立很多的socket連接,並且連接也是無狀態,都是短連接,效率非常低。所以需要減少socket的創建,並且盡量保證持久的TCP連接。
AJP協議就是為了解決這兩個問題產生的,基於二進制傳輸,並且目前主流的web服務器都支持AJP協議。
請求消息格式與響應消息格式:
3、HTTP/2.0
由於協議這塊對應的內容非常之多,所以通過以下兩個圖簡單對比下HTTP/1.1與HTTP/2.0,如下: