目录
总体设计
Server
Container
Service
Context
Host
Wrapper
Lifecyle
Pipe和Valve
Connector
Tomcat启动
请求处理
类加载器
J2SE标准类加载器
Tomcat加载器
从最基本的功能来,服务器可以描述为:接收请求并进行解析,完成相关业务处理,返回结果。
上帝类,完成socket监听,处理请求并相应。
请求与处理方到一起,扩展性差,拆开
============>>>>>>
一个Server包含多个Connector和Container。Connector负责监听,Container负责处理。
如何知晓Connector与Container关系呢?增加映射。
============>>>>>>
增加Service,维护多个Connector与1个Container。
Server中可以包含多个Service(相互独立,共享一个JVM以及系统类库)。
Engine表示真个Servlet引擎,而非Servlet容器。表示整个Servlet容器的是Server。引擎仅考虑处理请求。
Engine需要Web应用来处理请求,增加Web应用。
============>>>>>>
Web应用以Context表示,一个Engine可以包含多个Context。
如果一个服务器可以承担多个域名服务怎么办呢?增加Host。
============>>>>>>
Host表示虚拟主机,一个Host可以包含多个Context。
Servlet规范,一个Web应用可以包含多个Servlet实例,因此增加Wrapper。
============>>>>>>
Engine,Host,Context,Wrapper都是容器的表现形式,增加Container
============>>>>>>
容器之间的关系是弱引用的关系,通过Container的父子容器概念体现,因此之间关系是聚合。
所有组件都有启动,停止等方法,具有生命周期。
============>>>>>>
每个生命周期方法,都会导致状态的转换,但是并不是每个状态都会触发生命周期事件,也不是每个生命周期事件都存在对应状态。
方法 | 状态 | 生命周期事件 |
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:周期性事件,每次调用后触发。
增强组件的灵活性与可扩展性。
============>>>>>>
采用责任链来增强灵活性与扩展性。PipeLine用于构造责任链,Valve代表责任链中的每个处理器。
要想与Container配合实现一个完整的功能,Connector需要实现以下几种功能:
ProtocolHandler表示一个协议处理器,包含一个AbstractEndPoint监听端口,还包含一个Processor处理指定协议,按照请求映射到具体的容器。
映射的过程叫请求映射,要考虑组件的注册与销毁,由Mapper维护映射信息,MapperListener负责注册与注销映射信息。
Tomcat使用适配器模式实现Connector与Mapper,Container的解耦。
Tomcat启动过程非常标准化,统一按照生命周期管理接口Lifecyle的定义进行启动,调用init()方法进行组件的逐级初始化,然后再调用start()方法进行启动,每次调用都伴随生命周期状态变更事件的触发。
加载
加载
tomcat自定义了4种类加载器,分别是
路径为common.loader,默认指向$CATALINA_HOME\lib
路径server.loader,默认为空,使用CommonClassLoader
所有Web应用的父加载类,路径shared.loader,默认为空,使用CommonClassLoader
加载/WEB-INF/classes和/WEB-INF/lib下的类或包,仅对当前WEB可见
因为tomcat对于catalinaClassLoader和sharedClassLoader的默认设置是类路径为空,因此catalinaClassLoader和sharedClassLoader就跟commonClassLoader一样了,即tomcat默认设置下commonClassLoader 、catalinaClassLoader和sharedClassLoader这3个类加载器是同一个。webappClassLoader相当于每个部署在tomcat中的应用的类加载器,有多少个应用就有多少个独立的webappClassLoader,因此,tomcat的类加载器结构如下: