Tomcat的结构
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件事情:
- 定义了LifecycleEvent事件的type属性
- 定义了三个管理监听器的方法addLifecycleListener、findLifecycleListeners和removeLifecycleListener
- 定义了4个生命周期的方法:init、start、stop和destroy,用于执行生命周期的各个阶段的操作
- 定义了获取当前状态的两个方法: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管道来处理的,采用的是责任链模式实现的,但有稍微的不同:
- 每个Pipeline都有特定的Value,而且是在管道的最后一个执行,这个Value叫BaseValue,BaseValue是不可以删除的
- 在上层容器的管道的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的结构的更多相关文章
- Tomcat目录结构及Tomcat Server处理一个http请求的过程
http://blog.sina.com.cn/s/blog_62cb15980101jh9x.html 1.Tomcat的结构概述 Tomcat服务器是由一系列可配置的组件构成,其核心组件是 ...
- 【转】Tomcat总体结构(Tomcat源代码阅读系列之二)
本文是Tomcat源代码阅读系列的第二篇文章,我们在本系列的第一篇文章:在IntelliJ IDEA 和 Eclipse运行tomcat 7源代码一文中介绍了如何在intelliJ IDEA 和 Ec ...
- Tomcat——目录结构
Tomcat目录结构:1. 一级目录 bin ——Tomcat执行脚本目录conf ——Tomcat配置文件lib ——Tomcat运行需要的库文件(JARS)logs ——Tomcat执行时的LOG ...
- tomcat目录结构以及项目部署
摘要:tomcat的目录结构 tomcat是一个轻量级的免费开源的web服务器,使用非常方便,也是最普遍的一款优秀服务器. 一.tomcat目录结构 1.官方下载 http://tomcat.apa ...
- [转帖]Tomcat目录结构详解
Tomcat目录结构详解 https://www.cnblogs.com/veggiegfei/p/8474484.html 之前应该是知道一点 但是没有这么系统 感谢原作者的描述. 1.bin: 该 ...
- [svc]tomcat目录结构/虚拟主机/nginx反向代理cache配置
tomcat目录文件 /usr/local/tomcat/bin/catalina.sh stop sleep 3 /usr/local/tomcat/bin/catalina.sh start to ...
- Tomcat 总体结构
一.Tomcat 总体结构 1.Server(服务器)是Tomcat构成的顶级构成元素,所有一切均包含在Server中,Server的实现类StandardServer可以包含一个到多个Service ...
- Tomcat 目录结构以及相关规范的介绍
目录 安装tomcat tomcat目录结构 tomcat/bin目录 tomcat/conf目录 tomcat/logs目录 JavaEE对项目结构的规范 war包 安装Tomcat 参考:安装Ja ...
- Tomcat目录结构
首先来了解一下Tomcat5.5的目录结构: /bin:存放windows或Linux平台上启动和关闭Tomcat的脚本文件 /conf:存放Tomcat服务器的各种全局配置文件,其中包括server ...
- Tomcat【介绍Tomcat、结构目录、虚拟目录、临时域名、虚拟主机、体系结构】
什么是Tomcat Tomcat简单的说就是一个运行JAVA的网络服务器,底层是Socket的一个程序,它也是JSP和Serlvet的一个容器. 为什么我们需要用到Tomcat 如果你学过html,c ...
随机推荐
- 面试官:线程池如何按照core、max、queue的执行循序去执行?(内附详细解析)
前言 这是一个真实的面试题. 前几天一个朋友在群里分享了他刚刚面试候选者时问的问题:"线程池如何按照core.max.queue的执行循序去执行?". 我们都知道线程池中代码执行顺 ...
- TensorFlow从0到1之TensorFlow csv文件读取数据(14)
大多数人了解 Pandas 及其在处理大数据文件方面的实用性.TensorFlow 提供了读取这种文件的方法. 前面章节中,介绍了如何在 TensorFlow 中读取文件,本节将重点介绍如何从 CSV ...
- (二)用testng的groups管理用例
原文链接:https://www.cnblogs.com/Jourly/p/7002096.html 一.需求: 测试时经常有两种场景,第一种是冒烟测试的小部分用例:一类是全部用例. 二.针对第一种运 ...
- (二)JavaMail创建包含内嵌图片的邮件
链接:https://blog.csdn.net/qq_41151659/article/details/96475739 代码如下: import com.sun.mail.util.MailSSL ...
- cb31a_c++_STL_算法_查找算法_(4)find_first_of
cb31a_c++_STL_算法_查找算法_(4)find_first_offind_first_of(b,e,sb,se),sb,second begin, se,second end();find ...
- react 的一个插件
Reactjs code snippets (vs code 编辑器里面的一个插件 支持 react 得简写) rcc 和 rfc 可以快速生成react代码 下面网址是个re ...
- PHP利用FTP上传文件连接超时之开启被动模式解决方法
初始代码: <?php $conn = ftp_connect("localhost") or die("Could not connect"); ftp ...
- Flask02-Template
## 基础使用 $ vim app/templates/index.html > <html> > <head> > <title>{{title ...
- 弹性盒模型中flex-grow 和flex的区别
在flex弹性盒模型体系中,flex-grow和flex都有对子元素进行放大的作用,但是这两个属性在放大时的计算方法不同,在使用时候要注意,使用正确的放大属性,从而达到自己想要的效果. 先来看下两个属 ...
- Day12-微信小程序实战-交友小程序-搭建服务器与上传文件到后端
要搞一个小型的cms内容发布系统 因为小程序上线之后,直接对数据库进行操作的话,慧出问题的,所以一般都会做一个管理系统,让工作人员通过这个管理系统来对这个数据库进行增删改查 微信小程序其实给我们提供了 ...