Tomcat源码分析 -- Tomcat连接器简介

本篇结构:

  • 前言
  • 什么是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主要支持两种协议:

  1. HTTP/1.1协议:这是大部分Web应用采用的访问协议,多用于Tomcat单独运行的情况。
  2. AJP协议:用于和Web服务器集成(如Apache HTTP Server),以实现针对静态资源的优化及集群部署。

3.2、Coyote I/O方案

Tomcat自8.5及9.0版本起,已经移除了对BIO的支持,目前支持的I/O方案有:

  1. NIO:采用Java NIO类库实现。
  2. NIO2:采用JDK 7最新的NIO2类库实现。
  3. 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是如何处理请求的。

猜你喜欢

转载自blog.csdn.net/w1992wishes/article/details/79552081