Tomcat 知识点总结,看看你掌握的怎么样?

本文详细介绍了Tomcat的架构,包括Server、Service、Connector、Engine、Host、Context等组件,以及它们的职责和执行流程。此外,还讨论了配置文件Server.xml中的关键配置,如Executor、Connector、Engine等,以及安全、性能优化等方面的内容。同时,提到了WebSocket的请求过程,并概述了Tomcat的启动和执行流程。
摘要由CSDN通过智能技术生成

思维导航:

 

  • 架构
  • 各组件的实现与执行组件实现
  • 配置文件Server.xml(重点)ServerServiceExecutorConnectorEngineHostContexttomcat-user.xml(权限管理)Web.xml(不常用)ServletContext 初始化全局参数会话设置
  • 安全与优化安全配置安全应用安全传输安全性能优化性能测试
  • Tomcat 附加功能 WebSocketWebSocket 请求过程

文章正文:

Tomcat 学习笔记。本文相关配置均为 tomcat8 下,其他版本可能略有不同。如有错误请多包涵。

架构

首先,看一下整个架构图

 

接下来简单解释一下。

Server:服务器。Tomcat 就是一个 Server 服务器。

Service:在服务器中可以有多个 Service,只不过在我们常用的这套 Catalina 容器的Tomcat 中只包含一个 Service,在 Service 中包含连接器和容器。一个完整的 Service 才能完成对请求的接收和处理。

连接器:Coyote 是连接器具体的实现。用于与新来的请求建立连接并解析数据。因为 Tomcat 支持的 IO 模型有 NIO、NIO2、APR,而支持的应用层协议有 HTTP1.1、HTTP2、AJP。所以针对不同的 IO 模型和应用层协议请求,在一个 Service 中可以有多个连接器来适用不同的协议的IO请求。

EndPoint :Coyote 通信端点,即通信监听的接口,是具体 Socket 接收和发送处理器,是用来实现 TCP/IP 传输协议的。

Acceptor:用于接收请求的 socket。

Executor:线程池,在接收到请求的 socket 后会从线程池中分配一条来执行后面的操作。

Processor :Coyote 协议处理接口,是用来实现 HTTP 应用层协议的,接收 EndPoint 、容器传来的 Socket 字节流,解析成 request 或 response 对象。

ProtocolHandler:Coyote 协议接口,通过 EndPoint 和 Processor,实现针对具体协议的处理能力。

Adapter:容器只负责处理数据,对于请求协议不同的数据,容器会无法处理,所以在 ProtocolHandler 处理生成的 request 对象后,还需要将其转成 Tomcat 定义好的统一格式的 ServletRequest 对象,Adapter 就是用来进行这样的操作的。

容器: Tomcat 的核心组件, 用于处理请求并返回数据。Catalina 是其具体的实现。

Engine:表示整个 Catalina 的 Servlet 引擎,用来管理多个虚拟站点,一个 Service 最多只能有一个 Engine。但是一个 Engine 可以包含多个 Host。

Host:表示一个主机地址,或者说一个站点,一个 Host 下有可以配置多个 Context。

Context:表示一个 web 应用,一个 Web 应用可以包含多个 Wrapper

Wrapper:表示一个 Servlet,是容器中的最底层组件。

各组件的比例关系

 

各组件的实现与执行

组件实现

前面提到的各个组件名都是接口或者抽象方法,在实际处理请求时执行的都是其子类或者实现类。

Server、Service、Engine、Host、Context都是接口, 下图中罗列了这些接口的默认实现类。

 

Adapter 的实现是 CoyoteAdapter

对于 Endpoint组件来说,在Tomcat中没有对应的Endpoint接口, 但是有一个抽象类AbstractEndpoint ,其下有三个实现类: NioEndpoint、Nio2Endpoint、AprEndpoint , 这三个实现类,分别对应于前面讲解链接器 Coyote 时, 提到的链接器支持的三种IO模型:NIO,NIO2,APR ,tomcat8.5版本中,默认采用的是 NioEndpoint。

ProtocolHandler : Coyote协议接口,通过封装Endpoint和Processor , 实现针对具体协议的处理功能。Tomcat按照协议和IO提供了6个实现类。

