Tomcat学习笔记(2)- 整体架构
文章目录
- 1. Server组件
- 2. Service组件
- 3. Connector组件
- 4. Engine组件
- 5. Host组件
- 6. Context组件
- 7. Wrapper组件
- 8. 处理请求的整体过程
1. Server组件
Server是最顶级的组件,它代表Tomcat的运行实例,在一个JVM中只会包含一个Server。在Server的整个生命周期中,不同阶段会有不同的事情要完成。为了方便扩展,它引入了监听器方式,所以它也包含了Listener组件。另外,为了方便在Tomcat中集成JNDI,引入了GlobalNamingResources组件。同时,还包含了Service核心组件。
什么是JNDI?
JNDI(Java Naming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI服务供应接口(SPI)的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,使得Java应用程序可以和这些命名服务和目录服务之间进行交互。目录服务是命名服务的一种自然扩展。两者之间的关键差别是目录服务中对象不但可以有名称还可以有属性(例如,用户有email地址),而命名服务中对象没有属性 。
/*** A Server元素表示整个Catalina* servlet容器。其属性代表的特征servlet容器作为一个整体。一个Server可能包含*一个或多个Services,以及顶级命名集资源。通常,这个接口的实现也会实现* Lifecycle,这样当start()和* stop()方法被调用,所有已定义的Services也已启动或停止。*在这之间,实现必须打开一个服务器套接字端口号,由端口属性指定。当一个连接被接受时,读取第一行并与指定的关机命令进行比较。*如果命令匹配,服务器关闭启动。* 注意 -这个类的具体实现应该*用ServerFactory注册(单例)实例在构造函数中创建。*/
public interface Server extends Lifecycle {
2. Service组件
Service是服务的抽象,它代表请求从接收到处理的所有组件的集合。在设计上Server组件可以包含多个Service组件,每个Service组件都包含了若干用于接收客户端消息的Connector组件和处理请求的Engine组件。其中,不同的Connector组件使用不同的通信协议,如HTTP协议和AJP协议,当然还可以有其他的协议A和协议B。若干Connector组件和一个客户端请求处理组件Engine组成的集合即为Service。此外,Service组件还包含了若干Executor组件,每个Executor都是一个线程池,它可以为Service内所有组件提供线程池执行任务。
/**
* A Service是一个或多个服务的组
* Connectors共享一个Container
*处理传入的请求。这种安排允许,例如,
*非SSL和SSL连接器共享相同数量的web应用程序。
*给定的JVM可以包含任意数量的服务实例;然而,他们是
*彼此完全独立,只共享基本的JVM设施
*和系统类路径上的类。*/
public interface Service extends Lifecycle {
3. Connector组件
Connector主要的职责就是接收客户端连接并接收消息报文,消息报文经由它解析后送往容器中处理。如图4.3所示,因为存在不同的通信协议,例如HTTP协议、AJP协议等,所以我们需要不同的Connector组件,每种协议对应一个Connector组件,目前Tomcat包含HTTP和AJP两种协议的Connector。
Connector组件的内部实现也会根据网络I/O的不同方式而不同分为阻塞I/O和非阻塞I/O。
- BIO Connector结构
- NIO Connector结构
4. Engine组件
Tomcat内部有4个级别的容器,分别是Engine、Host、Context和Wrapper。
Engine代表全局Servlet引擎,每个Service组件只能包含一个Engine容器组件,但Engine组件可以包含若干Host容器组件。除了Host之外,它还包含如下组件。
- Listener组件:可以在Tomcat生命周期中完成某些Engine容器相关工作的监听器。
- AccessLog组件:客户端的访问日志,所有客户端访问都会被记录。
- Cluster组件:它提供集群功能,可以将Engine容器需要共享的数据同步到集群中的其他Tomcat实例上。
- Pipeline组件:Engine容器对请求进行处理的管道。
- Realm组件:提供了Engine容器级别的用户-密码-权限的数据对象,配合资源认证模块使用。
/**
* Engine是一个代表整个Catalina servlet的容器
*Engine。它在下列情况下是有用的:
您希望使用拦截器来查看每个单独的请求已处理整个Engine。
您希望运行Catalina与一个独立的HTTP连接器,但仍然
*希望支持多个虚拟主机。
*一般来说,你不会使用Engine部署卡特琳娜连接
*到web服务器(如Apache),因为连接器将有
*利用web服务器的功能来确定上下文(或
*甚至可能是哪个包装)应该被用来处理这个请求。
附加到Engine的子容器通常是实现host(表示虚拟主机)或上下文(表示个体)的
*一个单独的servlet上下文),取决于引擎实现。
*如果使用Engine,Engine总是Catalina的顶级容器
*层次结构。因此,实现的setParent()方法
*应该抛出IllegalArgumentException。*/
public interface Engine extends Container {
5. Host组件
Tomcat中Host组件代表虚拟主机,这些虚拟主机可以存放若干Web应用的抽象(Context容器)。
包含组件:
Listener组件,AccessLog组件, Cluster组件,Pipeline组件,Realm组件。
/**
* A Host是一个容器,它表示在
* Catalina servlet引擎。它在下列情况下是有用的:*您希望使用拦截器来查看每个单独的请求被处理
*由这个特定的虚拟Host。
*
您希望运行Catalina与一个独立的HTTP连接器,但仍然
*希望支持多个虚拟Host。*一般来说,你不会在部署Catalina connected时使用主机
*到web服务器(如Apache),因为连接器将有
*利用web服务器的功能来确定上下文(或
*甚至可能是哪个包装)应该被用来处理这个请求。*连接到主机的父容器通常是一个引擎,但也可能是
*是一些其他的实现,或者可能被省略,如果没有必要。附加到主机的子容器通常是实现
上下文的*(表示单个servlet上下文)*/
public interface Host extends Container {
6. Context组件
Context组件是Web应用的抽象,我们开发的Web应用部署到Tomcat后运行时就会转化成Context对象。它包含了各种静态资源、若干Servlet(Wrapper容器)以及各种其他动态资源。
包含组件:
Listener组件, AccessLog组件,Pipeline组件, Realm组件,Loader组件,Manager组件,NamingResource组件,Mapper组件,Wrapper组件。
/**
* A Context是一个表示servlet上下文的容器
因此,一个独立的web应用程序,在Catalina servlet引擎中。
因此,它在几乎所有的部署Catalina(即使a
连接到web服务器(如Apache)的连接器使用web服务器的
*识别处理此请求的适当包装器的功能。
*它还提供了一种方便的机制来使用see的拦截器
每个请求由这个特定的web应用程序处理。
附加到上下文的父容器通常是宿主,但也可能是宿主
*是一些其他的实现,或者可能被省略,如果没有必要。
附加到上下文的子容器通常是实现
包装器的*(表示单独的servlet定义)。*/
public interface Context extends Container, ContextBind {
7. Wrapper组件
Wrapper容器是Tomcat中4个级别的容器中最小的,与之相对应的是Servlet,一个Wrapper对应一个Servlet。
它包含:
- Servlet组件:Servlet即Web应用开发常用的Servlet,我们会在Servlet中编写好请求的逻辑处理。
- ServletPool组件:Servlet对象池,当Web应用的Servlet实现了SingleThreadModel接口时则会在Wrapper中产生一个Servlet对象池。线程执行时,需先从对象池中获取到一个Servlet对象,ServletPool组件能保证Servlet对象的线程安全。
- Pipeline组件:Wrapper容器对请求进行处理的管道。
/**
* A Wrapper是一个代表单个servlet的容器
来自web应用程序部署描述符的定义。
它提供了一种方便的机制来使用拦截器来查看每一个
*请求此定义所表示的servlet。
Wrapper的实现负责管理servlet的生命周期
*循环,包括调用init()和
*在适当的时候destory(),以及尊重的存在
servlet类本身的SingleThreadModel声明。
*附加到Wrapper的父容器通常是
实现上下文,表示servlet上下文(和
(因此是web应用程序),servlet在其中执行。*子容器不允许在包装器实现,所以
* addChild()方法应该抛出一个IllegalArgumentException*/
public interface Wrapper extends Container {
8. 处理请求的整体过程
Tomcat学习笔记(2)- 整体架构相关推荐
- Tomcat学习笔记02【Tomcat部署项目】
Java后端 学习路线 笔记汇总表[黑马程序员] Tomcat学习笔记01[Web相关概念.Tomcat基本操作][day01] Tomcat学习笔记02[Tomcat部署项目][day01] 目录 ...
- motan学习笔记 二 motan架构分析
motan学习笔记 一 微博轻量级RPC框架Motan motan学习笔记 二 motan架构分析 motan学习笔记 三 motan Demo 分析 motan学习笔记 四 motan Demo 之 ...
- TOMCAT学习笔记
TOMCAT学习笔记 (2011-10-03 17:03:26) 转载▼ 标签: 杂谈 分类: 编程 2011年10月3日 1.TOMCAT总体来说由两部分组成:connector和container ...
- Tomcat学习笔记01【Web相关概念、Tomcat基本操作】
Java后端 学习路线 笔记汇总表[黑马程序员] Tomcat学习笔记01[Web相关概念.Tomcat基本操作][day01] Tomcat学习笔记02[Tomcat部署项目][day01] 目录 ...
- 架构mysql_MySQL学习笔记之MySQL架构
MySQL 最重要.最与众不同的特性是它的存储引擎架构,这种架构的设计将查询处理及其他系统任务和数据的存储/提取相分离.这种处理和存储分离的设计可以在使用时根据性能.特性,以及其他需求来选择数据存储的 ...
- Istio服务网格实践指南 学习笔记(二) Istio架构
个人学习Istio系列 学习笔记 Istio架构篇 本篇部分参考原书 https://jimmysong.io/istio-handbook/ 仅为个人学习笔记 这幅图中描述了以下内容: 1.Ist ...
- 5G 学习笔记 - NSA - ENDC架构
我们先来看下ENDC/EN-DC总体网络架构(37.340): 再看一下各种Cell Group(MCG/SCG), Cell(PCell, PSCell, SpCell...)及Bearer(MCG ...
- 【Docker 学习笔记】Docker架构及三要素
文章目录 一.Docker 简介 二.Docker 架构 1. Docker 客户端和服务器 2. Docker 架构图 3. Docker 运行流程图 三.Docker 三要素 1. 镜像(Imag ...
- Tomcat学习笔记(三)—— Server组件
前面已经初步了解了Server组件是什么东西及其作用.在这里进一步对Server组件进行研究学习. Server组件 从Tomcat的层次结构中已经知道Server组件是Tomcat最顶层组件,它可以 ...
最新文章
- codeforces 711B - Chris and Magic Square(矩阵0位置填数)
- 李宏毅机器学习课程2~~~误差从哪里来?
- 洛谷P5703、P5704、P5705、P5706题题解(Java语言描述)
- 配置windows 2003 ×××服务器
- 莫烦python学习笔记之class
- 华为OLT(MA5680T)修改系统时间
- C语言:51单片机看这一篇就够了
- 云南省初中计算机考试试题,云南省初中学业水平考试信息技术(中考)总复习资料+信息技术中考复习题...
- 意大利奢侈品牌-Kiton 华丽进驻北京新光天地-时尚生活-泛高尔夫网
- Duality对偶学习笔记(第一课时)
- freenom免费域名的申请+cloudflare(域名代理解析)
- Tagxedo在线云词成像制作工具
- CCNA专业英文词汇全集
- PDMS二次开发(十四)——自动插入焊口和计算焊接当量(达因数)
- 把数组里的数组合全部列出 (递归法)
- 腾讯云、阿里云都“服”了,云容灾你还迟疑什么?
- Visual Studio 2008下载及破解方法
- java程序员如何进行物联网开发
- 图的遍历 DFS遍历(深学思维)
- Oracle 储存生僻字