`
ss1
  • 浏览: 80411 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Tomcat6.0源码学习--架构概述

阅读更多

Tomcat6 是最新版本的 web 容器,其支持最新版本的 servlet2.5 jsp2.1 。而且 Tomcat6 架构也是经过重新设计优化过的,所以我们有必要分析一下它的架构过程。显然,这是一个通过阅读 Tomcat 的源代码及相关文档,演绎架构的过程。或许有人会说,这不是放马后炮吗?!!但我觉得这是自我进步的一个必经步骤,先模仿之,然后才能超越之,毕竟我本凡人。

Tomcat 的架构总的来说是分层次的、可插拔的组件架构。分层次是指构成 Tomcat 的组件不是同一级别的,上层组件可以包含子组件,各个组件有其功能范围,当一个组件停止服务时,不会影响上层组件的服务。可插拔是指对于组件的添加和删除并不影响服务器的运行。那么为了达到可插拔的组件架构,分层次的组件架构必成为基础。

对于任何服务器,即使最简单的实现,从面向对象设计( OOD )的角度来说,我们都有必要将“服务器”这个概念抽象出来,为什么呢?因为只有有了这个概念,才能谈服务器的实例,服务器的功能等等其它概念,此之谓“皮之不存,毛将焉附”。赶巧( 其实是我的想法恰好撞上人家的想法 ), Tomcat 也将“服务器”抽象为 java 接口 org.apache.catalina.Server ,显然 Server 应该就是最最顶层的组件了。

有了 Server 这个抽象,很自然的,我们希望它能够提供对 servlet jsp 支持的功能。但是我们发现这个概念太大了,我们还需再细化。所以别急,我们还有一些事情要解决。服务器要提供服务就必须能够启动,当然也应该能够停止吧,也就是说服务器应该是有生命的,在启动时初始化必要的资源,而在停止时将其其销毁掉。好吧,我们把这个也抽象出来,叫做生命周期接口, tomcat 实现为 org.apache.catalina.Lifecycle. 如上所述我们知道 Lifecycle 需要完成的工作了。

public void start () throws LifecycleException;

public void stop() throws LifecycleException;

接下来我们分析服务器如何来处理客户端的请求,一般的我们会在浏览器中输入如下格式的请求, http://192.168.8.221:8080/explorer/loginInit.do 。对于服务器来说,要想处理这个请求,就必须监听指定的端口 8080 ,当有 TCP 的请求包来时,建立 Socket 连接,分析并解析之,然后给客户端返回响应。在这个过程中,我们发现,其实包含了俩个功能点,即监听并接受请求和处理请求。那么我们能否将这俩个功能给抽象出来呢? Tomcat 告诉我们,可以。是的, Tomcat 将“监听并接收请求”抽象为 org.apache.catalina.connector.Connector 类,负责接受请求;将“处理请求”抽象为“容器” org.apache.catalina.Container ,负责处理 Connector 传递过来的请求。

Ok, 到此,我们分析构建的简单服务器模型出来了, Server Connector 组件和 Container 组件结合提供 web 服务。

 

Tomcat6.0源码学习--架构概述 - Dinstone - Dinstone 的技术博客

2

有了这个模型后,要实现一个简单的 Server 已经很简单了,但是在实现 Container 时,我们还是要做很多事情,如当来请求,我们怎么知道该请求对应得虚拟主机,以及请求的那个应用,应该交给那个 servlet 对象来处理?这样看来, Container 还是太大了,需要细化。根据 Servlet 规范,我们知道, servlet 属于某个应用,且有上下文环境, Container 要根据应用上下文环境初始化 servlet ,然后根据 servlet 映射调用 servlet service 方法。在这里“应用上下文环境”的概念很重要, Tomcat 将其抽象为 org.apache.catalina.Context Context 继承了 Container 接口。对于虚拟主机, Tomcat 将其抽象为 org.apache.catalina.Host Host 继承了 Container 接口。

好了,有了这些概念,我们再回顾一下请求的处理过程:浏览器发出请求, Connector 接受请求,将请求交由 Container 处理, Container 查找请求对应的 Host 并将请求传递给它, Host 拿到请求后查找相应的应用上下文环境,准备 servlet 环境并调用 service 方法。

现在,我们的服务器模型变成了如图 3 所示了。

 

Tomcat6.0源码学习--架构概述 - Dinstone - Dinstone 的技术博客

3

但是在 Tomcat 的实现体系中还有一个 Engine 的接口, Engine 也继承了 Container 接口,那么这个接口什么用呢?设计 Engine 的目的有俩个目的,一,当希望使用拦截器查看(过滤或预处理)每个请求时, Engine 是个很好的拦截点。二,当希望多个虚拟 Host 共享一个 Http Connector 时, Engine 是个很好的门面。所以, Engine 接口是作为顶级 Container 组件来设计的,其作用相当于一个 Container 的门面。有了 Engine ,请求的处理过程变为:浏览器发出请求, Connector 接受请求,将请求交由 Container (这里是 Engine )处理, Container Engine 来担当)查找请求对应的 Host 并将请求传递给它, Host 拿到请求后查找相应的应用上下文环境,准备 servlet 环境并调用 service 方法。再看看服务器的模型,如图 4.

 

Tomcat6.0源码学习--架构概述 - Dinstone - Dinstone 的技术博客

4

到目前,我们碰到的组件类型有 Connector Container ,其实,这也就是 Tomcat 的核心组件。如图 4 ,一组 Connector 和一个 Container 有机的组合在一起构成 Server ,就可以提供服务了,对于 Tomcat 来说,主要是提供 Servlet 服务,那么也就是说 Tomcat 服务器也可以提供其它服务了?是的, Tomcat 将“一组 Connector 和一个 Container 有机的组合”抽象为“服务”接口 org.apache.catalina.Service ,然而,这些服务实例彼此独立,仅仅共享 JVM 的基础设施,如系统类路径。

进一步的,我们得到了服务器的框架模型,如图 5.

 

Tomcat6.0源码学习--架构概述 - Dinstone - Dinstone 的技术博客

5

    由图 5 ,我们知道,对于 Tomcat 服务器来说,除了 Server 代表它自己以外,其它组件都是功能组件,都有其职责范围。 Service 为最顶层的组件,可以添加 Connector Container 组件。 Engine Container 的最顶层组件,可以添加 Host 组件,但不能添加父组件。 Host 组件的父组件是 Engine Host 下面包含有 Context 组件。

    接下来看看标准的 Tomcat 体系结构,如图 6.

 

Tomcat6.0源码学习--架构概述 - Dinstone - Dinstone 的技术博客

6

比较图 5 和图 6. 我们发现,还有很多辅助组件没有抽象出来。当然,随着需求的一步步加深,我的分析也会一步步深入,这些个组件也会慢慢浮出水面。

分享到:
评论
2 楼 康跷_0613 2013-01-29  
图片看不到了..
1 楼 xuan 2011-01-27  
高人啊。。

相关推荐

    myeclipse6.5+flex 3 + tomcat6.0 + ds-console.war环境搭建

    在本文中,我们将深入探讨如何搭建一个基于MyEclipse 6.5、Flex 3、Tomcat 6.0和ds-console.war的开发环境。这个环境主要用于开发和部署使用Flex前端与Java后端交互的应用程序,特别是通过LCDS(LiveCycle Data ...

    Tomcat 6.0 -- 9.0 及其源码

    《深入理解Tomcat 6.0 -- 9.0及源码分析》 Tomcat,作为Apache软件基金会的开源项目,是Java Servlet和JavaServer Pages(JSP)的开源Web应用服务器,也是世界上最受欢迎的轻量级应用服务器之一。本文将深入探讨...

    apache-tomcat6.0

    安装Apache Tomcat 6.0通常包括解压下载的`apache-tomcat-6.0.33`压缩包,设置环境变量如`CATALINA_HOME`,以及配置`conf/server.xml`文件以定义端口、虚拟主机和应用上下文路径。 **部署Web应用** Web应用程序通常...

    tomcat6.0-+-myeclipse8.5-+-jdk-1.6完整配置环境(很详细).docx

    配置Tomcat 6.0的步骤如下: 1. 从Tomcat官网下载安装包。 2. 运行安装程序,同意许可协议。 3. 选择安装类型(推荐Normal或Custom),设置安装路径。 4. 配置Tomcat的基本设置,指定JDK路径。 5. 完成安装后,可以...

    Tomcat-6.0-7.0-8.5-9.0合集包.zip

    《Tomcat 合集包详解:从6.0到9.0的历史演进与关键特性》 Apache Tomcat,作为一款开源的Java Servlet容器,深受广大开发者喜爱。它以其轻量级、高效能的特点,成为了运行Java Web应用程序的首选平台。本合集包包含...

    tomcat6.0-+-myeclipse8.5-+-jdk-1.6完整配置环境(很详细).pdf

    在本文中,我们将深入探讨如何配置一个基于Java Web的开发环境,特别是针对Tomcat 6.0、MyEclipse 8.5和JDK 1.6的详细步骤。这些工具是开发Java Web应用程序的基础,理解它们的安装和配置对于任何Java开发者来说都是...

    tomcat6.0 配log4j日志的必须文件及配置过程

    tomcat6.0 配log4j日志的必须... | |--------tomcat-juli-adapters.jar | |--------log4j.jar | |--------log4j.properites | |----bin |--------tomcat-juli.jar 最后把log4j.properties里的配置写好就可以了。

    tomcat6.0源码

    Tomcat 6.0是Apache软件...通过深入学习Tomcat 6.0的源码,开发者可以提升对Web服务架构的理解,这对于设计和构建高性能、高可用性的Java Web应用具有重要意义。同时,也可以帮助开发者更好地应对问题诊断和性能调优。

    Tomcat6.0——压缩包下载

    【标题】"Tomcat6.0——压缩包下载"涉及的是Apache Tomcat 6.0版本的安装和使用,这是一个开源的Java Servlet容器,广泛应用于Web应用的部署和开发。Tomcat6.0是该软件的一个重要里程碑,因为它在当时的Java EE 5...

    tomcat6.0的源代码

    通过对Tomcat 6.0源代码的学习,开发者不仅可以提升对Servlet和JSP规范的理解,还能掌握服务器内部工作原理,为日常的Web开发带来更深入的认识,提升问题排查和性能优化的能力。同时,这也将有助于向更高级的Tomcat...

    apache tomcat6.0 源代码

    1. **架构概述**:Tomcat主要由Catalina、Jasper、 Coyote和Commons组件构成。Catalina处理Servlet和JSP的生命周期管理,Jasper负责JSP编译,Coyote处理HTTP连接,而Commons提供了通用工具类。 2. **目录结构**: ...

    tomcat6.0的安装版

    标签反映了主题内容,即与Tomcat6.0的安装和配置相关的知识,对于学习和了解如何在不同操作系统上安装和运行这个特定版本的Tomcat用户来说非常有价值。 【压缩包子文件的文件名称列表】:TOMCAT6.0的安装版 这个...

    apache-tomcat6.0-tomcat+配置教程

    通常,对于大多数用户,预编译的二进制版本(例如,`apache-tomcat-6.0.x.zip`或`.tar.gz`)就足够了。 2. **解压与环境变量配置** 解压缩下载的Tomcat包到你选择的目录。然后,为了能在命令行中使用`catalina`...

    web服务器tomcat6.0

    在【压缩包子文件的文件名称列表】中的"apache-tomcat-6.0.20.exe"是Tomcat 6.0.20的安装程序,用户可以通过这个可执行文件在Windows系统上安装和配置Tomcat服务器。安装过程中,用户可以选择安装路径,配置端口号,...

    tomcat6.0是一款免费开源的jsp服务器

    《深入理解Tomcat6.0:免费开源的JSP服务器》 Tomcat6.0,作为Apache软件基金会的旗下面向Java的Web应用服务器,以其免费开源的特性,深受开发者们的喜爱。它不仅是一个小巧而高效的JSP服务器,还包含了完整的HTTP...

    tomcat6.0应用部署服务器

    3. **安全管理**:使用tomcat-users.xml配置文件,可以设置角色和用户,实现基于角色的访问控制。 4. **日志管理**:通过conf/logging.properties或自定义Log4j配置,可以调整服务器的日志输出。 5. **连接器优化**...

    apache-tomcat6.0 服务器

    Apache Tomcat 6.0 是一个广泛使用的开源软件,它是一个符合Java Servlet和JavaServer Pages (JSP) 规范的应用服务器,主要用来部署和运行Java Web应用程序。这个版本是Tomcat系列的6.0版,它在当时的发布中提供了...

    tomcat6.0通用版本

    Tomcat 6.0是Apache软件基金会开发的一款开源的Java Servlet容器,它是基于Java的Web应用程序部署平台。这个通用版本意味着它适用于各种操作系统,并且包含了广泛支持的各种功能和配置选项,使得开发者和系统管理员...

    Tomcat6.0.x 包

    这个文件"apache-tomcat-6.0.18-deployer"是Tomcat 6.0.18版本的部署工具,它提供了自动化部署Web应用程序的功能。部署工具可以帮助开发者和系统管理员将WAR文件(Web应用程序的归档格式)快速上传到Tomcat服务器,...

Global site tag (gtag.js) - Google Analytics