Tomcat其实就是一个容器,最顶层的容器叫Server,代表整个服务器,Server中包含至少一个Service,用于具体提供服务。Service主要包含两部分:Connector和Container。一个Service只有一个Container,但可以有多个Connectors(因为一个服务可以有多个连接,如同时有提供http和https连接,也可以提供相同协议不同端口的连接)。Catalina是整个Tomcat的管理类,它里面有三个方法load、start、stop分别用来管理整个服务器的生命周期,load方法用于根据conf/server.xml文件创建Server并调用Server的init方法进行初始化,start方法用于启动服务器,stop方法用于停止服务器,start和stop方法在内部分别调用了Server的start和stop方法,load方法内部调用了Server的init方法,这三个方法都会按容器的结构逐层调用相应的方法,比如,Server的start方法中会调用所有Service中的start方法,Service中的start方法又会调用所有包含的Connectors和Container的start方法,这样整个服务器就启动了,init和stop方法也是一样的,这就是Tomcat生命周期的管理方式。Catalina还有一个很重要的方法await,直接调用Server的await方法,这个方法的作用是进入一个循环,让主线程不会退出。Tomcat的main方法并不在Catalina类里,而是在Bootstrap中,这样做的好处是可以把启动的入口和具体的管理类分开,从而可以很方便地创建出多种启动方式。

Lifecycle接口用来管理生命周期,所有的生命周期组件都要实现该接口。一个做了4件事情:

  1. 定义了LifecycleEvent事件的type属性
  2. 定义了三个管理监听器的方法addLifecycleListener、findLifecycleListeners和removeLifecycleListener
  3. 定义了4个生命周期的方法:init、start、stop和destroy,用于执行生命周期的各个阶段的操作
  4. 定义了获取当前状态的两个方法:getState和getStateName

Container用于封装和管理Servlet,以及具体 处理request请求。

Container是Tomcat中容器的接口,通常使用的Servlet就封装在其子接口Wrapper中。Container一共有4个子接口Engine、Host、Context、Wrapper和一个默认实现 的ContainerBase,每一个子接口都是一个容器,这4个子容器都有一个对应的StandardXXX实现类,并且这些实现类都继承ContainerBase类。另外Container还继承Lifecycle接口,而且ContainerBase间接继承LifecycleBase,所以Engine、Host、Context、Wrapper都符合Tomcat的生命周期管理模式。

Container的子容器Engine、Host、Context、Wrapper是逐层包含的关系,其中Engine是最顶层,每个Service最多只能有一个Engine,Engine里面可以有多个Host,每个Host下可以有多个Context,每个Context下可以有多个Wrapper。

  • Engine:引擎,用来管理多个站点,一个Service最多只能有一个Engine。
  • Host:代表一个站点,也可以叫虚拟主机,通过配置Host就可以添加站点。
  • Context:代表一个应用程序,对应着平时开发的一套程序,或者一个WEB-INF目录以及下面的web.xml文件。
  • Wrapper:每个Wrapper封装着一个Servlet。

Pipeline-Value管道

Container处理请求是使用Pipeline-Value管道来处理的,采用的是责任链模式实现的,但有稍微的不同:

  1. 每个Pipeline都有特定的Value,而且是在管道的最后一个执行,这个Value叫BaseValue,BaseValue是不可以删除的
  2. 在上层容器的管道的BaseValue中会调用下层容器的管道。

Connector用于处理连接相关的事情,并提供Socket与request、response的转换。

Connector是用ProtocolHandler来处理请求的,不同的ProtocolHandler代表不同的连接类型,ProtocolHandler里面有3个非常重要的组件:Endpoint、Processor和Adapter。Endpoint用于处理底层Socket的网络连接,Processor用于将Endpoint接收到的Socket封装成Request,Adapter用于将封装好的Request交给Container进行具体处理。也就是说Endpoint用来实现TCP/IP协议,Processor用来实现HTTP协议,Adapter将请求适配到Servelet容器进行具体处理。

  • Endpoint的抽象实现AbstractEndpoint里面定义的Acceptor和AsyncTimeout两个内部类和一个Handler接口。Acceptor用于监听请求,AsyncTimeout用于检查异步request的超时,Handler用于处理接收到的Socket,在内部调用了Processor进行处理
  • Processor的porcess方法中会调用Adapter的service方法来处理请求。
  • Adapter的service方法主要是调用Container管道中的invoke方法来处理请求。

