`
jayjayjays
  • 浏览: 215256 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

详细解析 tomcat6 启动过程与请求过程

阅读更多

面向组件架构

tomcat代码看似很庞大,但从结构上看却很清晰和简单,它主要由一堆组件组成,如Server、Service、Connector等,并基于JMX管理这些组件,另外实现以上接口的组件也实现了代表生存期的接口Lifecycle,使其组件履行固定的生存期,在其整个生存期的过程中通过事件侦听LifecycleEvent实现扩展。Tomcat的核心类图如下所示:

Catalina:与开始/关闭shell脚本交互的主类,因此如果要研究启动和关闭的过程,就从这个类开始看起。

Server:是整个Tomcat组件的容器,包含一个或多个Service。

Service:Service是包含Connector和Container的集合,Service用适当的Connector接收用户的请求,再发给相应的Container来处理。

Connector:实现某一协议的连接器,如默认的有实现HTTP、HTTPS、AJP协议的。

Container:可以理解为处理某类型请求的容器,处理的方式一般为把处理请求的处理器包装为Valve对象,并按一定顺序放入类型为Pipeline的管道里。Container有多种子类型:Engine、Host、Context和Wrapper,这几种子类型Container依次包含,处理不同粒度的请求。另外Container里包含一些基础服务,如Loader、Manager和Realm。

Engine:Engine包含Host和Context,接到请求后仍给相应的Host在相应的Context里处理。

Host:就是我们所理解的虚拟主机。

Context:就是我们所部属的具体Web应用的上下文,每个请求都在是相应的上下文里处理的。

Wrapper:Wrapper是针对每个Servlet的Container,每个Servlet都有相应的Wrapper来管理。

可以看出Server、Service、Connector、Container、Engine、Host、Context和Wrapper这些核心组件的作用范围是逐层递减,并逐层包含。

下面就是些被Container所用的基础组件:

Loader:是被Container用来载入各种所需的Class。

Manager:是被Container用来管理Session池。

Realm:是用来处理安全里授权与认证。

分析完核心类后,再看看Tomcat启动的过程,Tomcat启动的时序图如下所示:

 

从上图可以看出,Tomcat启动分为init和start两个过程,核心组件都实现了Lifecycle接口,都需实现start方法,因此在start过程中就是从Server开始逐层调用子组件的start过程。

2.4 启动各个容器
   1. Server
      触发Server容器启动前(before_start), 启动中(start), 启动后(after_start)3个事件, 并运行相应的事件处理器。
      启动Server的子容器:Servcie. 
   2. Service
      启动Service的子容器:Engin
      启动Connector
   3. Engin
      到了Engin这个层次,以及以下级别的容器, Tomcat就使用了比较一致的启动方式了。
      首先,  运行各个容器自己特有一些任务
      随后,  触发启动前事件
      立即,  设置标签,就表示该容器已经启动
      接着,  启动容器中的各个组件: loader, logger, manager等等
      再接着,启动mapping组件。(注1)
      紧跟着,启动子容器。
      接下来,启动该容器的管道(pipline)
      然后,  触发启动中事件
      最后,  触发启动后事件。
 
      Engin大致会这么做, Host大致也会这么做, Context大致还是会这么做。 那么很显然地, 我们需要在这里使用到代码复用的技术。 tomcat在处理这个问题的时候, 漂亮地使用了抽象类来处理。 ContainerBase. 最后使得这部分完成复杂功能的代码显得干净利落, 干练爽快, 实在是令人觉得叹为观止, 细细品来, 直觉如享佳珍, 另人齿颊留香, 留恋往返啊!
      
      Engin的触发启动前事件里, 会激活绑定在Engin上的唯一一个Listener:EnginConfig。
      这个EnginConfig类基本上没有做什么事情, 就是把EnginConfig的调试级别设置为和Engin相当。 另外就是输出几行文本, 表示Engin已经配置完毕, 并没有做什么实质性的工作。
      注1: mapping组件的用处是, 当一个需求将要从父容器传递到子容器的时候, 而父容器又有多个子容器的话, 那么应该选择哪个子容器来处理需求呢? 这个由mapping 组件来定夺。
    
   4. Host
       同Engin一样, 也是调用ContainerBase里面的start()方法, 不过之前做了些自个儿的任务,就是往Host这个容器的通道(pipline)里面, 安装了一个叫做
 “org.apache.catalina.valves.ErrorReportValve”的阀门。
       这个阀门的用处是这样的:  需求在被Engin传递给Host后, 会继续传递给Context做具体的处理。 这里需求其实就是作为参数传递的Request, Response。 所以在context把需求处理完后, 通常会改动response。 而这个org.apache.catalina.valves.ErrorReportValve的作用就是检察response是否包含错误, 如果有就做相应的处理。
   5. Context
       到了这里, 就终于轮到了tomcat启动中真正的重头戏,启动Context了。
 StandardContext.start() 这个启动Context容器的方法被StandardHost调用.
  5.1 webappResources 该context所指向的具体目录
  5.2 安装defaultContex, DefaultContext 就是默认Context。 如果我们在一个Host下面安装了DefaultContext,而且defaultContext里面又安装了一个数据库连接池资源的话。 那么其他所有的在该Host下的Context, 都可以直接使用这个数据库连接池, 而不用格外做配置了。
  5.3 指定Loader. 通常用默认的org.apache.catalina.loader.WebappLoader这个类。   Loader就是用来指定这个context会用到哪些类啊, 哪些jar包啊这些什么的。
  5.4 指定 Manager. 通常使用默认的org.apache.catalina.session. StandardManager 。 Manager是用来管理session的。
     其实session的管理也很好实现。 以一种简单的session管理为例。 当需求传递过来的时候, 在Request对象里面有一个sessionId 属性。 OK, 得到这个sessionId后, 我们就可以把它作为map的key,而value我们可以放置一个HashMap. HashMap里边儿, 再放我们想放的东西。
  5.5 postWorkDirectory (). Tomcat下面有一个work目录。 我们把临时文件都扔在那儿去。 这个步骤就是在那里创建一个目录。 一般说来会在%CATALINA_HOME%/work/Standalone\localhost\ 这个地方生成一个目录。
5.6  Binding thread。到了这里, 就应该发生 class Loader 互换了。 之前是看得见tomcat下面所有的class和lib. 接下来需要看得见当前context下的class。 所以要设置contextClassLoader, 同时还要把旧的ClassLoader记录下来,因为以后还要用的。
5.7  启动 Loader. 指定这个Context具体要使用哪些classes, 用到哪些jar文件。 如果reloadable设置成了true, 就会启动一个线程来监视classes的变化, 如果有变化就重新启动Context。
5.8  启动logger
5.9  触发安装在它身上的一个监听器。
 lifecycle.fireLifecycleEvent(START_EVENT, null); 
 作为监听器之一,ContextConfig会被启动. ContextConfig就是用来配置web.xml的。 比如这个Context有多少Servlet, 又有多少Filter, 就是在这里给Context装上去的。
  5.9.1 defaultConfig. 每个context都得配置 tomcat/conf/web.xml 这个文件。
  5.9.2 applicationConfig 配置自己的 WEB-INF/web.xml 文件
5.9.3 validateSecurityRoles 权限验证。 通常我们在访问/admin 或者/manager的时候,需要用户要么是admin的要么是manager的, 才能访问。 而且我们还可以限制那些资源可以访问, 而哪些不能。 都是在这里实现的。
5.9.4 tldScan: 扫描一下, 需要用到哪些标签(tag lab)
5.10 启动 manager
5.11 postWelcomeFiles() 我们通常会用到的3个启动文件的名称:
index.html、index.htm、index.jsp 就被默认地绑在了这个context上
  5.12 listenerStart 配置listener
  5.13 filterStart 配置 filter
  5.14 启动带有<load-on-startup>1</load-on-startup>的Servlet.
  顺序是从小到大: 1,2,3… 最后是0
  默认情况下, 至少会启动如下3个的Servlet: 
  org.apache.catalina.servlets.DefaultServlet   
      处理静态资源的Servlet. 什么图片啊, html啊, css啊, js啊都找他
  org.apache.catalina.servlets.InvokerServlet
      处理没有做Servlet Mapping的那些Servlet.
  org.apache.jasper.servlet.JspServlet 
      处理JSP文件的.
       5.15  标识context已经启动完毕。
 走了多少个步骤啊, Context总算是启动完毕喽。
    OK! 走到了这里, 每个容器以及组件都启动完毕。 Tomcat终于不辞辛劳地为人民服务了


请求过程:


从上图可知,以上过程可分解成以下三个最主要的核心点:

  • 基于Http1.1协议对Socket的解析和包装
  • StandardEngineValve、StandardHostValve、StandardContextValve和StandardWrapperValve四种Valve的一路inoke。四种不同层次的Valve做了不同层次的处理和封装
  • 基于责任链模式ApplicationFilterChain实现Filter拦截和实际Servlet的请求

参考文章:

http://www.ibm.com/developerworks/cn/java/j-lo-tomcat1/index.html?ca=drs-

http://blog.csdn.net/cutesource/archive/2009/12/14/5006062.aspx

http://blog.csdn.net/ThomasHuang/archive/2004/06/07/22393.aspx

 

分享到:
评论

相关推荐

    tomcat启动原理解析

    以下是对Tomcat启动流程的详细解析: 1. **初始化环境** - Tomcat启动前,首先会检查并配置系统环境,包括JDK版本、JAVA_HOME、CATALINA_HOME等环境变量。 - 阅读`conf/server.xml`配置文件,这是Tomcat的核心...

    Tomcat启动分析以及如何启动

    Tomcat启动分析与配置详解 Tomcat是一款广泛使用的开源Java Servlet容器,它实现了Java EE的Web应用程序规范。理解Tomcat的启动过程和配置对于优化服务器性能和管理Web应用至关重要。本文将深入解析Tomcat的组成...

    tomcat 分配请求之——socket获取请求

    在Tomcat服务器启动后,它会在配置的端口(默认为8080)上创建一个ServerSocket监听。当客户端发起连接请求时,ServerSocket会生成一个新的Socket实例与客户端建立连接。这个Socket对象是数据传输的通道,它将承载...

    Tomcat5启动流程与配置详解 .

    ### Tomcat5启动流程与配置详解 #### 一、Tomcat5.0目录结构 Tomcat作为一款广泛使用的开源Web服务器软件,其5.0版本的目录结构清晰且功能明确,便于用户理解和维护。以下是对Tomcat5.0各个目录的具体介绍: 1. *...

    tomcat6的源码

    解析过程在`org.apache.tomcat.util.digester`包下,你可以研究这些类来理解配置的处理方式。 7. **连接器(Connector)**:Tomcat支持多种协议,如HTTP/1.1、AJP等。`Coyote`组件负责处理这些协议,其中` ...

    TOMCAT原理详解及请求过程

    ### TOMCAT原理详解及请求过程 #### 一、TOMCAT概述 TOMCAT是一个开源的免费的轻量级Web应用服务器,它主要作为一个JSP/Servlet容器而被广泛使用。Tomcat支持Java Servlet和JavaServer Pages (JSP)技术,并且提供...

    tomcat启动服务运行servlet

    标题“Tomcat启动服务运行Servlet”涉及到的是Java Web开发中的核心概念,主要涵盖Tomcat服务器的启动过程以及Servlet的执行机制。Tomcat是一款开源、免费的Web应用服务器,广泛用于部署Java Servlet和JavaServer ...

    解析Tomcat处理请求的类Connector<三>

    【标题】:“解析Tomcat处理请求的类Connector&lt;三&gt;” 在Java的Web服务器领域,Tomcat无疑是最为广泛使用的轻量级应用服务器之一。它以其开源、免费、高效的特点深受开发者喜爱。在这个系列的第三部分,我们将深入...

    Tomcat7.0.62 启动官方文档 (txt/pdf)

    《Tomcat7.0.62 启动官方文档》主要涵盖了Apache Tomcat服务器的启动过程和相关配置,这是Web应用程序开发和部署中至关重要的环节。Tomcat是Apache软件基金会的开源项目,作为Java Servlet和JavaServer Pages(JSP)...

    tomcat6 源代码

    Tomcat启动时会读取`conf/server.xml`配置文件,解析并创建Catalina核心引擎,然后初始化各个组件,如Connector(用于接收和处理HTTP请求)、Executor(线程池)、Context(每个Web应用对应一个)等。 4. **请求...

    tomcat6源码分析

    1. 初始化:Tomcat启动时,会读取配置文件server.xml,解析配置信息,构建出服务器的结构。 2. 加载Web应用:根据context.xml配置加载Web应用,创建对应的Context对象。 3. 初始化Servlet:调用Servlet的init()方法...

    Tomcat深入剖析pdf+源码(Tomcat运行原理)

    2. **启动流程**:Tomcat的启动过程涉及服务器配置文件的读取,如server.xml、web.xml等,这些文件定义了服务器的行为和应用的部署信息。Tomcat会根据这些配置启动必要的服务和监听器。 3. **Servlet生命周期**:...

    TOMCAT源码分析(启动框架)

    二、Tomcat启动流程 1. **初始化配置**:Tomcat首先读取`conf/server.xml`配置文件,解析各个组件的配置信息,构建组件层次结构。 2. **加载服务**:根据配置,Tomcat创建Service对象,Service由一个或多个...

    Tomcat6源代码学习(运行源代码及调试)

    《深入剖析Tomcat6源代码:运行与调试指南》 Tomcat6作为一款经典的开源Java Servlet容器,其源代码的学习对于理解Java Web应用的运行机制、优化服务器性能以及解决实际问题具有重大价值。本篇文章将从以下几个方面...

    tomcat6绿色版

    2. 访问权限:确保Tomcat启动用户有读写权限,特别是`temp`目录和`logs`目录。 3. JSP编译错误:检查JDK版本是否与Tomcat6兼容,且`JAVA_HOME`环境变量设置正确。 4. 部署失败:检查WAR文件的完整性和`web.xml`配置...

    模拟TOMCAT工作的全部过程

    一、TOMCAT启动过程 1. **初始化**:当TOMCAT启动时,会读取`conf/server.xml`配置文件,这个文件定义了服务器的各个组件,如监听器、连接器、容器等。 2. **加载服务**:TOMCAT会根据配置文件创建一个`Catalina`...

    tomcat 源码分析系列文档

    9. "Tomcat启动源代码分析.pdf":深入到启动脚本和Java代码,解释了从启动脚本开始,如何初始化和启动Tomcat服务的全过程。 10. "tomcat类加载机制.pdf":再次聚焦于Tomcat的类加载机制,可能深入到更多细节和技巧...

    我的tomcat7源码手撕过程

    这个类是Tomcat启动的入口点。 4. **Bootstrap类解析**: - `main`方法中,“start”关键字引导程序进入`start`方法,进而调用`load`方法。 - `load`方法通过反射机制加载`org.apache.catalina.startup.Catalina`...

    tomcat源码解析

    - **第3章**:详细解析了Tomcat中的连接器(Connector)组件,它是Tomcat与客户端进行通信的关键部分。 - **第4章**:深入探讨了Tomcat的默认连接器的实现细节,包括HTTP/1.1的新特性及其对连接器的影响。 - **第5章...

Global site tag (gtag.js) - Google Analytics