Tomcat及其工作模式简介
Tomcat概述
Tomcat是Oracle公司的JSWDK(javaServer Web DevelopmentKit,是Oracle公司推出的小型的Servlet/JSP调试工具)的基础上发展起来的一个优秀的Servlet容器,Tomcat本身完全用Java编写。Tomcat是Apache开源软件组织的一个软件项目,大家可以从Tomcat的官方网址(http://tomcat.apache.org)来获取关于Tomcat的最新消息。下图为Tomcat的官方主页。
作为一个开放源代码的软件,Tomcat得到了广大开源代码志愿者的大力支持,它可以和目前大部分主流的Web服务区(如IIS和Apache服务器)一起工作。Tomcat运行可靠,并且效率高。
Tomcat除了能够充当运行Servlet的容器,还提供了作为Web服务器的一些实用功能,如Tomcat管理和控制平台、安全域管理和Tomcat阀等。Tomcat已经成为目前开发企业Java Web应用的最佳Servlet容器选择之一。
Tomcat作为Servlet容器的基本功能
Servlet,顾名思义,是一种运行再服务器上的小插件。Servlet最常见的用途是扩展Web服务器的功能,可作为非常安全、可移植的、易于使用的的CGI替代品。Servlet具有以下特点:
- 提供了可被服务器动态加载并执行的程序代码,为来自客户的请求提供相应服务。
- Servlet完全用Java语言编写,因此要求运行Servlet的服务器必须支持Java语言。
- Servlet完全在服务器运行,因此它的运行不依赖于浏览器。不管浏览器是否支持Java语言,都能请求访问服务器端的Servlet。
下图展示了Tomcat作为运行Servlet的容器。其基本功能是负责接收和解析来自客户的请求,把客户的请求发送给响应的Servlet,并把Servlet的响应结果返回给客户。
值得注意的是:Servlet规范规定的Servlet不仅可以运行在基于HTTP协议的Web服务器上,还可以运行在基于其他应用协议的服务器上。不过,目前Servlet主要运行在Web服务器上,用来扩展Web服务器的功能。
如下图所示,Servlet规定,Servlet容器响应客户请求访问特定Servlet的流程如下:
- 客户发出要求访问特定Servlet的请求。
- Servlet容器接收到客户请求,对其解析。
- Servlet容器创建一个ServletRequest对像,在ServletRequest对像中包含了客户请求信息以及其他关于客户的相关信息,如请求头、请求正文,以及客户机的IP地址等。
- Servlet容器创建一个ServletResponse对像。
- Servlet容器调用客户所请求的Servlet的service()服务方法,并且把ServletRequest对象和ServletResponse对像作为参数传给该服务方法。
- Servlet从ServletRequest对像中可获得客户的请求信息。
- Servlet利用ServletResponse对像来生成响应结果。
- Servlet容器把Servlet生成的响应结果发送给客户。
Tomcat的组成结构
Tomcat本身由一系列可配置的组件构成,其中核心组件是Servlet容器组件,它是所有其他Tomcat组件的顶层容器。为了叙述方便,在此用<CATALINA_HOME>表示Tomcat的安装目录。Tomcat的各个组件可以在<CATALINA_HOME>/conf/server.xml文件中进行配置,每个Tomcat组件在server.xml文件中对应一种配置元素。以下代码以XML的形式展示了各种Tomcat组件之间的关系:
<Server>
<Service>
<Connector />
<Engine>
<Host>
<Context>
</Context>
</Host>
</Engine>
</Service>
</Server>
在以上XML代码中,每个元素都代表一种Tomcat组件。这些元素可分为四类:
- 顶层类元素
包括<Server>元素和<Service>元素,它们位于整个配置文件的顶层。 - 连接器类元素
为<Connector>,代表介于客户与服务器之间的通信接口,负责将客户的请求发送给服务器,并将服务器的响应结果发送给客户。 - 容器类元素
代表处理客户请求并生成响应结果的组件,有四种容器类元素,分别为<Engine>、<Host>、<Context>和<Cluster>元素。Engine组件为特定的Service组件处理所有的客户请求,Host组件为特定的虚拟主机处理所有客户请求,Context组件为特定的Web应用处理所有客户请求。Cluster组件负责为Tomcat集群系统进行会话复制、Context组件的属性的复制,以及集群范围内WAR文件的发布。 - 嵌套类元素
代表可以嵌入到容器中的组件,如<Value>元素和<Realm>元素等。 - <Server>元素
<Server>元素代表整个Servlet容器组件,它是Tomcat的顶层元素。<Server>元素中包含一个或多个<Service>元素。 - <Service>元素
<Service>元素中包含一个<Engine>元素,以及一个或多个<Connector>元素,这些<Connector>元素共享同一个<Engine>元素。 - <Connector>元素
<Connector>元素代表和客户实际交互的组件,它负责接收客户请求,以及向客户返回响应结果。 - <Engine>元素
每个<Servce>元素只能包含一个<Engine>元素,<Engine>元素处理在同一个<Service>中所有<Connector>元素接收到的客户请求。 - <Host>元素
一个<Engine>元素中可以包含多个<Host>元素。每个<Host>元素定义一个虚拟主机,它可以包含一个或多个Web应用。 - <Context>元素
<Context>元素是使用最频繁的元素。每个<Context>元素代表了运行在虚拟主机上的当个Web应用。一个<Host>元素可以包含多个<Context>元素。
Tomcat各个组件之间的嵌套关系如下图所示:
上图表明,Connector组件负责接收客户的请求并向客户返回响应结果,在同一个Service组件中,多个Connector组件共享一个Engine组件。同一个Engine组件中可以包含多个Host组件,同一个Host组件可以包含多个Context组件。
Tomcat安装好后,在它的server.xml配置文件中已经配置了<Server>、<Service>、<Connector>、<Engine>和<Host>等组件:
<Server port="8005" shutdown="SHUTDOWN">
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
</Host>
</Engine>
</Service>
</Server>
以上代码可看出,Tomcat自带一个名为“Catalina”的Engine组件,它的默认虚拟主机为localhost。
Tomcat的工作模式
Tomcat作为Servlet容器,有以下三种工作模式。
-
独立的Servlet容器
Tomcat作为独立的Web服务器来单独运行,Servlet容器组件作为Web服务器中的一部分而存在。这是Tomcat的默认工作方式。
这种模式下,Tomcat是一个独立运行的Java程序。和运行其他Java程序一样,运行Tomcat需要启动一个Java虚拟机(JVM,Java Virtual Machine)进程,由该进程来运行Tomcat,参见下图。
-
其他Web服务器进程内的Servlet容器
在这种模式下,Tomcat分为Web服务器插件和Sevlet容器组件两部分。如下图所示,Web服务器插件在其他Web服务器进程的内部地址空间启动一个Java虚拟机,Servlet容器组件在此Java虚拟机中运行。如有客户端发出调用Servlet的请求,Web服务器插件获得对此请求的控制并将它转发(使用JNI通信机制)给Servlet容器组件。
进程内的Servlet容器对于单个进程、多线程的Web服务器非常适合,可以提供较高的运行速度,但缺乏伸缩性。 -
其他Web服务器进程外的Servlet容器
在这种模式下,Tomcat分为Web服务器插件和Servlet容器组件两部分。如下图所示,Web服务器插件在其他Web服务器的外部地址空间启动一个Java虚拟机进程,Servlet容器组件在此Java虚拟机中运行。如有客户端发出调用Servlet请求,Web服务器插件获得对此请求的控制并将它转发(采用IPC通信机制)给Servlet容器。
进程外Servlet容器对客户请求的响应速度不如进程内Servlet容器,但进程外容器具有更好的伸缩性和稳定性。
从Tomcat的三种工作模式可以看出,当Tomcat作为独立的Servlet容器来运行时,此时Tomcat是能运行Java Servlet容器的独立服务器。此外,Tomcat还可以作为其他Web服务器进程内或者进程外的Servlet容器,从而与其他Web服务器集成(如Apache和IIS服务器等)。集成的意义在于:对于不支持运行Java Servlet的其他Web服务器,可通过集成Tomcat来提供运行Servlet的功能。