AJP协议:

1) AjpNioProtocol :采用NIO的IO模型。

2) AjpNio2Protocol:采用NIO2的IO模型。

3) AjpAprProtocol :采用APR的IO模型,需要依赖于APR库。

HTTP协议:

1) Http11NioProtocol :采用NIO的IO模型,默认使用的协议(如果服务器没有安装APR)。

2) Http11Nio2Protocol:采用NIO2的IO模型。

3) Http11AprProtocol :采用APR的IO模型,需要依赖于APR库。

 

这些组件均存在初始化、启动、停止等周期方法,所以 Tomcat 设计了一个 LifeCycle 接口,用于定义这些组件生命周期中需要执行的共同方法,这些组件实现类都实现了这个接口。

 

启动流程

 

1) 启动tomcat , 需要调用 bin/startup.bat (在linux 目录下 , 需要调用 bin/startup.sh) , 在

startup.bat 脚本中, 调用了catalina.bat。

2) 在catalina.bat 脚本文件中,调用了BootStrap 中的main方法。

3)在BootStrap 的main 方法中调用了 init 方法 , 来创建Catalina 及 初始化类加载器。

4)在BootStrap 的main 方法中调用了 load 方法 , 在其中又调用了Catalina的load方法。

5)在Catalina 的load 方法中 , 需要进行一些初始化的工作, 并需要构造Digester 对象, 用于解析 XML。

6) 然后在调用后续组件的初始化操作 。。。

加载Tomcat的配置文件,初始化容器组件 ,监听对应的端口号, 准备接受客户端请求 。

简而言之就是进行各组件逐级执行 init() 和 start() 方法。

执行流程

当一个请求进入 Tomcat 时,执行情况如下( 因为 Tomcat 只有一个 Service,所以下面就将 Service 和 Engine 写在同一个框中):

 

定位主要通过 Mapper 组件来实现,其本质就是一个 K、V键值对,在解析时首先会将请求网址进行解析,将其中的 Host 部分在 Mapper 类中的 hosts属性(MappedHost数组,保存所有的 Host 信息)中进行查找,找到后再解析 Context 部分,在该 MapperHost 中又有 contextList 属性(保存所有的 context 信息),然后再向下找,最终得到对应的 Servlet,执行。

 

除此之外,为了增强各组件之间的拓展性,Tomcat 中定义了 Pipeline 和 Valve 两个接口,Pipeline 用于构建责任链, 后者代表责任链上的每个处理器。Pipeline 中维护了一个基础的 Valve,它始终位于Pipeline的末端(最后执行),封装了具体的请求处理和输出响应的过程。当然,我们也可以调用addValve()方法, 为Pipeline 添加其他的Valve,后添加的Valve 位于基础的Valve之前,并按照添加顺序执行。Pipiline通过获得首个Valve来启动整合链条的执行 。

 

所以最终的执行如下:

 

步骤如下:

1)Connector组件Endpoint中的Acceptor监听客户端套接字连接并接收Socket。

2)将连接交给线程池Executor处理,开始执行请求响应任务。

3)Processor组件读取消息报文,解析请求行、请求体、请求头,封装成Request对象。

4)Mapper组件根据请求行的URL值和请求头的Host值匹配由哪个Host容器、Context容器、Wrapper容器处理请求。

5)CoyoteAdaptor组件负责将Connector组件和Engine容器关联起来,把生成的Request对象和响应对象Response传递到Engine容器中,调用 Pipeline。

6)Engine容器的管道开始处理,管道中包含若干个Valve、每个Valve负责部分处理逻辑。执行完Valve后会执行基础的 Valve--StandardEngineValve,负责调用Host容器的Pipeline。

7)Host容器的管道开始处理,流程类似,最后执行 Context容器的Pipeline。

8)Context容器的管道开始处理,流程类似,最后执行 Wrapper容器的Pipeline。

9)Wrapper容器的管道开始处理,流程类似,最后执行 Wrapper容器对应的Servlet对象的处理方法。

配置文件

首先看一下 tomcat 的目录结构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值