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