`
gearever
  • 浏览: 149447 次
社区版块
存档分类
最新评论

tomcat架构分析(概览)

阅读更多
出处:http://gearever.iteye.com

Tomcat是目前应用比较多的servlet容器。关于tomcat本身的特点及介绍,网上已经有很多描述了,这里不再赘述。Tomcat除了能够支撑通常的web app外,其本身高度模块化的架构体系,也能带来最大限度的可扩展性。目前tomcat版本已经衍生到tomcat7,但是主流的版本还是tomcat6。此系列架构体系介绍还是以tomcat6为蓝本。
Tomcat是有一系列逻辑模块组织而成,这些模块主要包括:
  • 核心架构模块,例如Server,Service,engine,host和context及wrapper等
  • 网络接口模块connector
  • log模块
  • session管理模块
  • jasper模块
  • naming模块
  • JMX模块
  • 权限控制模块
  • ……

这些模块会在相关的文档里逐一描述,本篇文档以介绍核心架构模块为主。

核心架构模块说明
核心架构模块之间是层层包含关系。例如可以说Service是Server的子组件,Server是Service的父组件。在server.xml已经非常清晰的定义了这些组件之间的关系及配置。
需要强调的是Service中配置了实际工作的Engine,同时配置了用来处理时间业务的线程组Executor(如果没有配置则用系统默认的WorkThread模式的线程组),以及处理网络socket的相关组件connector。详细情况如图所示。

图中,1:n代表一对多的关系;1:1代表一对一的关系。

StandEngine, StandHost, StandContext及StandWrapper是容器,他们之间有互相的包含关系。例如,StandEngine是StandHost的父容器,StandHost是StandEngine的子容器。在StandService内还包含一个Executor及Connector。
1) Executor是线程池,它的具体实现是java的concurrent包实现的executor,这个不是必须的,如果没有配置,则使用自写的worker thread线程池
2) Connector是网络socket相关接口模块,它包含两个对象,ProtocolHandler及Adapter
  • ProtocolHandler是接收socket请求,并将其解析成HTTP请求对象,可以配置成nio模式或者传统io模式
  • Adapter是处理HTTP请求对象,它就是从StandEngine的valve一直调用到StandWrapper的valve

分层建模
对于上述的各个逻辑模块,理解起来可能比较抽象。其实一个服务器无非是接受HTTP request,然后处理请求,产生HTTP response通过原有连接返回给客户端(浏览器)。那为什么会整出这么多的模块进行处理,这些模块是不是有些多余。
其实这些模块各司其职,我们从底层wrapper开始讲解,一直上溯到顶层的server。这样易于理解。通过这些描述,会发现这正是tomcat架构的高度模块化的体现。这些细分的模块,使得tomcat非常健壮,通过一些配置和模块定制化,可以很大限度的扩展tomcat。
首先,我们以一个典型的页面访问为例,假设访问的URL是
引用
http://www.mydomain.com/app/index.html

详细情况如图所示。

  • Wrapper封装了具体的访问资源,例如 index.html
  • Context 封装了各个wrapper资源的集合,例如 app
  • Host 封装了各个context资源的集合,例如 www.mydomain.com

按照领域模型,这个典型的URL访问,可以解析出三层领域对象,他们之间互有隶属关系。这是最基本的建模。从上面的分析可以看出,从wrapper到host是层层递进,层层组合。那么host 资源的集合是什么呢,就是上面所说的engine。 如果说以上的三个容器可以看成是物理模型的封装,那么engine可以看成是一种逻辑的封装。

好了,有了这一整套engine的支持,我们已经可以完成从engine到host到context再到某个特定wrapper的定位,然后进行业务逻辑的处理了(关于怎么处理业务逻辑,会在之后的blog中讲述)。就好比,一个酒店已经完成了各个客房等硬件设施的建设与装修,接下来就是前台接待工作了。

先说线程池,这是典型的线程池的应用。首先从线程池中取出一个可用线程(如果有的话),来处理请求,这个组件就是connector。它就像酒店的前台服务员登记客人信息办理入住一样,主要完成了HTTP消息的解析,根据tomcat内部的mapping规则,完成从engine到host到context再到某个特定wrapper的定位,进行业务处理,然后将返回结果返回。之后,此次处理结束,线程重新回到线程池中,为下一次请求提供服务。

如果线程池中没有空闲线程可用,则请求被阻塞,一直等待有空闲线程进行处理,直至阻塞超时。线程池的实现有executor及worker thread两种。缺省的是worker thread 模式。

至此,可以说一个酒店有了前台接待,有了房间等硬件设施,就可以开始正式运营了。那么把engine,处理线程池,connector封装在一起,形成了一个完整独立的处理单元,这就是service,就好比某个独立的酒店。

通常,我们经常看见某某集团旗下酒店。也就是说,每个品牌有多个酒店同时运营。就好比tomcat中有多个service在独自运行。那么这多个service的集合就是server,就好比是酒店所属的集团。

作用域
那为什么要按层次分别封装一个对象呢?这主要是为了方便统一管理。类似命名空间的概念,在不同层次的配置,其作用域不一样。以tomcat自带的打印request与response消息的RequestDumperValve为例。这个valve的类路径是:

引用
org.apache.catalina.valves.RequestDumperValve


valve机制是tomcat非常重要的处理逻辑的机制,会在相关文档里专门描述。 如果这个valve配置在server.xml的节点下,则其只打印出访问这个app(my)的request与response消息。

<Host name="localhost" appBase="webapps"
          unpackWARs="true" autoDeploy="true"
          xmlValidation="false" xmlNamespaceAware="false">
             <Context path="/my" docBase=" /usr/local/tomcat/backup/my" >
                   <Valve className="org.apache.catalina.valves.RequestDumperValve"/>
             </Context>
             <Context path="/my2" docBase=" /usr/local/tomcat/backup/my" >
             </Context>
  </Host>

如果这个valve配置在server.xml的节点下,则其可以打印出访问这个host下两个app的request与response消息。
<Host name="localhost" appBase="webapps"
                unpackWARs="true" autoDeploy="true"
                xmlValidation="false" xmlNamespaceAware="false">
                    <Valve className="org.apache.catalina.valves.RequestDumperValve"/>
                    <Context path="/my" docBase=" /usr/local/tomcat/backup/my" >
                    </Context>
                    <Context path="/my2" docBase=" /usr/local/tomcat/backup/my" > 
                    </Context>
  </Host>


在这里贴一个缺省的server.xml的配置,通过这些配置可以加深对tomcat核心架构分层模块的理解,关于tomcat的配置,在相关的文档里另行说明。为了篇幅,我把里面的注释给删了。
<Server port="8005" shutdown="SHUTDOWN">
         <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
         <Listener className="org.apache.catalina.core.JasperListener" /> 
         <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
         <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
         <GlobalNamingResources>
              <Resource name="UserDatabase" auth="Container"
                      type="org.apache.catalina.UserDatabase"
                     description="User database that can be updated and saved"
                     factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
                     pathname="conf/tomcat-users.xml" /> 
          </GlobalNamingResources>
          <Service name="Catalina">
               <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" 
                     maxThreads="150" minSpareThreads="4"/>
               <Connector port="80" protocol="HTTP/1.1" 
                     connectionTimeout="20000" 
                     redirectPort="7443" />
               <Connector port="7009" protocol="AJP/1.3" redirectPort="7443" />
               <Engine name="Catalina" defaultHost="localhost">
                    <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
                           resourceName="UserDatabase"/>
                    <Host name="localhost" appBase="webapps"
                           unpackWARs="true" autoDeploy="true"
                           xmlValidation="false" xmlNamespaceAware="false">
                           <Context path="/my" docBase="/usr/local/tomcat/backup/my" >
                           </Context> 
                    </Host> 
                </Engine>
            </Service>
  </Server>

至此,头脑中应该有tomcat整体架构的概念。有时间在写些其他模块的东西。
分享到:
评论
9 楼 smallbug_vip 2016-02-06  
very very good 如此好文章,一定要刷新一下最后评论日期。
8 楼 andy_chenus 2014-05-22  
1. "处理时间业务的线程组" 这里的"时间业务"怎么理解? 这里的"时间业务"会不会是 "事件业务" 的笔误 ?

2."如果这个valve配置在server.xml的节点下,则其只打印出访问这个app(my)的request与response消息。 "

这里"如果"部分是不是想表达 "server.xml的Context节点下" ?

3. "如果这个valve配置在server.xml的节点下,则其可以打印出访问这个host下两个app的request与response消息。 "

这里"如果"部分是不是想表达 "server.xml的Host节点下" ?
7 楼 ziqiang99 2014-03-11  
,非常不错
6 楼 赵氏孤儿 2013-11-01  
5 楼 noasoso 2013-10-30  
已关注,慢慢看
4 楼 shusanzhan 2013-04-11  
看了本文受益匪浅!谢谢博主
3 楼 想起要学好java 2013-04-07  
写得真好真详细
2 楼 gearever 2013-04-04  
Tophuhu 写道
图片挂了,请修复一下

好了,多谢
1 楼 Tophuhu 2013-04-04  
图片挂了,请修复一下

相关推荐

    tomcat 架构分析(概览)

    以下是关于Tomcat架构的详细分析。 首先,核心架构模块是Tomcat的基础,包括Server、Service、Engine、Host和Context以及Wrapper等。Server作为最顶层的组件,包含了多个Service。Service是Tomcat对外提供服务的...

    Tomcat 架构 原理

    一、Tomcat架构概览 Apache Tomcat是一个开源的Servlet容器,由Apache软件基金会的Jakarta项目提供。它主要实现了Servlet和JavaServer Pages(JSP)技术规范,同时也提供了HTTP服务器的功能。Tomcat自1999年发布...

    tomcat 源码分析系列文档

    6. "Tomcat源码研究.pdf":提供了一个全面的源码分析概览,可能包括了Tomcat的主要组件、设计模式以及关键流程。 7. "tomcat源码分析之一架构.pdf":可能涵盖了Tomcat的整体架构,包括Catalina、 Coyote、Jasper等...

    tomcat6源码分析

    一、Tomcat架构概览 Tomcat6的架构主要包括以下几个核心组件: 1. Connector:连接器,负责与客户端进行通信,实现HTTP协议的解析。 2. Container:容器,管理Servlet的生命周期,处理请求和响应。 3. Catalina:...

    Tomcat的架构和设计

    #### 一、架构概览 Apache Tomcat作为一款开源的Servlet容器,其架构设计精妙,采用模块化和层次化的思想,使其既易于扩展又便于维护。Tomcat的核心架构可以概括为:**分层、模块化以及通过观察者模式和责任链模式...

    TOMCAT源码分析(启动框架).pdf

    ### TOMCAT源码分析——启动框架详解 #### 一、前言 TOMCAT作为一款广泛使用的开源Java Servlet容器,其内部实现复杂且强大。本文旨在深入剖析TOMCAT的启动框架及其整体架构,帮助读者更好地理解其工作原理。...

    Tomcat启动分析

    #### 一、Tomcat服务器架构概览 **1.1 Server** - **定义**:`Server`元素代表整个Catalina Servlet容器(即Tomcat)。它是整个Tomcat架构中的最高级别组件,通常是单例模式实现。 **1.2 Service** - **定义**...

    Professional Apache Tomcat 6

    4. **第4章:Tomcat架构** - 揭示了Tomcat内部架构的设计思想,帮助读者理解其组件间的交互机制。 5. **第5章:基本的Tomcat配置** - 教授如何进行基本的服务器配置,包括端口设置、日志记录等。 6. **第6章:...

    tomcat的工作原理

    通过本文的分析,我们不仅深入了解了Tomcat的工作原理,还学习了其各个组件的作用和相互关系。Tomcat作为一款成熟的Web服务器,其内部架构的设计充分体现了高效性、灵活性和扩展性。无论是对于开发人员还是系统管理...

    深入剖析Tomcat

    在本书的介绍部分,作者首先提供了Tomcat架构的概览,强调了Tomcat作为一个复杂的系统,是由众多组件构成的。Tomcat4.1.12和Tomcat5.0.18版本是书中具体剖析的对象。Tomcat的内核代号为Catalina,是一个免费的开源...

    Tomcat6源码下载

    1. **架构概览**:Tomcat 6.0的架构主要分为几个关键组件,包括Catalina(核心引擎)、Coyote(HTTP/1.1协议处理)、Jasper(JSP编译器)和Commons(通用库)。Catalina负责管理和调度请求,Coyote处理网络通信,...

    Apache Tomcat 6高级编程 pdf

    ### Apache Tomcat 6高级编程知识点概览 #### 1. Tomcat 6架构与内部原理 - **架构概述**:了解Tomcat 6的基本架构,包括Server、Service、Connector、Container等核心组件及其相互之间的关系。 - **启动流程**:...

    Tomcat源码研究.pdf

    ### Tomcat源码研究知识点概览 #### 1.1 Catalina.bat脚本解析 - **脚本功能**:`catalina.bat`是Tomcat启动过程中的关键脚本之一,其主要作用在于构建合适的Java命令行参数,进而启动Tomcat服务。此脚本根据环境...

    Tomcat源码解析.pdf

    ### Tomcat源码解析知识点概览 #### 一、Tomcat概述 - **定义**:Apache Tomcat是一款开源的Servlet容器,它实现了Servlet规范,并且提供了作为Web服务器的一些特性,但其提供的性能远不及专业的Web服务器,如...

    HowTomcatWorks-master.zip

    1. **Tomcat架构概览** Tomcat的架构设计分为几个主要部分:Catalina(核心Servlet容器)、 Coyote(HTTP/1.1协议处理)、 Jasper(JSP编译器)和Juli(日志系统)。Catalina负责管理Web应用程序,Coyote处理网络...

    tomcatsrc:tomcat源码分析

    一、Tomcat架构概览 Tomcat的架构分为几个主要部分,包括Catalina(核心引擎)、 Coyote(处理HTTP协议)、Jasper(JSP编译器)和Commons(共享组件)。Catalina负责管理和调度Web应用程序,Coyote则处理HTTP通信,...

Global site tag (gtag.js) - Google Analytics