深入分析tomcat作为web容器的组织结构以及启动过程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sundacheng1989/article/details/79064112

最近从C#转到Java开发,5年了,再次重拾Eclipse,Tomcat等工具,发现Eclipse早已不在是单一的主流IDE,出现了更好用的Intellij Idea. 在做C#开发使用Viusal Studio的时候,其中最爱的插件叫做Resharper,这款插件是异常的强大,涵盖了方方面面的代码辅助编写等。InetllijIdea这个IDE,恰巧跟Resharper是一家公司的产品,这样快捷键什么的用起来也顺手多了。顺便提一句,这家公司叫做JetBrain, 是一家专注于IDE研发的公司,产品很厉害。 

言归正传,再次研究tomcat的一些底层次的架构,最近看到一篇文章,写的非常好,这里转发一下,希望更多的人看到,一起进步。文章地址http://blog.csdn.net/iam333/article/details/8228845,个人觉得这文章写的很底层,对tomcat到底是怎么回事有兴趣的朋友可以研究一下。 

以下为引用的文章正文。 

Tomcat的安装与配置

安装Tomcat之前要先安装JDK。JDK的下载与配置网上教程很多,可百度或谷歌。要下载Tomcat,首先访问Tomcat项目的网址:http://tomcat.apache.org/,选择要下载的Tomcat版本。

对于Windows操作系统,Tomcat提供了可执行的安装程序的下载,即“Windows Service Installer”链接。通过安装程序安装Tomcat,将把Tomcat安装为Windows的服务。不过建议下载zip压缩包,通过解压缩的方式来安装Tomcat,因为解压缩的方式也适用于其他的操作系统(如Linux系统),并且更容易与其他的开发环境集成。对于初学者来说,也能更好地学习Tomcat的启动过程。
下载完成后,使用WinZip或WinRAR等解压缩工具将压缩包解压缩到指定的目录中。然后在PATH环境变量中添加Tomcat的文件夹下bin文件夹的目录,如D:\apache-tomcat-版本\bin即可。本文使用的是截止本文撰写时的最新版本apache-tomcat-7.0.33。

Tomcat的目录结构

Tomcat安装后的目录层次结构如图1所示。

图1 Tomcat 7.0.33目录层次结构

各目录的用途如表1所示。

目  

用    

/bin

存放启动和关闭Tomcat的脚本文件

/conf

存放Tomcat服务器的各种配置文件,其中包括server.xml(Tomcat的主要配置文件)、tomcat-users.xml和web.xml等配置文件

/lib

存放Tomcat服务器和所有Web应用程序需要访问的JAR文件

/logs

存放Tomcat的日志文件

/temp

存放Tomcat运行时产生的临时文件

/webapps

当发布Web应用程序时,通常把Web应用程序的目录及文件放到这个目录下

/work

Tomcat将JSP生成的Servlet源文件和字节码文件放到这个目录下

表1  Tomcat的目录结构及其用途

 

从表1中可以看到,lib目录下存放的JAR文件可以被所有的Web应用程序所访问,如果多个Web应用程序需要访问相同的JAR文件,那么可以将这些JAR文件放到Tomcat的lib目录下。此外,对于后面将要介绍的Java Web应用程序,在它的WEB-INF目录下,也可以建立lib子目录,在lib子目录下可以存放各种JAR文件,这些JAR文件只能被当前Web应用程序所访问。

运行Tomcat

在Tomcat安装目录下的bin子目录中,有一些批处理文件(以.bat作为后缀名的文件),其中的startup.bat就是启动Tomcat的脚本文件,用鼠标双击这个文件,如果你之前已经配置好了JDK和Tomcat(配置见图2中PATH变量和JAVA_HOME变量),则会打开如图3所示窗口。

图2 JDK和Tomcat配置


图3 Tomcat启动窗口

注:如果未出现如图3所示的启动窗口,而是一闪而过,则证明JDK和Tomcat未配置好,重新配置好即可。

打开浏览器,在地址栏中输入http://localhost:8080/(localhost表示本地机器,8080是Tomcat默认监听的端口号),将出现如图4所示的Tomcat页面。如果要关闭Tomcat服务器,可以用鼠标双击Tomcat bin目录下的shutdown.bat文件。


图4 Tomcat默认主页

Tomcat启动分析

我们用文本编辑器打开用于启动Tomcat的批处理文件startup.bat,对其做分析。具体分析过程见图5。


图5 startup.bat文件分析

从图5的分析中我们可以看见,startup.bat脚本主要是查看当前命令所在目录。看是否在tomcat\或tomcat\bin\目录下。以及查看将调用该命令的参数传递给catalina.bat。最后调用catalina.bat start命令。startup.bat的主要作用是调用catalina.bat start命令。所以,在其他目录下想同样使用startup来启动Tomcat,则需设置CATALINA_HOME环境变量。将CATALINA_HOME环境变量的值设置为Tomcat的安装目录即可。

可能有人会奇怪为什么JAVA_HOME表示Java安装目录,而Tomcat安装目录却不用TOMCAT_HOME来表示,却要用CATALINA_HOME来表示。其实在Tomcat 4以前,就是使用TOMCAT_HOME来表示Tomcat安装目录的。

