Tomcat总体架构

目录

 

总体设计

Server

Container

Service

Context

Host

Wrapper

Lifecyle

Pipe和Valve

Connector

Tomcat启动

请求处理

类加载器

J2SE标准类加载器

Tomcat加载器


总体设计

从最基本的功能来,服务器可以描述为:接收请求并进行解析,完成相关业务处理,返回结果。

Server

上帝类,完成socket监听,处理请求并相应。

Tomcat总体架构_第1张图片

请求与处理方到一起,扩展性差,拆开

============>>>>>>

Container

Tomcat总体架构_第2张图片

一个Server包含多个Connector和Container。Connector负责监听,Container负责处理。

如何知晓Connector与Container关系呢?增加映射。

============>>>>>>

Service

Tomcat总体架构_第3张图片

增加Service,维护多个Connector与1个Container。

Server中可以包含多个Service(相互独立,共享一个JVM以及系统类库)。

Engine表示真个Servlet引擎,而非Servlet容器。表示整个Servlet容器的是Server。引擎仅考虑处理请求。

 Engine需要Web应用来处理请求,增加Web应用。

============>>>>>>

Context

Tomcat总体架构_第4张图片

Web应用以Context表示,一个Engine可以包含多个Context。

如果一个服务器可以承担多个域名服务怎么办呢?增加Host。

============>>>>>>

Host

Tomcat总体架构_第5张图片

Host表示虚拟主机,一个Host可以包含多个Context。

Servlet规范,一个Web应用可以包含多个Servlet实例,因此增加Wrapper。

============>>>>>>

Wrapper

Tomcat总体架构_第6张图片

Engine,Host,Context,Wrapper都是容器的表现形式,增加Container

============>>>>>>

Tomcat总体架构_第7张图片

容器之间的关系是弱引用的关系,通过Container的父子容器概念体现,因此之间关系是聚合。

 

所有组件都有启动,停止等方法,具有生命周期。

============>>>>>>

Lifecyle

Tomcat总体架构_第8张图片

每个生命周期方法,都会导致状态的转换,但是并不是每个状态都会触发生命周期事件,也不是每个生命周期事件都存在对应状态。

生命周期事件与状态映射
方法 状态 生命周期事件
init() INITIALIZING BEFORE_INIT_EVENT
INITIALIZED AFTER_INIT_EVENT
start() STARTING_PREP BEFORE_START_EVENT
STARTING START_EVENT
STARTED AFTER_START_EVENT
stop() STOPPING_PREP BEFORE_STOP_EVENT
STOPPING STOP_EVENT
STOPPED AFTER_STOP_EVENT
destroy() DESTROYING BEFORE_DESTROY_EVENT
DESTROYED AFTER_DESTROY_EVENT
    PERIODIC_EVENT
    CONFIGURE_START_EVENT
    CONFIGURE_STOP_EVENT

PERIODIC_EVENT:周期性事件,每次调用后触发。

增强组件的灵活性与可扩展性。

============>>>>>>

Pipe和Valve

Tomcat总体架构_第9张图片

采用责任链来增强灵活性与扩展性。PipeLine用于构造责任链,Valve代表责任链中的每个处理器。

Connector

要想与Container配合实现一个完整的功能,Connector需要实现以下几种功能:

  • 监听请求
  • 请求解析
  • 匹配容器
  • 返回相应

ProtocolHandler表示一个协议处理器,包含一个AbstractEndPoint监听端口,还包含一个Processor处理指定协议,按照请求映射到具体的容器。

映射的过程叫请求映射,要考虑组件的注册与销毁,由Mapper维护映射信息,MapperListener负责注册与注销映射信息。

Tomcat使用适配器模式实现Connector与Mapper,Container的解耦。

Tomcat总体架构_第10张图片

 

Tomcat启动

Tomcat启动过程非常标准化,统一按照生命周期管理接口Lifecyle的定义进行启动,调用init()方法进行组件的逐级初始化,然后再调用start()方法进行启动,每次调用都伴随生命周期状态变更事件的触发

Tomcat总体架构_第11张图片

Tomcat总体架构_第12张图片

Tomcat总体架构_第13张图片

请求处理

类加载器

J2SE标准类加载器

Tomcat总体架构_第14张图片

  • Bootstrap ClassLoader

加载\lib,或者被-Xbootclasspath参数所指定的路径中的类库,启动类加载器无法被Java程序直接引用。

  • Extension ClassLoader

加载\lib\ext下的类库,开发者可以直接使用扩展类加载器

  • Application ClassLoader

Tomcat加载器

 

tomcat自定义了4种类加载器,分别是

  • commonClassLoader

路径为common.loader,默认指向$CATALINA_HOME\lib

  • catalinaClassLoader

路径server.loader,默认为空,使用CommonClassLoader

  • sharedClassLoader

所有Web应用的父加载类,路径shared.loader,默认为空,使用CommonClassLoader

  • webappClassLoader

加载/WEB-INF/classes和/WEB-INF/lib下的类或包,仅对当前WEB可见

 

 

因为tomcat对于catalinaClassLoader和sharedClassLoader的默认设置是类路径为空,因此catalinaClassLoader和sharedClassLoader就跟commonClassLoader一样了,即tomcat默认设置下commonClassLoader 、catalinaClassLoader和sharedClassLoader这3个类加载器是同一个。webappClassLoader相当于每个部署在tomcat中的应用的类加载器,有多少个应用就有多少个独立的webappClassLoader,因此,tomcat的类加载器结构如下:

 

Tomcat总体架构_第15张图片

 

 

你可能感兴趣的:(tomcat)