p { margin-bottom: 0.25cm; line-height: 120% }

catalina下还定义了tomcat容器(server,service,engine,host,context)的接口。其中对接口的实现也在该包下,org.apache.catalina.core下。包括tomcat管道机制,各个wraper的实现也在这个包下,因此这也是tomcat最为核心东一个包。

我们再来看下connector,见名知意,这个包是负责处理请求的,最终请求会进入到这个包下的CoyoteAdapter中service方法来处理。

我们继续来说下coyote这个包,这个包偏底层一些,其会对socket传输来的数据进行包装,然后再转给实现来Adapter接口的类,其中具体实现也是由catalina下的CoyoteAdapter来实现,这个包下主要是对TCP/IP传输来东数据进行处理,其由两种实现方式,一种是采用ajp协议,另外一种则是采用http协议,简单来说,这个包就是把TCP/IP(通过Socket)层传输来的对象进行包装,包装为ajp或者http的对象,然后转发到catalina下的connector中进行处理。

接下来我们简单对tomcat这个包做下分析,其中核心在于util包下,其中threads包下是tomcat对线程池做了自己的扩展(在Executor框架基础上)。其中最核心的地方在于net包下,这个包是真正来出来网络的,即请求过来会首先来到这个包下(注意:现在还是处于TCP/IP层面上并没有到来http层面),其中JIOEndpoint也是由我们核心去分析的,该类是实际处理Socket请求,其中如何接受请求并将请求转到工作线程去处理都是在这个包下来实现。

说完了tomcat的代码package组织,我们继续来看看Tomcat的架构图,下图是我从网上搜到的一幅架构图,基本能完整的说明其架构。

  我们开始详细来说明一下Tomcat的各个结构。在这张架构图中我们看到了tomcat的容器机构,其最大的容器为server,server下包含1至N个service容器,service容器下又包含1至N个Engine容器,Engine容器下则包含1至N个Host容器(Host即对应我们的域名),同样,Host容器则包含1至N个Context容器(Context也就是我们通常的JavaWeb应用)。在实际生成环境中,我们通常只会有一个Server容器,一个Service容器,一个Engine容器,但经常会有多个Host容器,多个Context容器(往往也是一个Host下只有一个Context),尤其是在分布式的环境下,往往是多个Host容器。在这里还要特殊说明一下Connector,Connector是在Service容器之中,tomcat默认会配置两个Connector,一个Connector是负责处理http协议,另一个Connector则是负责处理tomcat自身的一种协议ajp,后续我们会对http协议的Connector作为详细阐述。

  凡是用过Tomcat的开发者一定也会对tomcat下conf文件夹中的server.xml文件有一定的了解。其server.xml大致如下。其中server.xml的最大的父节点是server,该server其接口规范是由org.apache.catalina.Server这个接口定义,其具体实现由org.apache.catalina.core.StandardServer实现,在后续的文章中我们会对其进行具体阐述。同理,Engine、Host、Context容器也在org.apache.catalina该包下有其特定的接口规范,其实现都在org.apache.catalina.core这个包下。

p { margin-bottom: 0.25cm; line-height: 120% }

下一节我们会对Tomcat的父子容器进行具体的阐述。

tomcat源码分析(一)从tomcat架构说起的更多相关文章

  1. Tomcat源码分析三:Tomcat启动加载过程(一)的源码解析

    Tomcat启动加载过程(一)的源码解析 今天,我将分享用源码的方式讲解Tomcat启动的加载过程,关于Tomcat的架构请参阅<Tomcat源码分析二:先看看Tomcat的整体架构>一文 ...

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

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

  3. [Tomcat 源码分析系列] (一) : Tomcat 启动脚本-startup.bat

    概述 我们通常使用 Tomcat 中的 startup.bat 来启动 Tomcat. 但是这其中干了一些什么事呢? 大家都知道一个 Java 程序需要启动的话, 肯定需要 main 方法, 那么这个 ...

  4. Tomcat源码分析二:先看看Tomcat的整体架构

    Tomcat源码分析二:先看看Tomcat的整体架构 Tomcat架构图 我们先来看一张比较经典的Tomcat架构图: 从这张图中,我们可以看出Tomcat中含有Server.Service.Conn ...

  5. Tomcat源码分析--转

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

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

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

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

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

  8. Tomcat 源码分析(转)

    本文转自:http://blog.csdn.net/haitao111313/article/category/1179996 Tomcat源码分析(一)--服务启动 1. Tomcat主要有两个组件 ...

  9. Tomcat源码分析(二)------ 一次完整请求的里里外外

    Tomcat源码分析(二)------ 一次完整请求的里里外外   前几天分析了一下Tomcat的架构和启动过程,今天开始研究它的运转机制.Tomcat最本质就是个能运行JSP/Servlet的Web ...

随机推荐

  1. 移动端rem 适配

    在 index.html 中添加如下代码 <script> let html = document.documentElement; window.rem = html.getBoundi ...

  2. kaggle实战记录 =>Digit Recognizer

    date:2016-09-13 今天开始注册了kaggle,从digit recognizer开始学习, 由于是第一个案例对于整个流程目前我还不够了解,首先了解大神是怎么运行怎么构思,然后模仿.这样的 ...

  3. (转载)solr时区问题解决方案

    solr默认的使用的是utc格林尼治时间,与我们的GMT+8相差8个小时,网上好多解决办法是在自己应用中的时间上加8个小时和减8个小时做变换:或者不用date类型,改为long. 个人感觉这两个办法都 ...

  4. LuaSrcDiet工具介绍(lua源码处理软件)

    Diet Food Diet (nutrition), the sum of the food consumed by an organism or group Dieting, the delibe ...

  5. 阿里 otter搭建过程整理

    1 环境说明: 本机ip 192.168.8.3 虚拟机1 ip 192.168.8.5 虚拟机2 ip 192.168.8.6 虚拟机采取桥接模式 虚拟机系统为CentOS 2.6.32-279.e ...

  6. 自定义cell侧滑删除

    - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { return Y ...

  7. Android Activity 管理 (AppManager)(非原创)

    AppManager 类: /** * 应用程序Activity管理类:用于Activity管理和应用程序退出 *  */ public class AppManager {     private ...

  8. HTML5的postMessage使用记要////////////////////////////zzzzzzzz

    2014-11-09 20:17:27http://jo2.org/html5-js-postmessage-tips/--点击数:2710     HTML5提出了一个新的用来跨域传值的方法,即po ...

  9. Linux下man手册使用

    在 linux 环境下,为了查看一下 free 函数的原型,执行 man free 命令,发现显示结果为系统的 free 命令帮助,而不是库文件中的 free 函数帮助.查阅了一下,发现 man 的使 ...

  10. 机器学习实战4:Adaboost提升:病马实例+非均衡分类问题

    Adaboost提升算法是机器学习中很好用的两个算法之一,另一个是SVM支持向量机:机器学习面试中也会经常提问到Adaboost的一些原理:另外本文还介绍了一下非平衡分类问题的解决方案,这个问题在面试 ...