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

tomcat架构分析(valve机制)

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

关于tomcat的内部逻辑单元的存储空间已经在相关容器类的blog里阐述了。在每个容器对象里面都有一个pipeline及valve模块。它们是容器类必须具有的模块。在容器对象生成时自动产生。Pipeline就像是每个容器的逻辑总线。在pipeline上按照配置的顺序,加载各个valve。通过pipeline完成各个valve之间的调用,各个valve实现具体的应用逻辑。
先看一下pipeline及valve的逻辑概念图。

这些valve就是在tomcat的server.xml中配置,只要满足一定条件,继承ValveBase基类
引用
org.apache.catalina.valves.ValveBase

就可以在不同的容器中配置,然后在消息流中被逐一调用。每个容器的valve的作用域不一样,在总体结构中已有说明。这里红色标记的是配置的自定义的valve,这样可以扩展成多个其他应用,例如cluster应用等。
Tomcat实现

Tomcat提供了Pipeline的标准实现:
引用
org.apache.catalina.core.StandardPipeline


四大容器类StandardEngine,StandardHost,StandardContext及StandardWrapper都有各自缺省的标准valve实现。它们分别是
  • Engine:org.apache.catalina.core.StandardEngineValve
  • Host: org.apache.catalina.core.StandardHostValve
  • Context:org.apache.catalina.core.StandardContextValve
  • Wrapper:org.apache.catalina.core.StandardWrapperValve

容器类生成对象时,都会生成一个pipeline对象,同时,生成一个缺省的valve实现,并将这个标准的valve对象绑定在其pipeline对象上。以StandardHost类为例:
public class StandardHost extends ContainerBase implements Host { 

  protected Pipeline pipeline = new StandardPipeline(this); 
  public StandardHost() { 
    super(); 
    pipeline.setBasic(new StandardHostValve()); 
  } 

}

Valve实现了具体业务逻辑单元。可以定制化valve(实现特定接口),然后配置在server.xml里。每层容器都可以配置相应的valve,当只在其作用域内有效。例如engine容器里的valve只对其包含的所有host里的应用有效。定制化的valve是可选的,但是每个容器有一个缺省的valve,例如engine的StandardEngineValve,是在StandardEngine里自带的,它主要实现了对其子host对象的StandardHostValve的调用,以此类推。
配置的例子有:
<Engine name="Catalina" defaultHost="localhost">
  <Valve className="MyValve0"/>
  <Valve className="MyValve1"/>
  <Valve className="MyValve2"/>
   ……
  <Host name="localhost"  appBase="webapps">
  </Host>
</Engine>

当在server.xml文件中配置了一个定制化valve时,会调用pipeline对象的addValve方法,将valve以链表方式组织起来,看一下代码;
public class StandardPipeline implements Pipeline, Contained, Lifecycle{ 

  protected Valve first = null; 

  public void addValve(Valve valve) { 

    // Validate that we can add this Valve 
    if (valve instanceof Contained) 
       ((Contained) valve).setContainer(this.container); 

    // Start the new component if necessary 
    if (started) { 
       if (valve instanceof Lifecycle) { 
         try { 
           ((Lifecycle) valve).start(); 
         } catch (LifecycleException e) { 
           log.error("StandardPipeline.addValve: start: ", e); 
         } 
       } 
       // Register the newly added valve 
       registerValve(valve); 
     } 

     // 将配置的valve添加到链表中,并且每个容器的标准valve在链表的尾端
     if (first == null) { 
        first = valve; 
        valve.setNext(basic); 
     } else { 
        Valve current = first; 
        while (current != null) { 
          if (current.getNext() == basic) { 
             current.setNext(valve); 
             valve.setNext(basic); 
             break; 
          } 
          current = current.getNext(); 
        } 
     }
  } 
}

从上面可以清楚的看出,valve按照容器作用域的配置顺序来组织valve,每个valve都设置了指向下一个valve的next引用。同时,每个容器缺省的标准valve都存在于valve链表尾端,这就意味着,在每个pipeline中,缺省的标准valve都是按顺序,最后被调用。
消息流
先看一下四大容器的标准valve的调用逻辑图。从中可以梳理出标准valve的逻辑。注意此图只是在缺省配置下的状态,也就是说每个pipeline只包含一个标准valve的情况。

图中显示的是各个容器默认的valve之间的实际调用情况。从StandardEngineValve开始,一直到StandardWrapperValve,完成整个消息处理过程。注意每一个上层的valve都是在调用下一层的valve返回后再返回的,这样每个上层valve不仅具有request对象,同时还能拿到response对象,想象一下,这样是不是可以批量的做很多东西?
分享到:
评论
3 楼 zjhlht 2013-04-10  
非常感谢!!
看完了valve源码导读,茅塞顿开
2 楼 gearever 2013-04-10  
zjhlht 写道
请教一下!
valve消息流中说的是每层只有一个valve的调用情况。如果每层有多个valve的情况下,消息流又是怎样的呢?
谢谢


每一层有多个valve,以Engine层为例,都是以这个顺序 valve0,valve1,...StandardEngineValve进行调用,典型的责任链模式,各个valve之间根据一定的逻辑通过getNext().invoke(request, response);调用下一个valve
1 楼 zjhlht 2013-04-10  
请教一下!
valve消息流中说的是每层只有一个valve的调用情况。如果每层有多个valve的情况下,消息流又是怎样的呢?
谢谢

