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. 关于smarty的一些个人笔记

    注释为{注释} 注意下面代码中<%extends file="路径"%>和<%widget name="路径"%>这两个路径中的区别 c ...

  2. AX2012 引用NOPI 添加图片到EXCEL

    void AddPieChart(int rowNum = 4) { System.Byte[] bytes; fileName _fileName; NPOI.HSSF.UserModel.HSSF ...

  3. GoLang几种读文件方式的比较

    GoLang提供了很多读文件的方式,一般来说常用的有三种.使用Read加上buffer,使用bufio库和ioutil 库. 那他们的效率如何呢?用一个简单的程序来评测一下: package main ...

  4. JMeter学习-034-JMeter调试工具之一---HTTP Mirror Server

    通常,编程工具IDE都提供了相应的调试模块,供开发者使用,以便更快速的定位问题所在.那么在JMeter编写测试脚本的过程中,JMeter都提供了哪些调试工具供我们使用呢? JMeter常用的调试工具有 ...

  5. java.util.concurrent.atomic 包详解

    Atomic包的作用: 方便程序员在多线程环境下,无锁的进行原子操作 Atomic包核心: Atomic包里的类基本都是使用Unsafe实现的包装类,核心操作是CAS原子操作 关于CAS compar ...

  6. Smokeping安装教程

    Smokeping安装教程 #Smokeping2.6.8安装教程 #2016.3.6 改编v1.0 #Linux运维技术交流 347163978   环境 CentOS release 6.4 (F ...

  7. SQL性能优化

    引言: 以前在面试的过程中,总有面试官问道:你做过sql性能优化吗?对此,我的答复是没有.一次没有不是自己的错误,两次也不是,但如果是多次呢?今天痛下决心,把有关sql性能优化的相关知识总结一下,以便 ...

  8. jira任务批量操作示例

    1. 获取jira任务编号 使用字段提取工具获取编号,如WQBNEWSDLDL-347,WQBNEWSDLDL-348: 字段提取正则表达式:(?<2>[\[[](?<1>[A ...

  9. lua unit test introduction

    Unit Test Unit testing is about testing your code during development, not in production. Typically y ...

  10. DNS CNAME的一些细节

    1, 概述 DNS中的CNAME可以减轻运维压力,使得已有的DNS配置具有一定的灵活性和可扩展性.本文对CNAME中的一些细节做阐述, 使DNS服务器的运维人员和开发人员能合理地使用CNAME. 2, ...