how tomcat works总结

开篇先把关于tomcat的神图供上。


how tomcat works总结_第1张图片
tomcat架构.png

这本书共分为20个章节,本文主要是对这本书的各个章节做一下总结。

第一章 simple web server

第一章搭建了一个最简单的web服务器,主要包括三个类,Request、Response和HttpServer,其中request类对发送来的报文做最简单的解析;response类响应一个简单的静态html页面;httpServer则是使用serversocket的accept方法来对端口进行监控。

第二章 a simple servlet container

本章实现了一个简单的servlet container,容器。这个container对response的报文进行解析,然后根据解析的内容,对不同的uri使用不同的processor,进而调用不同的servlet对该请求进行处理和响应。

第三章 connector

本章搭建了一个简单的connector,tomcat的两个重要组件就是container和connector。connector负责接收request,所有的request都在connector中被接收。一个request来了,connector为它分配一个processor,来负责这个request的相关响应处理。在processor中对这个request进行解析,在本章中,头部和协议都直接进行了解析,在最新的tomcat版本中,相关的解析会在用到的时候才进行解析。processor把request解析之后,再按照uri寻找响应的processor和servlet对request进行响应。

第四章 tomcat default connector

本章介绍了tomcat4的默认connector。在这个connector中管理着一组httpprocessor,这个类实现了Lifecycle和Runnable接口,和上一章的processor作用类似,负责具体的request处理。这个connector的功能要更完善和全面。如果有太多的请求同时到来,connect会调用processor的await和assign方法,来调度这些processor,默认的最大processor数量是20,最小是5。在processor中对request进行解析,然后调用相应的容器的invoke方法进行处理。


how tomcat works总结_第2张图片
connectorAndProcessor.png

第五章 container

本章介绍tomcat的container概念。在tomcat中,从外到内,共有四种类型的container,engine,host,context和wrapper。并不一定需要所有container。每一个container中都有一个pipeline属性,这里使用到了责任链模式,在这个pipeline上可以添加任意个valve阀,如果不添加任何valve,那么至少有一个basicValve,这个basicValve会在最后触发。这些容器的请求处理流程如开篇的tomcat架构图所示。每个container(除了wrapper)中还会有一个mapper,负责映射下一级的container。

第六章 lifecycle

本章主要介绍lifecycle,一个生命周期和事件监控机制。这是一个观察者模式。每当实现了lifecycle接口的组件发生开始和停止事件,就会触发BEFORE_START_EVENT, START_EVENT,
AFTER_START_EVENT,BEFORE_STOP_EVENT, STOP_EVENT, and AFTER_STOP_EVENT这些事件。使用这个机制可以通过一个开始或者停止操作来开始或者停止tomcat中所有的组件。在使用的时候可以声明一个LifecycleListener,然后把它添加到一个组件中。

第七章 logger

本章介绍了tomcat中的日志功能。每个日志文件与容器context相绑定。和别的日志系统差不太多,这里就不多做叙述了。

第八章 loader

本章介绍的是tomcat 的loader组件。在这里介绍了loader接口、reloader接口、和加载类。tomcat的类加载机制是典型的委派双亲加载模式。如果你设置了Auto-reload,那么会开启一个后台线程,定时的检查是否文件发生了改变,如果改变了就进行重加载。在进行类加载时,会选择源文件仓库和各种lib,方便顺利的找到相应的类,并进行加载,一般的WEB-INF/class和WEB-INF/lib目录都会被加入到repositories中。

第九章 Session Management

本章介绍了tomcat中是session组件。manager类与context相绑定,对session的创建、更新和销毁进行管理。session可以存储在内存中、文件中,也可以存储在数据库中,这个可以进行设置,当然存储在当前manager内存中的session是有数量限制的,超出的会存储在二级存储文件或者数据库中,如果一些session发生了变化,触发了相应的规则,会发生换入换出操作。同样的,会有一个后台线程来不断检查session是否超时等。

第十章 security

本章介绍的是tomcat 的security机制。一些web应用的内容是受到限制的,只有授权的用户才能够访问。这些用户信息和安全配置在web.xml中,然后再向container的pipeline中添加authenticator来进行实现。Realm是一个组件用来验证一个用户。

