这段时间简单的看了一下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源码分析(一)的更多相关文章

  1. tomcat源码分析(三)一次http请求的旅行-从Socket说起

    p { margin-bottom: 0.25cm; line-height: 120% } tomcat源码分析(三)一次http请求的旅行 在http请求旅行之前,我们先来准备下我们所需要的工具. ...

  2. [Tomcat 源码分析系列] (二) : Tomcat 启动脚本-catalina.bat

    概述 Tomcat 的三个最重要的启动脚本: startup.bat catalina.bat setclasspath.bat 上一篇咱们分析了 startup.bat 脚本 这一篇咱们来分析 ca ...

  3. Tomcat源码分析

    前言: 本文是我阅读了TOMCAT源码后的一些心得. 主要是讲解TOMCAT的系统框架, 以及启动流程.若有错漏之处,敬请批评指教! 建议: 毕竟TOMCAT的框架还是比较复杂的, 单是从文字上理解, ...

  4. Tomcat源码分析之—具体启动流程分析

    从Tomcat启动调用栈可知,Bootstrap类的main方法为整个Tomcat的入口,在init初始化Bootstrap类的时候为设置Catalina的工作路径也就是Catalina_HOME信息 ...

  5. Tomcat源码分析--转

    一.架构 下面谈谈我对Tomcat架构的理解 总体架构: 1.面向组件架构 2.基于JMX 3.事件侦听 1)面向组件架构 tomcat代码看似很庞大,但从结构上看却很清晰和简单,它主要由一堆组件组成 ...

  6. tomcat 源码分析

    Tomcat源码分析——Session管理分析(下)    Tomcat源码分析——Session管理分析(上)     Tomcat源码分析——请求原理分析(下)     Tomcat源码分析——请 ...

  7. Tomcat源码分析——Session管理分析(下)

    前言 在<TOMCAT源码分析——SESSION管理分析(上)>一文中我介绍了Session.Session管理器,还以StandardManager为例介绍了Session管理器的初始化 ...

  8. Tomcat源码分析——Session管理分析(上)

    前言 对于广大java开发者而已,对于J2EE规范中的Session应该并不陌生,我们可以使用Session管理用户的会话信息,最常见的就是拿Session用来存放用户登录.身份.权限及状态等信息.对 ...

  9. Tomcat源码分析——请求原理分析(下)

    前言 本文继续讲解TOMCAT的请求原理分析,建议朋友们阅读本文时首先阅读过<TOMCAT源码分析——请求原理分析(上)>和<TOMCAT源码分析——请求原理分析(中)>.在& ...

  10. Tomcat源码分析——请求原理分析(中)

    前言 在<TOMCAT源码分析——请求原理分析(上)>一文中已经介绍了关于Tomcat7.0处理请求前作的初始化和准备工作,请读者在阅读本文前确保掌握<TOMCAT源码分析——请求原 ...

随机推荐

  1. Flume使用说明

    关于Flume,官方定义如下: Apache Flume is a distributed, reliable, and available system for efficiently collec ...

  2. Angular2 Service实践——实现简单音乐播放服务

    引言: 如果说组件系统(Component)是ng2应用的躯体,那把服务(Service)认为是流通于组件之间并为其带来生机的血液再合适不过了.组件间通信的其中一种优等选择就是使用服务,在ng1里就有 ...

  3. 从源码解析LinkedList集合

         上篇文章我们介绍了ArrayList类的基本的使用及其内部的一些方法的实现原理,但是这种集合类型虽然可以随机访问数据,但是如果需要删除中间的元素就需要移动一半的元素的位置,效率低下.并且它内 ...

  4. 【转】jqGrid学习之安装

    jqGrid安装很简单,只需把相应的css.js文件加入到页面中即可. 按照官网文档: /myproject/css/             ui.jqgrid.css             /u ...

  5. Jsp——response对象

    <%@ page language="java" contentType="text/html; charset=UTF-8" import=" ...

  6. sql decimal & float & celling 介绍

    decimal 可以用在指定几个位数比如 123.456, decimal(3,3), 用这类型计算比较准确. 默认情况下,将数字转换为较低精度和小数位数的 decimal 或 numeric 值时, ...

  7. 探究CSS中的包裹性

    之前一直都知道css中的部分元素具有包裹性,今天写博客的时候正好也遇到了一个,所以想总结一下,有错误的地方欢迎指出来. 什么是包裹性? 包裹性就是父元素的宽度会收缩到和内部元素宽度一样. 哪些元素具有 ...

  8. Kindle电子阅读器收不到个人文档推送解决方案

    最近我的 kindle 固件版本更新到 5.8.7.0.1 ,发现增加了生字注音功能,瞬间变成小学生阅读神器有木有,不过,这个功能可以隐藏.显示,看着碍眼隐藏即可,还可以减少和增加生字注音.感觉对于经 ...

  9. 程序员的自我修养:高效使用Google解决问题

    如果票选近二十年最伟大的发明,我相信搜索引擎肯定会占据一个不容小觑的位置,它不单是一项发明,更是一项成就,最大程度消灭了信息的不平等.既然人人都可以接触到海量的信息,那么衡量信息财富多寡就只剩下技巧这 ...

  10. JAVA学习之动态代理

    JDK1.6中的动态代理 在Java中Java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过使用这个类和接口可以生成一个动态代理对象.JDK提供 ...