解了startup.bat文件以后,我们再来看看真正负责启动Tomcat服务器的catalina.bat文件。catalina.bat文件比较长,所以具体分析过程见图6。

图6 catalina.bat文件分析







由分析可知,catalina.bat实际上就是调用java命令运行Bootstrap类。从上面代码可知tomcat确实是一个纯java的程序,所有脚本最后都变成直接使用java命令执行程序,与我们普通写的java程序,没有什么不同。只不过由于 tomcat模式太多,需要各种参数(如debug,start等),所以需要使用脚本来执行。另外,通过分析catalina.bat文件,我们发现它还调用了一个文件setclasspath.bat。在setclasspath.bat文件中,它检查JAVA_HOME环境变量是否存在,并通过JAVA_HOME环境变量,找到java.exe,用于启动Tomcat。在这个文件中,还设置了其他的一些变量,代表调用Java的标准命令,有兴趣的话可以自己分析一下该文件。

Tomcat的体系结构

Tomcat服务器是由一系列可配置的组件构成的,其中核心组件是Catalina Servlet容器,它是所有其他Tomcat组件的顶层容器。我们可以通过查看Tomcat安装文件夹下的conf文件夹中的server.xml文件来了解Tomcat各组件之间的层次关系。由于server.xml注释太多,特简化如下:

<?xml version='1.0' encoding='utf-8'?>  
    <Server port="8005" shutdown="SHUTDOWN">  
        <Service name="Catalina">  
            <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>  
            <Engine name="Catalina" defaultHost="localhost">  
                <Host name="localhost">  
                    <Context path="" docBase="WORKDIR" reloadable="true"/>  
                </Host>  
            </Engine>  
      </Service>  
  </Server>  


其中WORKDIR为你想要导入的项目路径。我们下面简单介绍一下各组件在Tomcat服务器中的作用。

(1)Server

Server表示整个的Catalina Servlet容器。Tomcat提供了Server接口的一个默认实现,这通常不需要用户自己去实现。在Server容器中,可以包含一个或多个Service组件。

(2)Service

Service是存活在Server内部的中间组件,它将一个或多个连接器(Connector)组件绑定到一个单独的引擎(Engine)上。在Server中,可以包含一个或多个Service组件。Service也很少由用户定制,Tomcat提供了Service接口的默认实现,而这种实现既简单又能满足应用。

(3)Connector

连接器(Connector)处理与客户端的通信,它负责接收客户请求,以及向客户返回响应结果。在Tomcat中,有多个连接器可以使用。

(4)Engine

在Tomcat中,每个Service只能包含一个Servlet引擎(Engine)。引擎表示一个特定的Service的请求处理流水线。作为一个Service可以有多个连接器,引擎从连接器接收和处理所有的请求,将响应返回给适合的连接器,通过连接器传输给用户。用户允许通过实现Engine接口提供自定义的引擎,但通常不需要这么做。

(5)Host

Host表示一个虚拟主机,一个引擎可以包含多个Host。用户通常不需要创建自定义的Host,因为Tomcat给出的Host接口的实现(类StandardHost)提供了重要的附加功能。

(6)Context

一个Context表示了一个Web应用程序,运行在特定的虚拟主机中。什么是Web应用程序呢?在Sun公司发布的JavaServlet规范中,对Web应用程序做出了如下的定义:“一个Web应用程序是由一组Servlet、HTML页面、类,以及其他的资源组成的运行在Web服务器上的完整的应用程序。它可以在多个供应商提供的实现了Servlet规范的Web容器中运行”。一个Host可以包含多个Context(代表Web应用程序),每一个Context都有一个唯一的路径。用户通常不需要创建自定义的Context,因为Tomcat给出的Context接口的实现(类StandardContext)提供了重要的附加功能。

有关server.xml各部分的具体信息会在另一篇文章中论述。Tomcat各组件的工作流程如图7所示。


图7 Tomcat各组件的工作流程图

Tomcat的管理程序

Tomcat提供了一个管理程序:manager,用于管理部署到Tomcat服务器中的Web应用程序。manager Web应用程序包含在Tomcat的安装包中。要访问manager Web应用程序,需要添加具有管理员权限的账号,编辑%CATALINA_HOME%\conf\tomcat-users.xml文件,在<tomcat-users>元素中添加manager角色,以及属于该角色的用户名和密码,如下所示。

 <?xml version='1.0' encoding='utf-8'?>  
 <tomcat-users>  
     <role rolename="manager-gui"/>  
     <user username="tomcat" password="tomcat" roles="manager-gui"/>  
 </tomcat-users>  
注:用户名和密码可以自己设置,但角色名只能是manager-gui,不是一些资料提及的manager。

启动Tomcat服务器,打开浏览器,在地址栏中输入:http://localhost:8080/,将出现如图14所示的页面。单击“Manager App”链接,访问manager Web应用,将看到如图8所示的登录界面。


图8 Tomcat管理员登录界面

输入用户名tomcat,密码1234,单击“确定”按钮,你将看到如图9所示的页面。


图9 managerWeb应用程序主页面

在这个页面中,你可以部署、启动、停止、重新加载、卸载Web应用程序。

 

猜你喜欢

转载自blog.csdn.net/sundacheng1989/article/details/79064112
今日推荐