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的脚本文件
/confTomcat服务器的各种全局配置文件
/doc文档
/libTomcat服务器所需的各种JAR文件
/logs日志文件
/webapps发布应用程序对应的目录和文件
/workJSP编译后生成的class 文件

Tomcat配置

Tomcat主要包括的配置文件包括

  1. server.xml
    tomcat最主要的配置文件
  2. context.xml
    默认context配置,应用于安装了tomcat所有主机的所有配置内容
  3. web.xml
    默认的 web.xml
  4. catalina.policy
    JAVA安全防护策略文件

server.xml

元素名属性解释
serverport指定一个端口,这个端口负责监听关闭tomcat的请求
servershutdown指定向端口发送的命令字符串
servicename指定service的名字
Connectorport指定服务器端要创建的端口号,并在这个断口监听来自客户端的请求
ConnectorminProcessors服务器启动时创建的处理请求的线程数
ConnectormaxProcessors最大可以创建的处理请求的线程数
ConnectorenableLookups如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址
ConnectorredirectPort指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号
ConnectoracceptCount指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理
ConnectorconnectionTimeout指定超时的时间数(以毫秒为单位)
Engine(表示指定service中的请求处理机,接收和处理来自Connector的请求)defaultHost指定缺省的处理请求的主机名,它至少与其中的一个host元素的name属性值是一样的
Context(表示一个web应用程序,通常为WAR文件,关于WAR的具体信息见servlet规范)docBase应用程序的路径或者是WAR文件存放的路径
Contextpath表示此web应用程序的url的前缀,这样请求的url为 http://localhost:8080/path/***&#42;

 

Contextreloadable这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化,自动装载新的应用程序,我们可以在不重起tomcat的情况下改变应用程序
host(表示一个虚拟主机)name指定主机名
hostappBase应用程序基本目录,即存放应用程序的目录
hostunpackWARs如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接从WAR文件中运行应用程序
Logger(表示日志,调试和错误信息)className指定logger使用的类名,此类必须实现org.apache.catalina.Logger 接口
Loggerprefix指定log文件的前缀
Loggersuffix指定log文件的后缀
Loggertimestamp如果为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类可以记录应用程序的访问信息
ListenerclassNamelistner元素创建并配置了LifecyleListner对象,用于监控容器的创建与删除操作 . 通常通过与服务器启动时间关联,便于让tomcat启动新的代码
 

附录

  1. Tomcat 系统架构与设计模式
  2. tomcat架构分析
  3. 《tomcat权威指南》
  4. tomcat server.xml配置
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值