【读过的书,留下的迹】深入剖析Tomcat
来源:互联网 发布:弱电网络模块 编辑:程序博客网 时间:2024/04/28 14:10
连接器
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接口的标准化实现
简化版的时序图
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容器
- 【读过的书,留下的迹】深入剖析Tomcat
- 【读过的书,留下的迹】深入理解计算机系统
- 【读过的书,留下的迹】深入理解Java虚拟机
- 【读过的书,留下的迹】数据库系统概念
- 【读过的书,留下的迹】Unix网络编程
- 【读过的书,留下的迹】Spring技术内幕——深入解析Spring架构与设计原理
- 【读过的书,留下的迹】Spring实战(第3版)
- 【读过的书,留下的迹】计算机网络(第6版)
- 【读过的书,留下的迹】算法导论——数据结构篇
- 【读过的书,留下的迹】算法导论——算法篇
- 【读过的书,留下的迹】Java并发编程实战
- 【读过的书,留下的迹】Java核心技术卷I
- 【读过的书,留下的迹】高性能MySQL(第3版)
- 【读过的书,留下的迹】操作系统精髓与设计原理
- 【读过的书,留下的迹】MySQL技术内幕-InnoDB存储引擎
- 读《深入剖析TOMCAT》
- 《深入剖析Tomcat 》第4章 tomcat的默认连接器
- 深入剖析tomcat(一)--一个简单的web服务器
- (149)环境立方体贴图
- lintcode(139)最接近零的子数组和
- 一张图理清楚关系型/非关系型数据库与Elasticsearch同步
- Android -- 系统网络时间更新NetworkTimeUpdateService服务解析
- linux驱动开发之字符设备--私有数据和container_of
- 【读过的书,留下的迹】深入剖析Tomcat
- Android开发之轮播图广告的实现
- LabVIEW状态机
- 搜索-D
- Java冒泡排序代码详解
- linux tree命令--显示目录的树形结构
- 抽象类的实例化问题
- Shell编程相关知识整理
- Java io 流的理解