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

Tomcat7源码解读(三) —— 启动及请求处理过程

阅读更多

概述:上两节中分析了Tomcat7的静态结构。这篇将接受Tomcat的启动以及与Tomcat的请求处理过程。因为Tomcat启动与server.xml配置文件所决定,所以本文主要是默认情况下Tomcat7的启动过程。

 

一. 容器的启动过程

UML图例说明:

实心箭头表示同步调用;空心箭头表示异步调用。


图例说明:

1. 引导类Bootstrap负责引导,在其init方法内部创建容器启动所需的类加载器,以及用于JMX监控的MBeanServer

 

2. Bootstrap调用Catalina的load()方法加载Server的配置(也就是server.xml),将加载的配置信息委托给Digester类进行相关内容的解析。

 

3. Catalina获取到Server的配置信息后,执行StandardServer容器的init()方法。Tomcat的所有容器类都实现了统一的Lifecycle接口,由基类LifecycleBase提供统一的init方法来负责处理容器的状态,调用模板方法initInternal来处理各个容器自身所负责的内容。关于Tomcat的容器结构可以参看本系列文章的《Tomcat7源码解读(一)——容器静态结构概述》。StandardServer容器在其initInternal()方法中完成Mbean的设定,GlobalNamingResources的初始化和类加载器的设置。然后执行StandardService容器的init方法。

 

4.  StandardService同StandardServer容器,由基类LifecycleBase完成容器的生命周期状态设定,而在initInternal()方法中启动Container,Executor,Connector的init方法。

 

5.  Connector容器主要将CoyoteAdapter传递给ProtocolHandler,完成对于继续启用ProtocolHandler的初始化,关于ProtocolHandler在后面详细讲解。

 

6.  Tomcat包含了4中不同的Container容器,从外到内分别为Engine,Host,Context,Wrapper。每一个容器都继承了ContainerBase类,在ContainerBase类的初始化中容器的启动线程,多线程异步启动各个容器。

 

7.  StandardThreadExecutor默认情况下并不做独立的配置,而是集成在了Connector容器内部实现。

 

8.  在完成了对所有容器的初始化操作之后,引导类Bootstrap调用start()方法开始引导Catalina进行启动。其过程同init过程,各个容器的主要作用就是调用其子容器的start方法完成启动。与init过程一样,基类LifecycleBase提供了对于生命周期修改的统一操作,而具体的启动操作由各个容器通过模板方法startInternal()方法实现。

 

二. Tomcata7默认的连接器启动过程,默认情况下采用了阻塞IO的JIoEndpoint来处理请求。


1.  Connector容器Service容器调用init()方法中调用模板方法initInternal()方法,并且调用Http11Protocol的init()执行初始化。

2.   这里Tomcat再次使用了模板与策略设计模式,Http11Protocol类的init方法由基类AbstractProtocol实现,主要完成了JMX的相关注册,之后开始调用核心类JIoEndpoint的初始化操作。

3.   JIoEndpoint类主要通过其内部方法bind(),通过工厂ServerSocketFactory准备好serverSocket对象,完成初始化操作。

4.   完成初始化后,Connector对象,调用Http11Protocol的start()方法。

5.   Http11Protocol调用JIoEndpoint类的start()方法启动Socket监听。

6.   JIoEndpoint类首先创建出一个接受线程,然后启动该接受线程开始监听Socket请求。至此Connetor启动完成。

 

三. 接下来继续看Tomcat的请求处理过程

1.  JIoEndpoint的Acceptor线程在接受到用户的请求之后,调用processSocket方法。该方法主要是从Executor线程池中获取一个线程,然后启用一个新线程执行Socket请求。实际上的处理过程要复杂的多,在多线程请求的情况下,需要考虑线程的死锁,处理请求过多时候的缓冲等内容。这里都不做说明,在后续章节详细说明。

 

2.  JIoEndpoint在调用Http11ConnectionHandler的process方法进行处理。

 

3.  Http11ConnectionHandler从缓冲池中取出Processor对象执行进行解析处理。

 

4.  Http11Processor类,将socket流解析生成Request对象与Response对象。其中Request对象只是解析Header部分内容,请求参数等做延迟处理,只有在Servlet需要的时候才执行解析操作。接着就开始调用CoyoteAdapter类处理Servlet。

 

5. CoyoteAdapter调用容器的管道一步一步的对Request,Response对象处理。Tomcat容器主要由4层组成,通过管道的模式将各个层的功能进行了独立,也有利于对各层插入需要的功能。如果需要,只要在server.xml中加入Value元素的配置即可完成扩展功能。

 

6.  StandardEngin容器默认管道StandardEnginValve。它主要做负责选择相应的host去处理请求。Tomcat可以有多个Host。

 

7.  StandardHost默认情况下配置了ErrorReportValve与StandardHostValue。ErrorReportValve用于处理错误日志。StandardHostValue则选择相应的Context容器,并且设定特定的类加载器,保证Context之间的安全性。

 

8.  StandardContext默认情况下配置了StandardContextValve。禁止对于WEB-INF与META-INF目录的访问控制,之后选择一个合适的Wrapper容器。

 

9.  StandardWrapper容器默认情况下配置了StandardWrapperValve。主要负责了两件事情。1)是启动过滤器FilterChain,对请求执行过滤操作。2)执行service方法。如果是Jsp内容则进行编译,然后执行。如果是静态文件直接取出内容返回,如果是servlet调用那么就调用servlet方法。补充说明,StandardWrapper容器是对于Servlet的包装,所有的Request的资源可以分成4种不同的类型,静态资源请求(HTML,图片,CSS等),JSP请求,Servlet请求,以及CGI请求。对于不同的请求Tomcat用WebdavServlet处理静态资源文件,JspServlet处理Jsp请求,CGIServlet处理CGI请求。

 

