这段时间简单的看了一下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. stringBuffer的使用及字符串比较的区别

    /* * 关于equals()和==: 对于String简单来说就是比较两字符串的Unicode序列是否相当,如果相等返回true; * 而==是比较两字符串的地址是否相同,也就是是否是同一个字符串的 ...

  2. Kickstart Practice Round 2017 Google

    Problem B. Vote A and B are the only two candidates competing in a certain election. We know from po ...

  3. linux目录结构解析

    "/" :Linux文件系统的入口.也是最高一级的目录. "/bin":基本系统所需要的命令,功能和"/usr/bin"类似,这个目录下的文 ...

  4. STL源码剖析(读书笔记)

    STL迭代器种类 2. 迭代器型别使用范例: 3. SGI STL空间配置器分为两级: 4. Vector 的内部存储方式为数组,随机访问迭代器. 5. Vector的size获取方式: 6. Vec ...

  5. angular ui-router 正则

    {id:[0-9a-fA-F]{1,8}} 如果在找ui-router 时,会看到以上的正则 我解释一下 id是param,可以把必备的结果收起来 []里面的必配的正则,但只是给一个string {} ...

  6. 关于margin

    ----W3School -----margin CSS 边距属性定义元素周围的空间.通过使用单独的属性,可以对上.右.下.左的外边距进行设置.也可以使用简写的外边距属性同时改变所有的外边距. 这个简 ...

  7. 从0移植uboot (二) _uboot启动流程分析

    经过了上一篇的配置,我们已经执行make就可以编译出一个uboot.bin,但这还不够,首先,此时的uboot并不符合三星芯片对bootloader的格式要求,同时,此时的uboot.bin也没有结合 ...

  8. Javascript中好用更改时间的方法

    <script type="text/javascript"> //格式化时间格式的字符串 String.prototype.myTimes = function () ...

  9. hdoj 1257 DP||贪心

    最少拦截系统 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  10. leetcode HouseRobber Dp Code

    #include <malloc.h> int MAX(int x,int y){ return x>y?x:y;} int rob(int* nums, int numsSize) ...