一. 什么是tomcat
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为比较流行的Web 应用服务器。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
二. tomcat的组件
首先tomcat是一个Servlet容器,Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。Servlet有三个基本的功能:
- 创建
Request
包装接收客户端请求数据 - 创建
Response
包装响应客户端请求的数据 - 以
Request
和Response
为参数调用Servlet
的service
方法做出请求响应
当有了一个Servlet之后,要运行起来就需要一个Servlet容器,于是就有了tomcat。所以Tomcat 就是一个 Servlet 容器, 能接收用户从浏览器发来的请求, 然后转发给 Servlet 处理, 把处理完的响应数据发回浏览器。
在网上找了几张图贴一下,很清晰的展示了tomcat的组件之间的关系。
接下来列一下tomcat的各种组件以及他们的作用:
Server
:服务器,就是整个tomcat容器Service
:服务,Service是Server的内部组件,一个Service包含多个Server,他把多个Connector绑定到一个Container(Engine)上Connector
:连接器,处理与客户端之间连接通信的,负责接收客户端请求并转给相关的容器处理,最后向客户端返回信息,总的来说Connector就是解析Http或Ajp请求的Container
:容器,包含Engine
、Host
、Context
、Wrapper
这四种类型,这四种容器是父子级关系。其中Engine表示整个 Catalina 的 Servlet 引擎,用来管理多个虚拟站点。Host代表一个虚拟主机,或者说一个站点,可以给 Tomcat 配置多个虚拟主机地址,而一个虚拟主机下可包含多个 Context。Context表示一个 Web 应用程序,一个Web应用可包含多个 Wrapper。Wrapper表示一个Servlet,负责管理整个 Servlet 的生命周期,包括装载、初始化、资源回收等。Component
:其他组件,Manager
用作session管理、logger
用作日志记录、loader
用作启动context以及管理这个context的classloader用的、pipeline
用作上下级容器传递信息的通道、valve
用作通道(pipeline)中的各种阀门
三. tomcat组件的生命周期
经过上面这些分析,大致的了解了tomcat的整体内容以及组件和组件之间的关系。那么tomcat有这么的组件,是如何进行初始化等等的管理呢?这就到tomcat的Lifecycle
了。
tomcat从设计之初就是指定了完整的生命周期机制
从图中可以看出tomcat自己定制了Lifecycle
接口用以定制生命周期,同时还实现了JMX管理java对象。
在 tomcat 中组件是有层级关系的,因此tomcat设计了Lifecycle
接口,当父组件需要初始化时就可以在自己的生命周期方法比如 init
方法里创建子组件并且调用子组件的 init
方法,最终像一个链条一样层层调用下去,最终从父组件一层一层递归初始化下一层直到所有组件生命周期执行完成,这其实就是设计模式中组合模式的经典实用。最终实现的效果就是在启动入口我们只需要调用最顶层组件的 init
方法 和 start
方法,整个 tomcat 就被启动起来了。在启动阶段各个组件会涉及到生命周期方法的组合调用,因此我们可以把组件的生命周期定义成相应的状态,把状态的转变看作是一个事件。有了事件就需要有监听器,在监听器里可以实现一些内部逻辑,并且监听器也可以方便的添加和删除,这就是典型的观察者模式的应用。
tomcat的org.apache.catalina.util.LifecycleBase#init
方法
tomcat代码看似很庞大,但从结构上看却很清晰和简单,它主要由一堆组件组成,如Server
、Service
、Connector
、Container
等,并基于JMX管理这些组件,同时这些组件之间也有父子级关系,实现了代表生存期的接口Lifecycle,使其组件履行固定的生存期,在其整个生存期的过程中通过事件侦听LifecycleEvent实现扩展。 如下图也是网上找的一个很常见的tomcat生命周期类关系图:
-
Lifecycle
:定义了容器生命周期、容器状态转换及容器状态迁移事件的监听器注册和移除等主要接口 -
LifecycleBase
:作为Lifecycle接口的抽象实现类,运用抽象模板模式将所有容器的生命周期及状态转换衔接起来,此外还提供了生成LifecycleEvent事件的接口 -
LifecycleSupport
:提供有关LifecycleEvent事件的监听器注册、移除,并且使用经典的监听器模式,实现事件生成后触达监听器的实现 -
MBeanRegistration
:Java JMX框架提供的注册MBean的接口,引入此接口是为了便于使用JMX提供的管理功能 -
LifecycleMBeanBase
:Tomcat提供的对MBeanRegistration的抽象实现类,运用抽象模板模式将所有容器统一注册到JMX -
此外,
ContainerBase
、StandardServer
、StandardService
、WebappLoader
、Connector
、StandardContext
、StandardEngine
、StandardHost
、StandardWrapper
等容器都继承了LifecycleMBeanBase
,因此这些容器都具有了同样的生命周期并可以通过JMX进行管理
这些组件的生命周期执行将在后续启动过程分析的时候详细说明。
至此对tomcat的整体架构有了一个宏观的了解,后续就可以在这个架构上开始详细分析了,本篇就先到这里。