相关推荐

    tomcat 架构解析

    **Tomcat架构解析** Tomcat是一款广泛使用的开源Java Servlet容器,由Apache软件基金会开发和维护。它是Java EE(现在称为Jakarta EE)平台的核心部分,主要用于托管Web应用程序。本篇文章将深入探讨Tomcat的架构,...

    tomcat6源码分析

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

    Tomcat中容器的pipeline机制 - coldridgeValley - 博客园1

    Pipeline和Valve机制的设计,使得Tomcat具有良好的可扩展性和灵活性。开发者可以通过自定义Valve来实现特定的功能需求,插入到Pipeline中,从而增强Tomcat的处理能力。这种模块化的设计思想,使得Tomcat能够适应各种...

    《深入剖析 Tomcat》PDF版本下载.txt

    ### 二、Tomcat架构分析 #### 2.1 架构概述 Tomcat采用了一种基于组件的模块化架构设计,主要由以下几部分组成: - **Connector**:负责监听客户端请求并将它们传递给Container处理。 - **Container**:容器负责...

    Tomcat7核心架构

    Tomcat使用**LifecycleListener机制**来自动部署Web应用,主要包括以下步骤: - **HostConfigListener**:监听`Host`组件的生命周期变化。 - 加载`conf/Catalina/localhost`目录下的XML文件。 - 加载`webapps`...

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

    6. **连接器与管道**:Coyote连接器负责接收和发送网络数据,管道(Pipeline)则提供了灵活的处理链,允许自定义处理器(Valve)来扩展Tomcat的功能。 7. **部署与热部署**:Tomcat支持自动部署和热部署,只需将WAR...

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

    为了更好地理解和掌握TOMCAT的工作机制,建议读者结合实际操作进行学习,如下载TOMCAT源码并逐步跟踪其启动过程。 #### 二、Tomcat整体框架结构 TOMCAT的基本框架分为四个主要层次: 1. **Top-Level Elements**:...

    Tomcat6的源码

    7. **安全性**:Tomcat提供了多种安全特性,如角色基授权、SSL支持等,源码分析可以帮助我们深入理解这些机制并进行安全配置。 通过研究Tomcat6的源码,开发者不仅可以提升Java Web开发技能,还能为更高级的服务器...

    IIS整合多个tomcat

    同时,通过健康检查机制,IIS能检测后端Tomcat的状态,当某个实例故障时,自动将请求转发到其他正常运行的Tomcat。 五、安全性考虑 1. 使用SSL/TLS加密通信:确保数据在传输过程中的安全。 2. 配置防火墙和安全组...

    How Tomcat Works【英文PDF+中文HTML+源码】.zip

    10. **扩展性**:Tomcat可以通过添加Valve组件来扩展其功能,Valve是一个处理请求和响应的拦截器,可以用于日志记录、安全控制、性能监控等。 通过阅读《How Tomcat Works》的英文PDF文档和中文HTML翻译,可以系统...

    Tomcat源码apache-tomcat-8.5.47-src.zip

    学习Tomcat源码时,可以先从整体架构出发,了解各个组件的作用和交互方式,然后再深入到具体类的实现。通过阅读源码,我们可以理解Tomcat如何处理请求,如何管理Web应用,以及如何实现JSP的生命周期。此外,还可以...

    apache-tomcat-8.5.68-src

    Tomcat的插件式架构允许开发者通过编写Valve(阀门)组件,插入到请求处理链中,实现自定义的功能。源码中可以看到Valve的生命周期管理和配置。 9. **性能优化**: 通过对源码的研究,可以了解到Tomcat如何缓存...

    WEB服务器工作机制由浅至深(8):【How Tomcat Works】第14章Server和Service

    1. **Tomcat架构基础** Tomcat的架构基于模块化设计,主要由四个核心组件构成:Catalina(Servlet容器)、Jasper(JSP引擎)、 Coyote(HTTP连接器)和Juli(日志系统)。这些组件协同工作,使得Tomcat能够高效地...

    tomcat管道模式 pipeline与valve详解

    总之,Tomcat的管道模式和Valve机制是一种高效的设计,使得Web容器能够处理复杂的业务逻辑,同时也为开发者提供了极大的灵活性和可扩展性。通过对Valve和Pipeline的合理设计和使用,可以构建出一个既稳定又易维护的...

    深入剖析tomcat (完整目录)

    1. Tomcat架构 - Tomcat的核心组件包括Catalina、 Coyote、Jasper等,每个组件都有其特定功能,如Catalina处理Servlet容器的主要职责,Coyote负责HTTP协议处理,Jasper则用于JSP的编译和执行。 2. 安装与配置 - ...

    tomcat8源码

    它包含了Server、Service、Connector和Container等概念,其中Container负责管理Servlet,通过Pipeline和Valve机制实现请求的处理流程。 4. **Connector与ProtocolHandler** Connector负责连接器的角色,处理网络...

    tomcat源码,servlet-api源码

    1. **Tomcat架构解析** Tomcat的核心架构包括Catalina、 Coyote、 Jasper、 Juli和Commons-daemon等模块。Catalina处理Servlet容器的主要职责,如管理Web应用程序、会话跟踪和安全管理;Coyote负责网络通信,处理...

    apache-tomcat-7.0.14-src.zip

    此外,源码分析还可以帮助我们理解Tomcat的安全机制,如如何配置和使用Realm(认证域)来管理用户身份验证,以及如何通过Valve(阀门)接口插入自定义的请求处理逻辑。Valve是Tomcat中的一个关键组件,可以拦截和...

    apache-tomcat 源代码

    1. **Tomcat架构**: - Tomcat由多个组件构成,如Catalina(核心Servlet容器)、Jasper(JSP引擎)、 Coyote(HTTP连接器)和Juli(日志系统)。源代码中,这些组件分布在不同的目录下,通过协同工作来处理请求和...

Global site tag (gtag.js) - Google Analytics