Tomcat源码分析(一)
这段时间简单的看了一下Tomcat的源码,在这里做个笔记!
1. tomcat 架构图

Catalina: tomcat的顶级容器,main()方法中就是通过,创建Catalina 对象实例,来启动或者关闭 tomcat;
Server: 是管理tomcat所有组件的容器,包含一个或多个的service;
Service: Service是包含Connector和Container的集合,Service用适当的Connector接收用户的请求,再发给相应的Container来处理;
Connector: 主要功能是 ◇socket的接收 ◇根据协议类型处理socket ◇封装相应的request和response,交给Container;
Container: Engine容器接收来自Connector的请求,并且通过Pipeline依次传递给子容器的Pipeline;
Engine: 在Engine的Pipeline中的Valve的invoke方法中,根据request.getHost()来定位下一个host;
Host: 一个Web服务器虚拟机,管理着具体的 web application;
Context: 就是我们所部属的具体Web应用的上下文,每个请求都是在具体的上下文中处理;
Wrapper:对应着Web的每一个 Servlet;
接下来,主要学习tomcat中的两个最主要的容器,Connector和Container容器。
2. Connector容器
Connector容器主要解决的问题就是Socket的接收,为了能够很好的处理各种协议和并发异步接收,Connector加入了两个组件 ProtocolHandler和EndPoint。
ProtocolHandler的主要作用就是根据各个协议的定义按照一定的格式句分析协议头,封装成request和response对象;
AbstractEndPoint 致力于高并发的解决socket的接收和处理;
2.1 AbstractEndPoint
EndPoint 中两个协同合作的Runnable:
(1) Accepter负责用ServerSocket.accept()来接收客户请求,并且把建立连接之后的Socket交由Poller处理;
(2) Poller负责接收请求,并处理;
protected class Acceptor extends AbstractEndpoint.Acceptor (Acceptor implements Runnable) public class Poller implements Runnable
Accepter和Poller的具体写作示意图(个人拙见)

