Tomcat介绍
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。目前最新版本是8.0。
Servlet
一个servlet就是Java编程语言中的一个类,它被用来扩展服务器的性能,服务器上驻留着可以通过“请求-响应”编程模型来访问的应用程序。虽然servlet可以对任何类型的请求产生响应,但通常只用来扩展Web服务器的应用程序。Java Servlet技术为这些应用程序定义了一个特定于HTTP的 servlet类。
Servlet容器
负责处理客户请求、把请求传送给Servlet并把结果返回给客户。不同程序的容器实际实现可能有所变化,但容器与Servlet之间的接口是由Servlet API定义好的,这个接口定义了Servlet容器在Servlet上要调用的方法及传递给Servlet的对象类。
Servlet生命周期
- Servlet容器创建Servlet的一个实例
- 容器调用该实例的init()方法
- 如果容器对该Servlet有请求,则调用此实例的service()方法
- 容器在销毁本实例前调用它的destroy()方法
- 销毁并标记该实例以供作为垃圾收集
Tomcat历史
Apache Tomcat 7.x
在汲取了Tomcat 6.0.x优点的基础上,实现了对于Servlet 3.0、JSP 2.2和EL 2.2等特性的支持。除此以外的改进列表如下:
- Web应用内存溢出侦测和预防
- 增强了管理程序和服务器管理程序的安全性
- 一般 CSRF保护
Apache Tomcat6.x
在汲取 Tomcat 5.5.x优点的基础上,实现了Servlet 2.5和JSP 2.1等特性的支持。除此以外的改进列表如下:
- 支持web应用中的外部内容的直接引用
- 重构 (connectors, lifecycle)及很多核心代码的全面梳理
- 内存使用优化
- 更大的IO容量
- 重构聚类
Apache Tomcat 5.x
Apache Tomcat 5.0.x在Apache Tomcat 4.1的基础上做了很多改动,包括:
- 性能优化和减少垃圾回收动作
- 重构程序部署,通过一个可选的独立部署程序,允许在将一个web应用放进产品前验证和编译它
- 基于JMX的服务器全面监视及web程序管理
- 提高Taglibs的支撑能力,包括改进的数据池和tag插件
- 改进平台集成性,包括Windows和Unix
- 基于JMX的嵌入
- 增强的安全管理支撑
- 集成session集群
Tomcat架构简介
本wiki主要基于Tomcat6进行介绍
架构介绍
Tomcat基本结构
- 一个serve包括多个service
- 一个service包含一个容器 和 多个connector
- Tomcat基于JMX(Java Management Extensions,即Java管理扩展,是一个为应用程序、设备、系统等植入管理功能的框架)管理这些组件,另外实现以上接口的组件也实现了代表生存期的接口Lifecycle,使其组件履行固定的生存期,在其整个生存期的过程中通过事件侦听LifecycleEvent实现扩展。
Tomcat的核心类图如下所示:
Catalina
与开始/关闭shell脚本交互的主类
connector
Connector是网络socket相关接口模块 .整个connector组件是Tomcat运行主干,各个模块都是tomcat启动时静态创建好的,通过connector将这些模块串了起来。
connector主要作用包括
- 接收socket
- 从socket获取数据包,并解析成HttpServletRequest对象
- 从engine容器开始走调用流程,经过各层valve,最后调用servlet完成业务逻辑
- 返回response,关闭socket
connector配置举例为
<Connector port="80" URIEncoding="UTF-8" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="7443" />
protocol的选择包括
- HTTP/1.1
- org.apache.coyote.http11.Http11Protocol --BIO实现 (=http/1.1)
- org.apache.coyote.http11.Http11NioProtocol --NIO实现
BIO/NIO/AIO
Java对BIO、NIO、AIO的支持如下
- Java BIO
同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程。 - Java NIO
同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。 - Java AIO(NIO.2)
异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理,
BIO、NIO、AIO适用场景分析
- BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。
- NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
- AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。
connector结构
以Http11Protocol举例
- Http11ConnectionHandler对象维护了一个Http11Processor对象池, 完成http request的解析和分派
- JIoEndpoint
维护了两个线程池,Acceptor及Worker- Acceptor是接收socket,然后从Worker线程池中找出空闲的线程处理socket,如果worker线程池没有空闲线程,则Acceptor将阻塞
- Worker是典型的线程池实现。Worker线程拿到socket后,就从Http11Processor对象池中获取Http11Processor对象,
- Mapper
此对象维护了一个从Host到Wrapper的各级容器的快照。它主要是为了,当http request被解析后,能够将http request绑定到相应的servlet进行业务处理。 - CoyoteAdapter
将http request解析成HttpServletRequest对象,之后绑定相应的容器,然后从engine开始逐层调用.
容器
容器承载了各种逻辑单元和运行时的数据。tomcat的容器分成4个等级。如下:
这些细分的模块,使得tomcat非常健壮,通过一些配置和模块定制化,可以很大限度的扩展tomcat。
以一个典型的页面访问为例,假设访问的URL是 http://www.mydomain.com/app/index.html
各个容器处理的详细情况如图所示。
Wrapper封装了具体的访问资源,例如 index.html
Context 封装了各个wrapper资源的集合,例如 app
Host 封装了各个context资源的集合,例如 www.mydomain.com
Engine
主要包括4个组件
- Cluster
实现tomcat集群,例如session共享等功能,通过配置server.xml可以实现,对其包含的所有host里的应用有效,该模块是可选的。其实现方式是基于pipeline+valve模式的,有时间会专门整理一个pipeline+valve模式应用系列; - Realm
实现用户权限管理模块,例如用户登录,访问控制等,通过通过配置server.xml可以实现,对其包含的所有host里的应用有效,该模块是可选的; - Pipeline
每个容器对象都有一个pipeline,它不是通过server.xml配置产生的,是必须有的。它就是容器对象实现逻辑操作的骨架,在pipeline上配置不同的valve,当需要调用此容器实现逻辑时,就会按照顺序将此pipeline上的所有valve调用一遍,这里可以参考责任链模式; - Valve
实现具体业务逻辑单元。可以定制化valve(实现特定接口),然后配置在server.xml里。对其包含的所有host里的应用有效。定制化的valve是可选的,但是每个容器有一个缺省的valve,例如engine的StandardEngineValve,是在StandardEngine里自带的,它主要实现了对其子host对象的StandardHostValve的调用,以此类推。
Host
Host是Engine的子容器,它是context容器的集合。封装各个context资源的合集
Host和Engine的模块差不多,只是作用域不同.Host还有一些其他的功能
- context的部署
- 可以使用Host支持虚拟主机
<Engine name="Catalina" defaultHost="localhost"> <Host name="localhost" appBase="webapps" unpackWARs="false" autoDeploy="false" xmlValidation="false" xmlNamespaceAware="false"> <Host name="www.virtualhost.com" appBase="viruhostFolder"/> </Engine>
Context
context是wrapper容器的合集。 除了engine中的组件之外,context中还包括
- Manager
它主要是应用的session管理模块。其主要功能是session的创建,session的维护,session的持久化(persistence),以及跨context的session的管理等。Manager模块可以定制化,tomcat也给出了一个标准实现;
manager模块是必须要有的,可以在server.xml中配置,如果没有配置的话,会在程序里生成一个manager对象。 - Resources
它是每个web app对应的部署结构的封装,比如,有的app是tomcat的webapps目录下的某个子目录或是在context节点配置的其他目录,或者是war文件部署的结构等。它对于每个web app是必须的。 - Loader:它是对每个web app的自有的classloader的封装。Tomcat正是有一套完整的classloader体系,才能保证每个web app或是独立运营,或是共享某些对象等等。它对于每个web app是必须的。
- Mapper:它封装了请求资源URI与每个相对应的处理wrapper容器的映射关系
Wrapper
Wrapper是context的子容器,它封装的处理资源的每个具体的servlet,他主要的逻辑单元包括
pipeline和valve与上面的容器作用一样。比较特殊的逻辑单元是servlet对象与servlet stack对象。这两个对象在wrapper容器中只存在其中之一,也就是说只有其中一个不为空。当以servlet对象存在时,说明此servlet是支持多线程并发访问的,也就是说不存在线程同步的过程,此wrapper容器中只包含一个servlet对象(这是我们常用的模式);当以servlet stack对象存在时,说明servlet是不支持多线程并发访问的,每个servlet对象任一时刻只有一个线程可以调用,这样servlet stack实现的就是个简易的线程池,此wrapper容器中只包含一组servlet对象,它的基本原型是worker thread模式实现的。
wrapper主要包括三大类
- 处理静态资源的一个wrapper:例如html, jpg。 对应wrapper为
org.apache.catalina.servlets.DefaultServlet
- 处理jsp文件,对应wrapper为
org.apache.jasper.servlet.JspServlet
- 自定义的servlet对象. 在web.xml中定义的serlvet
启动过程
Tomcat 的启动逻辑是基于观察者模式设计的,所有的容器都会继承 Lifecycle 接口,它管理者容器的整个生命周期,所有容器的的修改和状态的改变都会由它去通知已经注册的观察者(Listener)
tomcat启动的时序图为
http请求的处理过程
原则上来说,Connector将请求拿到,传给Containner。 Container通过上文提到的mapper,将请求映射到相应的Engine, Host, Context和Wrapper进行处理
MVC 框架基本的原理都是将所有的请求都映射到一个 Servlet,然后去实现 service 方法,这个方法也就是 MVC 框架的入口
Tomcat目录结构
Tomcat目录下主要需要包含以下目录
/bin | 启动和关闭Tomcat的脚本文件 |
/conf | Tomcat服务器的各种全局配置文件 |
/doc | 文档 |
/lib | Tomcat服务器所需的各种JAR文件 |
/logs | 日志文件 |
/webapps | 发布应用程序对应的目录和文件 |
/work | JSP编译后生成的class 文件 |
Tomcat配置
Tomcat主要包括的配置文件包括
- server.xml
tomcat最主要的配置文件 - context.xml
默认context配置,应用于安装了tomcat所有主机的所有配置内容 - web.xml
默认的 web.xml - catalina.policy
JAVA安全防护策略文件
server.xml
元素名 | 属性 | 解释 |
server | port | 指定一个端口,这个端口负责监听关闭tomcat的请求 |
server | shutdown | 指定向端口发送的命令字符串 |
service | name | 指定service的名字 |
Connector | port | 指定服务器端要创建的端口号,并在这个断口监听来自客户端的请求 |
Connector | minProcessors | 服务器启动时创建的处理请求的线程数 |
Connector | maxProcessors | 最大可以创建的处理请求的线程数 |
Connector | enableLookups | 如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址 |
Connector | redirectPort | 指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号 |
Connector | acceptCount | 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理 |
Connector | connectionTimeout | 指定超时的时间数(以毫秒为单位) |
Engine(表示指定service中的请求处理机,接收和处理来自Connector的请求) | defaultHost | 指定缺省的处理请求的主机名,它至少与其中的一个host元素的name属性值是一样的 |
Context(表示一个web应用程序,通常为WAR文件,关于WAR的具体信息见servlet规范) | docBase | 应用程序的路径或者是WAR文件存放的路径 |
Context | path | 表示此web应用程序的url的前缀,这样请求的url为 http://localhost:8080/path/****
|
Context | reloadable | 这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化,自动装载新的应用程序,我们可以在不重起tomcat的情况下改变应用程序 |
host(表示一个虚拟主机) | name | 指定主机名 |
host | appBase | 应用程序基本目录,即存放应用程序的目录 |
host | unpackWARs | 如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接从WAR文件中运行应用程序 |
Logger(表示日志,调试和错误信息) | className | 指定logger使用的类名,此类必须实现org.apache.catalina.Logger 接口 |
Logger | prefix | 指定log文件的前缀 |
Logger | suffix | 指定log文件的后缀 |
Logger | timestamp | 如果为true,则log文件名中要加入时间,如下例:localhost_log.001-10-04.txt |
Realm(表示存放用户名,密码及role的数据库) | className | 指定Realm使用的类名,此类必须实现org.apache.catalina.Realm接口 |
Valve(请求进container处理流程的软件) | className | 指定Valve使用的类名,如用org.apache.catalina.valves.AccessLogValve类可以记录应用程序的访问信息 |
Listener | className | listner元素创建并配置了LifecyleListner对象,用于监控容器的创建与删除操作 . 通常通过与服务器启动时间关联,便于让tomcat启动新的代码 |
附录
- Tomcat 系统架构与设计模式
- tomcat架构分析
- 《tomcat权威指南》
- tomcat server.xml配置
相关推荐
Tomcat 详细介绍 Tomcat 是一个开源的 Web 服务器和 Servlet 容器,使用 Java 语言编写,基于 Apache 服务器。它可以单独运行,也可以与 Apache 服务器集成,提供了一个基于 Java 的 Web 应用程序环境。 目录结构 ...
1. **Apache Tomcat介绍**:Apache Tomcat是由Apache软件基金会开发的Java Servlet容器,它是Java Community Process(JCP)的一部分,遵循Java EE规范。Tomcat主要负责解析HTTP请求,将动态内容通过Servlet或JSP...
1. **Apache Tomcat介绍**: - Apache Tomcat 是一个小型的Java应用服务器,它实现了Java EE的Web组件规范,尤其是Servlet和JSP规范。 - Tomcat由Apache Software Foundation维护,是Apache Jakarta项目的一部分,...
**Apache Tomcat介绍** Apache Tomcat是由Apache Software Foundation维护的项目,它是一个轻量级的HTTP服务器,专注于处理Java相关的Web服务。Tomcat能够解析HTTP请求,并通过Servlet和JSP技术来生成动态内容。它的...
【Apache Tomcat 介绍】 Apache Tomcat是一款由Apache软件基金会开发的开源软件,它是一个Servlet和JSP容器,主要用于运行Java应用程序。Tomcat最初是由Apache和Sun Microsystems以及其他贡献者共同开发的,现在...
1. **Apache Tomcat介绍**:Apache Tomcat是Apache软件基金会Jakarta项目的一个核心部分,它实现了Sun Microsystems的Java Servlet和JavaServer Pages规范。Tomcat以其轻量级、高效和稳定性而受到开发者喜爱,它作为...
1. **Tomcat介绍**: Tomcat是Apache软件基金会Jakarta项目的一个子项目,它是Java EE Web容器的一种实现,支持Servlet和JSP规范。Tomcat以其轻量级、高效、稳定和开源的特点,成为许多小型到中型项目的首选Web...
1. **Tomcat介绍**:Tomcat是基于Java的Servlet容器,它实现了Java Servlet和JSP规范,使得开发者可以用Java编写动态网页。Tomcat作为一个轻量级应用服务器,相比其他全功能的应用服务器(如JBoss、WebLogic),它的...
1. **Tomcat介绍**:Tomcat是Apache软件基金会的Jakarta项目中的一个核心项目,它是一个开源的、免费的Web服务器和应用服务器,专门用来运行Java Servlet和JSP。Tomcat实现了Servlet和JSP的相关规范,如Servlet 3.1...
3. **Apache Tomcat介绍**: - Apache Tomcat是一款开源的Java Servlet容器,它实现了Java EE的Web应用服务器部分,尤其是Servlet和JSP规范。`apache-tomcat-7.0.88-windows-x64.zip`是Tomcat 7.0.88的64位Windows...
1. **Tomcat介绍** - Tomcat是Apache软件基金会Jakarta项目的一部分,遵循Apache Software License 2.0协议。 - 它是一个轻量级应用服务器,特别适合小型到中型的应用部署,同时也可作为开发和测试环境。 - ...
Tomcat简介
1. **Tomcat介绍**:Tomcat是一个开源的Java Servlet容器,实现了Java EE的Web应用服务器规范,尤其是Servlet和JSP。它是Apache软件基金会的Jakarta项目的一部分,以其轻量级、高效和稳定的性能受到广泛青睐。 2. *...
#### Tomcat 介绍 Apache Tomcat 是一个免费开源的Servlet容器,它能够运行基于Java的Web应用程序。Tomcat 由 Apache 软件基金会支持并维护,最初是由James Duncan Davidson开发的。Tomcat 6 是 Tomcat 的一个重要...
1. **Tomcat介绍**:Apache Tomcat是Apache软件基金会Jakarta项目的一部分,它是一个轻量级的Web服务器,实现了Java EE中的Servlet和JSP规范。Tomcat以其简单易用、高效稳定的特点在开发者中广泛流行。 2. **版本号...
1. **Tomcat介绍**: Apache Tomcat是Apache软件基金会的项目之一,它是一个开放源代码的Web应用服务器,主要处理HTTP协议。Tomcat实现了Java EE的Web容器部分,包括Servlet和JSP规范。尽管它不包含完整的Java EE...
**Tomcat介绍** Tomcat是Apache软件基金会Jakarta项目下的一个开源软件,它是一个轻量级的应用服务器,特别适合运行Java Servlet和JavaServer Pages(JSP)技术。Tomcat是基于Java的,它实现了Java EE的Web部分,即...
1. **Tomcat介绍**:Tomcat是Apache软件基金会的Jakarta项目下的一个开源Web服务器和Servlet容器,它实现了Java Servlet和JavaServer Pages(JSP)规范,是Java Web应用最常用的运行环境之一。Tomcat以其轻量级、...