Tomcat介绍

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生命周期

  1. Servlet容器创建Servlet的一个实例
  2. 容器调用该实例的init()方法
  3. 如果容器对该Servlet有请求,则调用此实例的service()方法
  4. 容器在销毁本实例前调用它的destroy()方法
  5. 销毁并标记该实例以供作为垃圾收集

Tomcat历史

Apache Tomcat 7.x

在汲取了Tomcat 6.0.x优点的基础上,实现了对于Servlet 3.0、JSP 2.2和EL 2.2等特性的支持。除此以外的改进列表如下:

  1. Web应用内存溢出侦测和预防
  2. 增强了管理程序和服务器管理程序的安全性
  3. 一般 CSRF保护

Apache Tomcat6.x

在汲取 Tomcat 5.5.x优点的基础上,实现了Servlet 2.5和JSP 2.1等特性的支持。除此以外的改进列表如下:

  1. 支持web应用中的外部内容的直接引用
  2. 重构 (connectors, lifecycle)及很多核心代码的全面梳理
  3. 内存使用优化
  4. 更大的IO容量
  5. 重构聚类

Apache Tomcat 5.x

Apache Tomcat 5.0.x在Apache Tomcat 4.1的基础上做了很多改动,包括:

  1. 性能优化和减少垃圾回收动作
  2. 重构程序部署,通过一个可选的独立部署程序,允许在将一个web应用放进产品前验证和编译它
  3. 基于JMX的服务器全面监视及web程序管理
  4. 提高Taglibs的支撑能力,包括改进的数据池和tag插件
  5. 改进平台集成性,包括Windows和Unix
  6. 基于JMX的嵌入
  7. 增强的安全管理支撑
  8. 集成session集群

Tomcat架构简介

本wiki主要基于Tomcat6进行介绍

架构介绍

Tomcat基本结构



 

  1. 一个serve包括多个service
  2. 一个service包含一个容器 和 多个connector
  3. Tomcat基于JMX(Java Management Extensions,即Java管理扩展,是一个为应用程序、设备、系统等植入管理功能的框架)管理这些组件,另外实现以上接口的组件也实现了代表生存期的接口Lifecycle,使其组件履行固定的生存期,在其整个生存期的过程中通过事件侦听LifecycleEvent实现扩展。
    Tomcat的核心类图如下所示:



Catalina

与开始/关闭shell脚本交互的主类

connector

Connector是网络socket相关接口模块 .整个connector组件是Tomcat运行主干,各个模块都是tomcat启动时静态创建好的,通过connector将这些模块串了起来。
connector主要作用包括

  1. 接收socket
  2. 从socket获取数据包,并解析成HttpServletRequest对象
  3. 从engine容器开始走调用流程,经过各层valve,最后调用servlet完成业务逻辑
  4. 返回response,关闭socket

connector配置举例为

<Connector port="80" URIEncoding="UTF-8" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="7443" />

protocol的选择包括

  1. HTTP/1.1
  2. org.apache.coyote.http11.Http11Protocol --BIO实现 (=http/1.1)
  3. org.apache.coyote.http11.Http11NioProtocol --NIO实现

BIO/NIO/AIO

Java对BIO、NIO、AIO的支持如下

  1. Java BIO
    同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程。
  2. Java NIO
    同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
  3. Java AIO(NIO.2)
    异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理,

BIO、NIO、AIO适用场景分析

  1. BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。
  2. NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
  3. AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。

connector结构

以Http11Protocol举例


 

  1. Http11ConnectionHandler对象维护了一个Http11Processor对象池, 完成http request的解析和分派
  2. JIoEndpoint
    维护了两个线程池,Acceptor及Worker
    1. Acceptor是接收socket,然后从Worker线程池中找出空闲的线程处理socket,如果worker线程池没有空闲线程,则Acceptor将阻塞
    2. Worker是典型的线程池实现。Worker线程拿到socket后,就从Http11Processor对象池中获取Http11Processor对象,
  3. Mapper
    此对象维护了一个从Host到Wrapper的各级容器的快照。它主要是为了,当http request被解析后,能够将http request绑定到相应的servlet进行业务处理。
  4. 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个组件

  1. Cluster
    实现tomcat集群,例如session共享等功能,通过配置server.xml可以实现,对其包含的所有host里的应用有效,该模块是可选的。其实现方式是基于pipeline+valve模式的,有时间会专门整理一个pipeline+valve模式应用系列;
  2. Realm
    实现用户权限管理模块,例如用户登录,访问控制等,通过通过配置server.xml可以实现,对其包含的所有host里的应用有效,该模块是可选的;
  3. Pipeline
    每个容器对象都有一个pipeline,它不是通过server.xml配置产生的,是必须有的。它就是容器对象实现逻辑操作的骨架,在pipeline上配置不同的valve,当需要调用此容器实现逻辑时,就会按照顺序将此pipeline上的所有valve调用一遍,这里可以参考责任链模式;
  4. Valve
    实现具体业务逻辑单元。可以定制化valve(实现特定接口),然后配置在server.xml里。对其包含的所有host里的应用有效。定制化的valve是可选的,但是每个容器有一个缺省的valve,例如engine的StandardEngineValve,是在StandardEngine里自带的,它主要实现了对其子host对象的StandardHostValve的调用,以此类推。

Host

Host是Engine的子容器,它是context容器的集合。封装各个context资源的合集
Host和Engine的模块差不多,只是作用域不同.Host还有一些其他的功能

  1. context的部署
  2. 可以使用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中还包括

  1. Manager
    它主要是应用的session管理模块。其主要功能是session的创建,session的维护,session的持久化(persistence),以及跨context的session的管理等。Manager模块可以定制化,tomcat也给出了一个标准实现;
    manager模块是必须要有的,可以在server.xml中配置,如果没有配置的话,会在程序里生成一个manager对象。
  2. Resources
    它是每个web app对应的部署结构的封装,比如,有的app是tomcat的webapps目录下的某个子目录或是在context节点配置的其他目录,或者是war文件部署的结构等。它对于每个web app是必须的。
  3. Loader:它是对每个web app的自有的classloader的封装。Tomcat正是有一套完整的classloader体系,才能保证每个web app或是独立运营,或是共享某些对象等等。它对于每个web app是必须的。
  4. 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主要包括三大类

  1. 处理静态资源的一个wrapper:例如html, jpg。 对应wrapper为
    org.apache.catalina.servlets.DefaultServlet
    
  2. 处理jsp文件,对应wrapper为
    org.apache.jasper.servlet.JspServlet
    
  3. 自定义的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主要包括的配置文件包括

  1. server.xml
    tomcat最主要的配置文件
  2. context.xml
    默认context配置,应用于安装了tomcat所有主机的所有配置内容
  3. web.xml
    默认的 web.xml
  4. 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/***&#42;

 

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启动新的代码
 

附录

  1. Tomcat 系统架构与设计模式
  2. tomcat架构分析
  3. 《tomcat权威指南》
  4. tomcat server.xml配置

猜你喜欢

转载自gambol1234.iteye.com/blog/2024430