Tomcat处理HTTP请求源码分析

很多开源应用服务器都是集成tomcat作为web container的,而且对于tomcat的servlet container这部分代码很少改动。

这样,这些应用服务器的性能基本上就取决于Tomcat处理HTTP请求的connector模块的性能。

本文首先从应用层次分析了tomcat所有的connector种类及用法,接着从架构上分析了connector模块在整个tomcat中所处的位置,最后对connector做了详细的源代码分析。

并且我们以Http11NioProtocol为例详细说明了tomcat是如何通过实现ProtocolHandler接口而构建connector的。

Connector的种类

Tomcat源码中与connector相关的类位于org.apache.coyote包中,Connector分为以下几类:

Http Connector, 基于HTTP协议,负责建立HTTP连接。它又分为BIO Http Connector与NIO Http Connector两种,后者提供非阻塞IO与长连接Comet支持。

AJP Connector, 基于AJP协议,AJP是专门设计用来为tomcat与http服务器之间通信专门定制的协议,能提供较高的通信速度和效率。如与Apache服务器集成时,采用这个协议。

APR HTTP Connector, 用C实现,通过JNI调用的。主要提升对静态资源(如HTML、图片、CSS、JS等)的访问性能。现在这个库已独立出来可用在任何项目中。Tomcat在配置APR之后性能非常强劲。

Connector的配置

对Connector的配置位于conf/server.xml文件中。

BIO HTTP/1.1 Connector配置

一个典型的配置如下:

<Connector port=”8080” protocol=”HTTP/1.1” maxThreads=”150” connectionTimeout=”20000” redirectPort=”8443”

acceptCount : 接受连接request的最大连接数目,默认值是10

address : 绑定IP地址,如果不绑定,默认将绑定任何IP地址

allowTrace : 如果是true,将允许TRACE HTTP方法

compressibleMimeTypes : 各个mimeType, 以逗号分隔,如text/html,text/xml

compression : 如果带宽有限的话,可以用GZIP压缩

connectionTimeout : 超时时间,默认为60000ms (60s)

maxKeepAliveRequest : 默认值是100

maxThreads : 处理请求的Connector的线程数目,默认值为200

如果是SSL配置,如下:

<Connector port="8181" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol = "TLS" address="0.0.0.0" keystoreFile="E:/java/jonas-full-5.1.0-RC3/conf/keystore.jks" keystorePass="changeit" />

其中,keystoreFile为证书位置,keystorePass为证书密码。