从上图中,我们可以发现,Acceptor接收到一个用户的socket请求之后,将这个Socket封装成PollerEvent,放入events队列中。Poller实际上,一直while(true),当执行events队列中有PollerEvent的时候,就会从自己的Selector中获取到一个有数据的Channel,交给ProcessKey()处理。
2.1 ProtocolHandler
每一种协议都有各自具体定义,和具体的协议头的格式,那么我么在接收到客户请求之后,就应该根据协议的类型采用相应的解析方法。
ProtocolHandler的具体作用:
◆ 定义具体处理Socket的AbstractEndPoint;
◆ 提供解析请求的AbstractConnectionHandler来获取具体的协议头;
◆ 相关的init、start、stop方法
【参考文献】
[1] http://blog.csdn.net/cutesource/article/details/5006062
[2] http://blog.csdn.net/yanlinwang/article/details/45648039
Tomcat源码分析(一)的更多相关文章
- tomcat源码分析(三)一次http请求的旅行-从Socket说起
p { margin-bottom: 0.25cm; line-height: 120% } tomcat源码分析(三)一次http请求的旅行 在http请求旅行之前,我们先来准备下我们所需要的工具. ...
- [Tomcat 源码分析系列] (二) : Tomcat 启动脚本-catalina.bat
概述 Tomcat 的三个最重要的启动脚本: startup.bat catalina.bat setclasspath.bat 上一篇咱们分析了 startup.bat 脚本 这一篇咱们来分析 ca ...
- Tomcat源码分析
前言: 本文是我阅读了TOMCAT源码后的一些心得. 主要是讲解TOMCAT的系统框架, 以及启动流程.若有错漏之处,敬请批评指教! 建议: 毕竟TOMCAT的框架还是比较复杂的, 单是从文字上理解, ...
- Tomcat源码分析之—具体启动流程分析
从Tomcat启动调用栈可知,Bootstrap类的main方法为整个Tomcat的入口,在init初始化Bootstrap类的时候为设置Catalina的工作路径也就是Catalina_HOME信息 ...
- Tomcat源码分析--转
一.架构 下面谈谈我对Tomcat架构的理解 总体架构: 1.面向组件架构 2.基于JMX 3.事件侦听 1)面向组件架构 tomcat代码看似很庞大,但从结构上看却很清晰和简单,它主要由一堆组件组成 ...
- tomcat 源码分析
Tomcat源码分析——Session管理分析(下) Tomcat源码分析——Session管理分析(上) Tomcat源码分析——请求原理分析(下) Tomcat源码分析——请 ...
- Tomcat源码分析——Session管理分析(下)
前言 在<TOMCAT源码分析——SESSION管理分析(上)>一文中我介绍了Session.Session管理器,还以StandardManager为例介绍了Session管理器的初始化 ...
- Tomcat源码分析——Session管理分析(上)
前言 对于广大java开发者而已,对于J2EE规范中的Session应该并不陌生,我们可以使用Session管理用户的会话信息,最常见的就是拿Session用来存放用户登录.身份.权限及状态等信息.对 ...
- Tomcat源码分析——请求原理分析(下)
前言 本文继续讲解TOMCAT的请求原理分析,建议朋友们阅读本文时首先阅读过<TOMCAT源码分析——请求原理分析(上)>和<TOMCAT源码分析——请求原理分析(中)>.在& ...
- Tomcat源码分析——请求原理分析(中)
前言 在<TOMCAT源码分析——请求原理分析(上)>一文中已经介绍了关于Tomcat7.0处理请求前作的初始化和准备工作,请读者在阅读本文前确保掌握<TOMCAT源码分析——请求原 ...
随机推荐
- PAT乙级 1065. 单身狗(25) by Python
1065. 单身狗(25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue "单身狗"是中文对 ...
- javase基础回顾(一)ArrayList深入解析 解读ArrayList源代码(JDK1.8.0_92)
我们在学习这一块内容时需要注意的一个问题是 集合中存放的依然是对象的引用而不是对象本身. List接口扩展了Collection并声明存储一系列元素的类集的特性.使用一个基于零的下标,元素可以通过它们 ...
- Python thread local
由于GIL的原因,笔者在日常开发中几乎没有用到python的多线程.如果需要并发,一般使用多进程,对于IO Bound这种情况,使用协程也是不错的注意.但是在python很多的网络库中,都支持多线程, ...
- HL-340编译驱动
make -C /lib/modules/3.4.39/build SUBDIRS=/home/linaro/Desktop/ch341_drv modulesmake: *** /lib/modul ...
- BZOJ 2456: mode(乱搞)
挺神奇的一道题,被1M内存坑了好久= =,这道题得记录当前众数以及众数与其他数的差,如果现在读入的这个数与众数相等,就加1,否则减一,如果差为0就替代掉他,可以证明如果众数存在的话这样一定能找出来 C ...
- oracle按某个字段分组然后从每组取出最大的一条纪录
需求:查询各个设备存在未消缺的缺陷,取缺陷等级最高的,作为这个设备当前的缺陷等级: 数据源: select t.device_id, t.defect_level from sp_pd_defect ...
- [Hadoop] - Protocol Buffer安装
Hadoop从2.x版本开始,底层的RPC远程调用使用ProtocolBuffer格式来传递数据,所以在编译Hadoop的过程中有可能出现提示缺少Protocol服务的异常信息,类似:'protoc ...
- 第三方库AFNetworking 3.1.0的简单使用
AFNetworking是一个 在iOS开发中 使用非常多网络开源库.它是一个轻量级的网络请求API类库. 适用于iOS以及Mac OS X.它构建于在(Apple iOS开发文档) NSURLCon ...
- 计算机程序的思维逻辑 (70) - 原子变量和CAS
从本节开始,我们探讨Java并发工具包java.util.concurrent中的内容,本节先介绍最基本的原子变量及其背后的原理和思维. 原子变量 什么是原子变量?为什么需要它们呢? 在理解synch ...
- angular2入门,就这一篇就够了
背景与概念: AngularJS2 是一款开源JavaScript库,由Google维护,用来协助单一页面应用程序运行. AngularJS2 是 Angular 1.x 的升级版本,性能上得到显著的 ...