Tomcat架構解析(四)-----Coyote、HTTP、AJP、HTTP2等協議


  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,如下:

  

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM