阿里-马云的学习笔记

导航

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

  

  

 

posted on 2019-03-31 22:59  阿里-马云的学习笔记  阅读(2047)  评论(0编辑  收藏  举报