总结:本次主要说明了Tomcat的启动过程以及与请求处理过程,很多细节的内容并没有深入展开,细节将在后续章节进行进一步的说明。

  • 大小: 117.5 KB
  • 大小: 87.8 KB
  • 大小: 108.8 KB
分享到:
评论

相关推荐

    tomcat7源码下载

    《深入剖析Tomcat7源码》 Tomcat7是一款广泛使用的开源Java Servlet容器,它实现了Java EE中的Web应用服务器标准,尤其是Servlet和JSP规范。源码下载是开发者深入理解其内部工作原理的重要途径,本篇文章将围绕...

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

    标题“Tomcat分配请求之——Socket获取请求”主要涉及的是Tomcat服务器在处理HTTP请求时的核心机制。在Web服务器中,Tomcat是一个广泛使用的开源应用服务器,它负责解析并响应来自客户端(如浏览器)的HTTP请求。这...

    tomcat7源码

    《深入剖析Tomcat7源码》 Tomcat7是一款广泛使用的开源Java Servlet容器,它实现了Java EE中的Servlet和JSP规范。源码分析是提升开发者对服务器内部运作机制理解的重要途径,尤其对于Tomcat这样的核心组件,源码的...

    Syske#person-learning-note#Tomcat源码分析-壹——启动过程值init方法1

    前言从今天开始,我们开始分析tomcat的源码,至于原因嘛,第一Tomcat是非常优秀的web服务器,它占据着全球一半以上的市场份额,就连spring boot

    Ant编译Tomcat源码、MyEclipse导入Tomcat源码、执行Tomcat源码启动Tomcat

    在Apache Tomcat的源码中,通常会有一个名为`build.xml`的Ant构建脚本,用于指导整个构建过程。在编译Tomcat源码之前,确保已安装Java JDK和Ant。下载并解压`apache-tomcat-6.0.37-src.zip`后,进入解压后的目录,...

    tomcat7源码环境部署

    Tomcat7允许开发者编写自定义Valves(请求处理管道中的组件)、Filters和Listeners,以实现特定的功能或拦截器逻辑。 8. **安全管理**: Tomcat7支持多种安全措施,如SSL/TLS加密、Realm(认证和授权)配置,可以...

    我的tomcat7源码手撕过程

    ### Tomcat7源码手撕过程详解 #### Tomcat初始化流程分析 Tomcat是一个流行的Java Servlet容器,用于部署和运行Web应用程序。理解Tomcat的工作原理对于优化应用性能、解决部署问题至关重要。以下是对Tomcat7启动...

    tomcat源码+文档pdf+源码解析

    源码是软件的基石,通过阅读源码,我们可以了解到Tomcat如何处理HTTP请求,如何管理线程,以及如何部署和运行Web应用。Tomcat的源码主要分为几个核心模块: 1. **Catalina**:这是Tomcat的核心组件,负责Servlet...

    3-5Tomcat响应请求源码与nio处理请求源码实现.mp4

    3-5Tomcat响应请求源码与nio处理请求源码实现.mp4

    tomcat源码阅读(一)——环境搭建

    本篇将聚焦于"Tomcat源码阅读(一)——环境搭建",探讨如何搭建一个适合源码学习的开发环境。 首先,我们需要了解Tomcat是什么。Tomcat是一款开源的Java Servlet容器,由Apache软件基金会维护,实现了Java EE中的...

    tomcat处理一个http请求的详细过程

    tomcat中server配置文件的结构,以及处理一个http请求的全过程

    tomcat 7 及其源码

    - 源码可以帮助开发者深入理解Tomcat的工作原理,比如请求处理流程、会话管理、错误处理等。 - 关注`org.apache.catalina`和`org.apache.coyote`包下的类,了解请求和响应的生命周期。 - 学习`org.apache.jasper`...

    tomcat6的源码

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

    tomcat7源码环境搭建

    【标题】:“Tomcat7源码环境搭建” 在IT领域,深入理解服务器软件的内部运行机制对于优化性能、排查问题和进行二次开发至关重要。Tomcat7作为一款广泛应用的开源Java Servlet容器,其源码分析是许多开发者提升技能...

    tomcat6源码分析

    《Tomcat6源码分析——深入理解Web服务器的运行机制》 Tomcat6作为Apache软件基金会的Jakarta项目的一部分,是一款广泛使用的Java Servlet容器,它实现了Java Servlet和JavaServer Pages(JSP)规范,为开发和部署...

    tomcat8源码

    Tomcat使用Executor线程池来处理请求,允许开发者根据应用需求调整线程数量和超时策略,提高并发性能。 通过研究Tomcat8的源码,我们可以深入理解其内部工作流程,学习如何定制和优化服务器配置,以适应不同的Web...

    tomcat工作原理深入详解——HowTomcatWorks中文版.pdf

    tomcat工作原理深入详解——HowTomcatWorks中文版.pdf

    tomcat7.0.42源码,eclipse直接使用

    【标题】"Tomcat7.0.42源码,eclipse直接使用" 【内容】: Tomcat7.0.42是Apache Tomcat服务器的一个版本,它是一个开源的Java Servlet容器,主要用于实现Java Servlet和JavaServer Pages(JSP)技术。这个版本的...

    tomcat源码解析

    启动连接器通常涉及到创建ServerSocket、监听客户端连接请求以及处理请求的过程。 ##### connector Connector是Tomcat中负责接收和分发HTTP请求的核心组件。它通过创建Socket连接来处理客户端请求。 ##### 创建...

Global site tag (gtag.js) - Google Analytics