vlambda博客
学习文章列表

学习Tomcat(一)之容器概览


Tomcat是Apache软件基金会的一个顶级项目,由Apache、Sun和其它一些公司及个人共同开发,是目前比较流行的Web服务器之一。Tomcat是一个开源的、小型的轻量级应用服务器,具有占用系统资源少、扩展性好、功能丰富等优点。虽然Tomcat是一个轻量级容器,但是其本身实现还比较复杂,包含很多模块,本文会对Tomcat的基本结构和各个模块进行简单介绍。

Servlet容器概念

Servlet容器也叫做Servlet引擎,是Web服务器或应用程序服务器的一部分,用于在发送的请求和响应之上提供网络服务,解码基于 MIME的请求,格式化基于MIME的响应。Servlet没有main方法,不能独立运行,它必须被部署到Servlet容器中,由容器来实例化和调用 Servlet的方法(如doGet()和doPost()),Servlet容器在Servlet的生命周期内包容和管理Servlet。在JSP技术 推出后,管理和运行Servlet/JSP的容器也称为Web容器。

以下为Servlet接口的定义:

public interface Servlet {
void init(ServletConfig var1) throws ServletException;

ServletConfig getServletConfig();

void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

String getServletInfo();

void destroy();
}

Tomcat结构概览

Tomcat是一个成熟的Web服务器,设计和开发都比较优雅,功能结构也是模块化的。Servlet容器应该有三个基本任务:创建Request对象、创建Response对象和Servlet处理请求响应,基于这三个任务Tomcat划分出两个核心模块:连接器和容器。为了优雅的进行容器的生命周期管理,Tomcat又添加了服务器组件模块。各个模块之间的关联关系如下图所示:

![Tomcat容器概览]

服务器组件Server

Server提供了Tomcat的生命周期管理的逻辑,它使用了一种优雅的方式来启动/关闭整个系统,不需要再对连接器和容器分别启动/关闭。

当服务器组件启动的时候,它会启动其中的所有的组件(连接器和容器),然后就开始无限期的等待关闭命令。如果需要关闭系统,可以向指定端口发送一条关闭命令,服务器组件在收到关闭命令后,会关闭其中所有的组件。

服务组件Service

服务器组件使用了服务组件Serivce来包含其它的组件,服务组件主要包含两部分:连接器和容器,这两部分也是Tomcat容器的核心组件。

连接器Connector

Connector的主要职责就是负责接收客户端连接和客户端请求的处理加工。每个Connector都将指定一个端口进行监听,分别负责对请求报文的解析和响应报文组装,解析过程生成Request对象,而组装过程涉及Response对象。

如果将Tomcat整体比作一个巨大的城堡,那么Connector组件就是城堡的城门,每个人要进入城门就必须通过城门,它为人们进出城堡提供了通道。同时,一个城堡还可能有两个或者多个城门,每个城门代表了不同的通道(不同的网络协议)。

容器Container

我们知道Tomcat是Servlet容器的一种实现,servlet又是什么呢?Servlet是javax.servlet 包中定义的接口。它声明了 Servlet 生命周期的三个基本方法:init()、service() 和 destroy()。它们由每个 Servlet Class(在 SDK 中定义或自定义)实现,并由服务器在特定时机调用。

Tomcat容器中的Container的主要功能就是处理连接器Connector解析的到的Request,调用对应的servlet方法,将响应写入Response中。此外Tomcat还对容器添加了管道和域的概念,用于对请求进行预处理。Tomcat中的容器分为四大类,按照包含关系依次为:Engin容器、Host容器、Context容器和Wrapper容器。

生命周期

Tomcat容器的启停实现逻辑,启停操作是如何从Server传播到各个子容器和组件中的。以及Spring容器如何对Tomcat容器实现优雅关闭:等待Tomcat容器中的请求处理完成之后再关闭容器。

总结

本文简要介绍了Tomcat容器中的各个关键组件及其功能,在我的后续博客中会对这些组件一一进行详细介绍。