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

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是目前应用比较多的servlet容器。关于tomcat本身的特点及介绍,网上已经很多描述了,这里不再赘述。Tomcat除了能够支撑通常的web app外,其本身高度模块化的架构体系,也能带来最大限度的可扩展性。

    Prometheus+Grafana+node+mysql+tomcat部署监控系统.docx

    二、Prometheus架构概览 4 三、Prometheus的数据模型 5 四、Prometheus四种数据类型 5 1.部署prometheus(普罗米修斯) 时序数据库 6 2.Master部署mysql_exporter 8 3.部署node_exporter 9 4.部署Grafana(格拉法娜) 9 ...

    服务器架构ppt.pptx

    WebFOCUS Architecture 应用服务概览 Web Tier Web Server Servlet Container ibi_apps rcaster 服务器架构ppt全文共17页,当前为第7页。 WebFOCUS Architecture 应用服务概览 Servlet Container ibi_apps rcaster ...

    看透springMvc源代码分析与实践

    第7章 Tomcat分析44 7.1 Tomcat的顶层结构及启动过程44 7.1.1 Tomcat的顶层结构44 7.1.2 Bootstrap的启动过程45 7.1.3 Catalina的启动过程47 7.1.4 Server的启动过程48 7.1.5 Service的启动过程50 7.2 ...

    安卓移动端的人力资源管理系统的设计与实现(论文+源码)-kaic.doc

    2.2.3 Tomcat技术 3 需求分析 3.1 系统用例图 3.2 系统功能概览 4 系统设计 4.1 系统体系架构 4.2 系统功能架构 4.3 数据存储设计 5 系统实现 5.1 系统关键功能块的实现 5.1.1 系统登录功能界面 5.1.2 更改登录密码...

    网络架构师148讲视频课程

    │ 第01节:整体课程概览.flv │ 第02节:分模块、分工程管理.avi │ 第03节:多模块多Web应用合并War包.avi │ 第04节:Git基本原理和安装配置使用.avi │ 第05节:TortoiseGit的本地使用.avi │ 第06节:Egit的...

    全面了解Nginx, WSGI, Flask之间的关系

    概览 之前对 Nginx,WSGI(或者 uWSGI,uwsgi),Flask(或者 Django),这几者的关系一存存在疑惑。通过查阅了些资料,总算把它们的关系理清了。 总括来说,客户端从发送一个 HTTP 请求到 Flask 处理请求,分别经过...

    cantstop:无法停止棋盘游戏的实施

    MVC 架构如下: 业务逻辑(模型):POJOs(Plain Old Java Objects)控制器:Servlets、Spring MVC 视图:JSP、HTML、CSS、(AJAX、jQuery)技术概览Java 7、Spring 4.0、Spring MVC、TDD、Junit 4、Mockito、log4j...

    java web 视频、电子书、源码(李兴华老师出版)

    0104_Tomcat服务器的安装及配置 0200_第二部分:WEB基础开发 0205_JSP基础语法 0206_JSP内置对象 0207_JavaBean 0208_文件上传 0300_第三部分:WEB高级开发 0309_Servlet程序开发 0310_表达式语言 0311_...

    Java虚拟机

    9.2.1 Tomcat:正统的类加载器架构 9.2.2 OSGi:灵活的类加载器架构 9.2.3 字节码生成技术与动态代理的实现 9.2.4 Retrotranslator:跨越JDK版本 9.3 实战:自己动手实现远程执行功能 9.3.1 目标 9.3.2 思路 ...

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    / 288 11.2.1 解释器与编译器 / 288 11.2.2 编译对象与触发条件 / 291 11.2.3 编译过程 / 294 11.2.4 查看与分析即时编译结果 / 297 11.3 编译优化技术 / 301 11.3.1 优化技术概览 / 301 11.3.2 公共子表达式...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 上

    1.2、企业开发架构 1.3、JAVA EE架构 1.4、JAVA EE核心设计模式 1.5、Struts开发框架 1.6、本章摘要 1.7、开发实战讲解 第2章 HTML、JavaScript简介 2.1、服务器与浏览器 2.2、HTML简介 2.2.1、HTML元素...

    MLDN+李兴华+Java+Web开发实战经典.part3.rar )

    1.2、企业开发架构 1.3、JAVA EE架构 1.4、JAVA EE核心设计模式 1.5、Struts开发框架 1.6、本章摘要 1.7、开发实战讲解 第2章 HTML、JavaScript简介 2.1、服务器与浏览器 2.2、HTML简介 2.2.1、HTML元素...

    李兴华 java_web开发实战经典 源码 完整版收集共享

    1.2、企业开发架构 1.3、JAVA EE架构 1.4、JAVA EE核心设计模式 1.5、Struts开发框架 1.6、本章摘要 1.7、开发实战讲解 第2章 HTML、JavaScript简介 2.1、服务器与浏览器 2.2、HTML简介 2.2.1、HTML元素...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 下

    1.2、企业开发架构 1.3、JAVA EE架构 1.4、JAVA EE核心设计模式 1.5、Struts开发框架 1.6、本章摘要 1.7、开发实战讲解 第2章 HTML、JavaScript简介 2.1、服务器与浏览器 2.2、HTML简介 2.2.1、HTML元素...

    李兴华Java Web开发实战经典.pdf (高清版) Part1

    1.2、企业开发架构 1.3、JAVA EE架构 1.4、JAVA EE核心设计模式 1.5、Struts开发框架 1.6、本章摘要 1.7、开发实战讲解 第2章 HTML、JavaScript简介 2.1、服务器与浏览器 2.2、HTML简介 2.2.1、HTML元素...

    李兴华 Java Web 开发实战经典 高清扫描版Part3

    1.2、企业开发架构 1.3、JAVA EE架构 1.4、JAVA EE核心设计模式 1.5、Struts开发框架 1.6、本章摘要 1.7、开发实战讲解 第2章 HTML、JavaScript简介 2.1、服务器与浏览器 2.2、HTML简介 2.2.1、HTML元素...

    李兴华Java Web开发实战经典(高清版) Part2

    1.2、企业开发架构 1.3、JAVA EE架构 1.4、JAVA EE核心设计模式 1.5、Struts开发框架 1.6、本章摘要 1.7、开发实战讲解 第2章 HTML、JavaScript简介 2.1、服务器与浏览器 2.2、HTML简介 2.2.1、HTML元素...

    Java Web程序设计教程

    5.2struts2概览 84 5.2.1struts2的工作流程 84 5.2.2struts2的简单应用 85 5.3struts2基础 87 5.3.1action详解 88 5.3.2结果与视图 91 5.3.3struts.xml的配置 94 5.4值栈与ognl表达式 100 5.5struts2的标签...

Global site tag (gtag.js) - Google Analytics