Tomcat的结构的更多相关文章

  1. Tomcat目录结构及Tomcat Server处理一个http请求的过程

    http://blog.sina.com.cn/s/blog_62cb15980101jh9x.html 1.Tomcat的结构概述     Tomcat服务器是由一系列可配置的组件构成,其核心组件是 ...

  2. 【转】Tomcat总体结构(Tomcat源代码阅读系列之二)

    本文是Tomcat源代码阅读系列的第二篇文章,我们在本系列的第一篇文章:在IntelliJ IDEA 和 Eclipse运行tomcat 7源代码一文中介绍了如何在intelliJ IDEA 和 Ec ...

  3. Tomcat——目录结构

    Tomcat目录结构:1. 一级目录 bin ——Tomcat执行脚本目录conf ——Tomcat配置文件lib ——Tomcat运行需要的库文件(JARS)logs ——Tomcat执行时的LOG ...

  4. tomcat目录结构以及项目部署

    摘要:tomcat的目录结构 tomcat是一个轻量级的免费开源的web服务器,使用非常方便,也是最普遍的一款优秀服务器. 一.tomcat目录结构 1.官方下载  http://tomcat.apa ...

  5. [转帖]Tomcat目录结构详解

    Tomcat目录结构详解 https://www.cnblogs.com/veggiegfei/p/8474484.html 之前应该是知道一点 但是没有这么系统 感谢原作者的描述. 1.bin: 该 ...

  6. [svc]tomcat目录结构/虚拟主机/nginx反向代理cache配置

    tomcat目录文件 /usr/local/tomcat/bin/catalina.sh stop sleep 3 /usr/local/tomcat/bin/catalina.sh start to ...

  7. Tomcat 总体结构

    一.Tomcat 总体结构 1.Server(服务器)是Tomcat构成的顶级构成元素,所有一切均包含在Server中,Server的实现类StandardServer可以包含一个到多个Service ...

  8. Tomcat 目录结构以及相关规范的介绍

    目录 安装tomcat tomcat目录结构 tomcat/bin目录 tomcat/conf目录 tomcat/logs目录 JavaEE对项目结构的规范 war包 安装Tomcat 参考:安装Ja ...

  9. Tomcat目录结构

    首先来了解一下Tomcat5.5的目录结构: /bin:存放windows或Linux平台上启动和关闭Tomcat的脚本文件 /conf:存放Tomcat服务器的各种全局配置文件,其中包括server ...

  10. Tomcat【介绍Tomcat、结构目录、虚拟目录、临时域名、虚拟主机、体系结构】

    什么是Tomcat Tomcat简单的说就是一个运行JAVA的网络服务器,底层是Socket的一个程序,它也是JSP和Serlvet的一个容器. 为什么我们需要用到Tomcat 如果你学过html,c ...

随机推荐

  1. c printf(“%d”,变量)函数

  2. 让人又爱又恨的Lombok,到底该不该用

    1 简介 Lombok,印尼的一个岛屿,龙目岛.但在Java的世界里,它是一个方便的类库,能提供很多便利,因此得到许多人的青睐.但也有不少反对声音.这是为什么呢? 之前去龙目岛拍的日落. 2 Lomb ...

  3. numpy中数组(矩阵)的乘法

    我们知道在处理数据的时候,使用矩阵间的运算将会是方便直观的.matlab有先天的优势,算矩阵是它的专长.当然我们用python,经常要用到的可能是numpy这个强大的库. 矩阵有两种乘法,点乘和对应项 ...

  4. OS_进程调度:C++实现

    实验二.进程调度模拟实验 一.实验目的: 本实验模拟在单处理机环境下的处理机调度,帮助理解进程调度的概念,深入了解进程控制块的功能,以及进程的创建.撤销和进程各个状态间的转换过程. 二.实验内容: 进 ...

  5. c#,pagerank算法实现一

    PageRank让链接来"投票" 一个页面的“得票数”由所有链向它的页面的重要性来决定,到一个页面的超链接相当于对该页投一票.一个页面的PageRank是由所有链向它的页面(“链入 ...

  6. 为什么用抓包工具看HTTPS包是明文的

    测试或者开发调试的过程中,经常会进行抓包分析,并且装上抓包工具的证书就能抓取 HTTPS 的数据包并显示.由此就产生了一个疑问,为什么抓包工具装上证书后就能抓到 HTTPS 的包并显示呢?不是说 HT ...

  7. Java | 静态嵌套类(Static Nested Class)

    前言 本文内容主要来自 Java 官方教程中的<嵌套类>章节. 本文提供的是 JDK 14 的示例代码. 定义 静态嵌套类(Static Nested Class),是 Java 中对类的 ...

  8. JavaWeb网上图书商城完整项目-CommonUtils(1生成uuid,2Map转换成JavaBean)

    java工程中添加上面的jar包 CommonUtils类就两个方法: l  String uuid():生成长度32的随机字符,通常用来做实体类的ID.底层使用了UUID类完成: l  T toBe ...

  9. springboot @Cacheable 基本使用

    加入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sp ...

  10. js基础练习题(2)

    5.函数 1.按要求封装两个函数 1.封装一个函数,要求输入字符串转化成数组弹出 2.封装一个函数,要求能求出三个数中的最小值,注意:不准使用js内置函数 2.封装一个函数,求参数的和,注意:参数不固 ...