第十一章 standardWrapper

本章介绍的是最底层的container,wrapper的标准实现。它的一个请求流程图如下所示。


how tomcat works总结_第3张图片
tomcat访问流程图.png

图中显示了一个standardWrapper的几个重要操作,包括invoke、allocate、load、init、service。

第十二章 standardContext

一个context表示的是一个web应用,它包括多个wrapper,每一个wrapper表示一个servlet。本章介绍的是标准的context实现。它会包含一个standContextMapper,用它来为每个请求request匹配寻找响应的wrapper。除此以外,它还支持了reload,并开启一个后台线程专门负责各种后台操作。

第十三章 Host and engine

本章介绍了standardhost、standardhostmapper、standardhostvalve、standardengine、standardenginevalve这几个类。为什么需要一个host,是因为每个context都需要使用contextConfig来进行配置,而每一个contextConfig都需要定位应用的web.xml文件,其中它的getResource方法需要parent。

public URL getResource(String path)throws MalformedURLException {
 DirContext resources = context.getResources();
 if (resources != null) {String fullPath = context.getName() + path;
 // this is the problem. Host must not be null
 String hostName = context.getParent().getName();
......

第十四章 server and service

本章介绍的是tomcat另外两个顶层组件server和service。这两个组件的位置可以参考tomcat架构图。一个server包含多个service,每个service中包括多个connector和一个container。server提供了一个优雅的方式来开始和停止一个catalina部署。

第十五章 digester

digester是tomcat中解析处理xml的组件,负责把xml中的定义配置内容解析出来,并生成java对象。比较详细的介绍了如果去定义各种解析规则等。接着介绍了contextconfig类,这个类也实现了lifecycle接口,每当context的start事件发生时,就会触发contextconfig的start方法,对各种属性进行配置,并对配置文件进行解析和处理。这里的配置文件包括defultconfig(%CATALINA_HOME%/conf/web.xml)和applicationConfig(WEB-INF目录)。

第十六章 shutdown hook

本章介绍了tomcat的shutdown钩子机制,用来防止用户非正常关闭应用所造成的各种问题。

ShutdownHook ShutdownHook = new ShutdownHook();
Runtime.getRuntime().addShutdownHook(ShutdownHook);

一般会这么去使用,在初始化的时候,把钩子方法配置到tomcat中,钩子方法里面会新建一个线程来执行stop操作。但是钩子方法一定要简短,用时少,否则会不起作用,还没有处理结束,主线程就结束了。

第十七章 tomcat startup

本章介绍如何启动tomcat。这里涉及到两个类,catalina和bootstrap。其中catalina用来开始和停止一个server对象,同时将配置文件server.xml传递进去;bootstrap类是入口类,创建了一个catalina类,并调用它的process方法。
为了用户的方便,tomcat提供了batch文件和shell script文件来帮助用户进行开始和停止操作。在batch和shell script文件中对tomcat及相关环境变量进行了检查,对这个资源文件进行了检查,然后调用bootstrap类的main方法,并传入正确的参数。

第十八章 deployer

为了web应用能够正常使用,必须把这个web应用部署在host里。这个deployer组件就是帮助用户进行部署和安装操作的。standhost类实现了deployer接口,从而成为一个特殊的container,它将部署和安装任务委派给它的一个辅助类standardhostdeployer。在部署一个web应用时,需要部署配置描述文件、war包文件和目录。

第十九章 manager servlet

本章介绍了使用containerservlet来对catalina内部类进行访问。在第二十章会有更好的实现方式。

第二十章 JMX-Based Management

JMX是java management extensions的缩写。JMX在tomcat中可以在对tomcat的内部访问中提供更好的灵活性,方便我们决定哪个类的哪些属性和哪些方法能够被用户访问和使用。为了实现这个功能,需要用到MBean来对源对象进行管理和控制。使用MBean来代替源对象,从而提供访问。在本章中详细介绍了如果使用MBean,以及tomcat如果方便MBean的使用都提供了哪些辅助工具。

-------------------------------------------------------

在最后再贴上一张大神画的tomcat时序图。


how tomcat works总结_第4张图片
tomcat时序图.png

你可能感兴趣的:(how tomcat works总结)