Tomcat架构解析(四)-----Coyote、HTTP、AJP、HTTP2等协议

时间:2022-09-20 22:36:28

Connector是Tomcat中非常重要的一个组成部分,说白了,就是如何从客户端获取到相应的请求信息。这部分主要包括的难点有这样几个部分:

1、客户端与服务端的协议

客户端与服务端的协议是多种多样的,Tomcat肯定不能仅仅支持HTTP协议

2、数据I/O方式

I/O通常有NIO、BIO等多种方式,如何提高数据传输的效率?

一、Coyote

  1、Coyote简介

Tomcat中的Connector就是Coyote,功能主要是封装了底层的网络通信。为Catalina容器提供了统一的接口,使容器与具体的协议以及I/O解耦。如图:

Tomcat架构解析(四)-----Coyote、HTTP、AJP、HTTP2等协议

注:Catalina就是Tomcat中servlet容器实现。

2、Tomcat支持的协议与I/O方式

HTTP/1.1、AJP协议(用于和一些web服务器集成,如nginx等等)、HTTP/2.0

BIO(8.0版本后就不用了,毕竟慢)、NIO、NIO2、APR

协议和I/O方式分别是用于应用层以及传输层,如下图所示:

Tomcat架构解析(四)-----Coyote、HTTP、AJP、HTTP2等协议

二、web请求处理

以下动图为tomcat处理请求的过程:

Tomcat架构解析(四)-----Coyote、HTTP、AJP、HTTP2等协议

1、Connector设计

Tomcat架构解析(四)-----Coyote、HTTP、AJP、HTTP2等协议

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、请求处理过程

Tomcat架构解析(四)-----Coyote、HTTP、AJP、HTTP2等协议

上图是Tomcat8.5版本前的处理过程,在8.5之后,由于增加了upgradeProtocol支持HTTP升级协议处理,过程变成下图:

Tomcat架构解析(四)-----Coyote、HTTP、AJP、HTTP2等协议

过程解释:

Tomcat架构解析(四)-----Coyote、HTTP、AJP、HTTP2等协议

Tomcat架构解析(四)-----Coyote、HTTP、AJP、HTTP2等协议

Tomcat架构解析(四)-----Coyote、HTTP、AJP、HTTP2等协议

三、Tomcat支持的相关协议

  1、HTTP

Tomcat架构解析(四)-----Coyote、HTTP、AJP、HTTP2等协议

a、请求信息示例:

Tomcat架构解析(四)-----Coyote、HTTP、AJP、HTTP2等协议

Tomcat架构解析(四)-----Coyote、HTTP、AJP、HTTP2等协议

Tomcat架构解析(四)-----Coyote、HTTP、AJP、HTTP2等协议

b、响应信息示例:

Tomcat架构解析(四)-----Coyote、HTTP、AJP、HTTP2等协议

Tomcat架构解析(四)-----Coyote、HTTP、AJP、HTTP2等协议

在Tomcat中,相关配置可以在server.xml中查看,例如:

Tomcat架构解析(四)-----Coyote、HTTP、AJP、HTTP2等协议

2、AJP

一般在应用服务器(Tomcat、JBoss等等)的前端布置web服务器(apache server、nginx等等)。目的有如下:

a、可以做负载均衡,将请求合理的分配到应用服务器上;

b、静态资源优化,web服务器在静态资源处理上有性能优势。

那这样布置的话也会产生问题,web服务器与应用服务器之间需要通过TCP建立连接,那这样的话就需要建立很多的socket连接,并且连接也是无状态,都是短连接,效率非常低。所以需要减少socket的创建,并且尽量保证持久的TCP连接。

AJP协议就是为了解决这两个问题产生的,基于二进制传输,并且目前主流的web服务器都支持AJP协议。

Tomcat架构解析(四)-----Coyote、HTTP、AJP、HTTP2等协议

请求消息格式与响应消息格式:

Tomcat架构解析(四)-----Coyote、HTTP、AJP、HTTP2等协议

Tomcat架构解析(四)-----Coyote、HTTP、AJP、HTTP2等协议

Tomcat架构解析(四)-----Coyote、HTTP、AJP、HTTP2等协议

3、HTTP/2.0

Tomcat架构解析(四)-----Coyote、HTTP、AJP、HTTP2等协议

Tomcat架构解析(四)-----Coyote、HTTP、AJP、HTTP2等协议

Tomcat架构解析(四)-----Coyote、HTTP、AJP、HTTP2等协议

由于协议这块对应的内容非常之多,所以通过以下两个图简单对比下HTTP/1.1与HTTP/2.0,如下:

Tomcat架构解析(四)-----Coyote、HTTP、AJP、HTTP2等协议

Tomcat架构解析(四)-----Coyote、HTTP、AJP、HTTP2等协议