本篇结构:
- 前言
- 什么是Coyote
- Coyote支持的协议及I/O方案
- Coyote重要组件
- 总结
一、前言
Tomcat是一款servlet服务器,它能够接受请求,处理请求并给出响应。
前面的篇章介绍了Tomcat容器框架Catalina的相关内容,主要介绍了Tomcat容器的初始化和启动,并没有介绍这些容器启动之后做什么,其实Catalina容器启动后主要是负责处理来自客服端的请求并输出响应。
之所以没有在前面的篇幅介绍这些,是因为Catalina容器只负责处理请求,而请求的接收是由Tomcat的连接器来做的,只有把Tomcat的Tomcat的连接器搞清楚了,才能完整理解Tomcat是怎样处理Web请求的。
所以在正式介绍Tomcat是如何处理请求之前,先来了解下Tomcat的连接器。
二、什么是Coyote
如上,Coyote是Tomcat源码中的一个包名,也可以说是Tomcat连接器框架的名字,是Tomcat服务器提供的供客户端访问的外部接口。客户端通过Coyote与服务器建立连接、发送请求并接收响应。
Coyote封装了底层的网络通信,为Catalina容器提供统一的接口,使得Catalina容器和具体的请求协议及I/O方式解耦。Coyote将Socket输入转换为自定义的Request对象,交由Catalina容器处理,处理完请求后,Catalina容器通过Coyote提供的自定义Response对象将结果写入输出流。
Coyote是相对独立的模块,和Servlet的规范实现没有直接关系,它只负责网络协议和I/O的处理,由它自定义的Request和Response对象也没有实现Servlet规范对应的接口,而是在Catalina容器中进一步被封装成ServletRequest和ServletResponse。
可以通过下图简单理解下:
三、Coyote支持的协议及I/O方案
3.1、Coyote支持的协议
在server.xml中可以看到这样的配置:
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"/>
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>
...
<Service/>
这个配置是说一个Service可以配置多个Connector,支持不同的网络协议。
由配置可知,Tomcat主要支持两种协议:
- HTTP/1.1协议:这是大部分Web应用采用的访问协议,多用于Tomcat单独运行的情况。
- AJP协议:用于和Web服务器集成(如Apache HTTP Server),以实现针对静态资源的优化及集群部署。
3.2、Coyote I/O方案
Tomcat自8.5及9.0版本起,已经移除了对BIO的支持,目前支持的I/O方案有:
- NIO:采用Java NIO类库实现。
- NIO2:采用JDK 7最新的NIO2类库实现。
- APR:采用APR(Apache可移植运行库)实现,是使用C/C++编写的本地库,选择该方案,需要单独安装APR库。
四、Coyote重要组件
Coyote是Tomcat连接器框架的名称,这节简单介绍下Coyote涉及到的主要的组件,了解下这些组件的概念。
先看看在之前的篇章--整体架构中贴出的一张连接器的设计结构图:
可以说Connector就是Tomcat的连接器,是Coyote最直接的体现。
4.1、ProtocolHandler
ProtocolHandler是Tomcat协议接口,Connector使用ProtocolHandler来处理请求。ProtocolHandler由包含了三个部件:Endpoint、Processor、Adapter。
它实现针对具体协议的处理功能。按照协议和I/O有如下继承关系:
在server.xml中设置连接器时,需要指定具体的ProtocolHandler,也可以制定协议的名称,比如HTTP/1.1。
4.2、Endpoint
Endpoint是通信端点,即通信监听的接口,是具体的Socket接收处理类,是对传输层的抽象。由于是处理底层的Socket网络连接,因此Endpoint是用来实现TCP/IP协议的。
Tomcat并没有Endpoint接口,而是一个抽象类AbstractEndpoint,根据I/O方式的不同,提供了如下的实现:
Endpoint内部有个Handler接口,用于处理接收到的Socket,在内部调用Processor进行处理。
Acceptor是Endpoint的一个部件,用于监听请求。
4.3、Processor
Processor是协议处理接口,负责构造Request和Response对象,并通过Adapter将其提交到Catalina容器处理,是对应用层协议的抽象。
在Coyote中,根据协议的不同有三个不同的实现类,另外还有两个具体的升级协议处理的实现。
参见下图:
4.4、Adapter
Adapter充当适配器,将Processor构造的Request对象转换为ServletRequest交给Container进行具体的处理。
只有一个实现类:CoyoteAdapter。
五、总结
下面就应该介绍Connector是怎么初始化启动的,了解了这些就可以真正开始看Tomcat是如何处理请求的。