【读过的书,留下的迹】深入剖析Tomcat

来源:互联网 发布:弱电网络模块 编辑:程序博客网 时间:2024/04/28 14:10
这本书是基于Tomcat4,Tomcat5作分析的,版本比较老,可作为对Tomcat的一个大致了解,有助于以后对新版Tomcat源码的阅读。

连接器

Tomcat中使用的连接器必须满足以下条件要求

  • 实现org.apache.catalina.Connector接口
  • 负责创建实现了org.apache.catalina.Request接口的request对象
  • 负责创建实现了org.apache.catalina.Response接口的response对象

(1)http1.1的新特性

  • 持久连接:connection: keep-alive
  • 块编码
  • 状态码100的使用

(2)Connector接口

重要方法:

  • getContainer:获取关联servlet容器
  • setContainer:设置关联servlet容器
  • createRequest:
  • createResponse:

(3)一般步骤

  • 连接器监听http请求
  • 生成request和response对象
  • 调用关联的container的invoke(request, response)

servlet容器

servlet容器是用来处理请求servlet资源,并为Web客户端填充response对象的模块。共有4种类型的容器:

  • Engine:表示整个Catalina servlet引擎
  • Host:表示包含一个或多个Context容器的虚拟主机
  • Context:表示一个Web应用程序,一个Context可以有多个Wrapper
  • Wrapper:表示一个独立的servlet

一个容器可以有0个或多个低层级的子容器

(1)管道任务

servlet调用invoke其实是调用servlet容器中的pipeline的invoke方法。

管道包含该servlet容器将要调用的任务,一个阀表示一个具体的执行任务,类似于过滤器链和过滤器。servlet容器会依次调用pipeline中的vavle。

(2)Wrapper接口

Wrapper接口的实现类负责管理其基础servlet类的servlet生命周期,即调用servlet的init(),service(),destroy()方法。

两个重要的接口

  • load:加载并初始化servlet类
  • allocate:分配一个已初始化的servlet实例

(3)一般步骤

  • container.invoke:容器包含一条管道,容器的invoke方法会调用管道的invoke方法
  • pipeline的invoke方法会调用所有添加到其容器中的vavle,然后再调用其basicVavle的invoke方法
  • Context容器的basicVavle使用Mapper查找一个子容器Wrapper,如果找到子容器Wrapper,则调用Wrapper的invoke,重复上述过程
  • Wrapper的basicVavle负责载入相关联的servlet类,并对请求进行响应

生命周期

Tomcat中的组件均实现了Lifecycle的接口,可以实现统一启动/停止组件的功能。

(1)Lifecycle接口

最重要的是start和stop方法,父组件会调用这两个方法,以对该组件启动/关闭

(2)LifecycleEvent类

生命周期事件

(3)LifecycleListener接口

事件监听器,有一个方法:lifecycleEvent(LifecycleEvent event),用来触发event事件

(4)LifecycleSupport辅助类

用来帮助Lifecycle接口管理LifecycleListener监听器

载入器

作用:加载所需的servlet类

为什么需要载入器

  • 安全:限定servlet只允许载入WEB-INF/classes目录及其子目录下的类,和从部署的库到WEB-INF/lib目录载入类
  • 提供自动重载:需要一个线程不断检查servlet类和其他类的文件的时间戳
  • 简单地说
    • 为了在载入类时指定规则
    • 为了缓存已经载入的类
    • 为了实现类的预载入,方便使用

载入器需实现Loader接口

(1)一般步骤

  • WebappLoader创建一个类载入器WebappClassLoader
  • 设置仓库
  • 设置类路径
  • 设置访问权限
  • 启动一个新线程来支持自动重载

Session管理

Tomcat中用Manager接口来管理Session接口

Session的键值对可以存在内存中的HashMap,或者文件,或者数据库中

StandardWrapper

StandardWrapper是Catalina对Wrapper接口的标准化实现

简化版的时序图

Created with Raphaël 2.1.0ConnectorConnectorStandardContextStandardContextStandardContextPipelineStandardContextPipelineStandardContextValveStandardContextValveStandardWrapperStandardWrapperStandardWrapperValveStandardWrapperValveServletServletinvoke()invoke()invoke()invoke()invoke()allocate()load()init()service()

StandardWrapperValve要完成以下两件事:

  • 执行关联servlet的所有过滤器
  • 调用servlet实例的service方法

StandardContext

  • Context实例表示一个具体的Web应用程序,其中包含一个或多个Wrapper实例
  • Context容器还需其他组件支持,典型的如载入器和Session管理

主要任务:

  • 处理从Conncector中接收到的每个http请求
  • 通过映射器Mapper找到Wrapper
  • 通过Loader载入Servlet
  • 通过Manager对Session进行管理
  • 等等

Host和Engine

Server和Service

Server接口表示Catalina的整个servlet引擎,囊括了所有的组件

  • 启动/关闭整个系统

Server组件包含0个或多个Service组件,Service组件包含多个Connector(处理不同协议)和一个Servlet容器

阅读全文
0 0