Tomcat深入学习与理解(一)Tomcat系统架构与原理分析

Tomcat深入学习与理解(一)Tomcat系统架构与原理分析

说明:本次讲述涉及使用Tomcat版本为8.5.50

1. 简介

Tomcat服务器是一个免费的开放源码的Web应用服务器,目前是应用比较广泛的。

从Tomcat的7.0版本开始支持Servlet3.0规范规范,可以支持我们开发过程中不再配置web.xml。

2. 浏览器访问服务器的流程

浏览器访问服务器使用的是http协议,http是应用层协议,用于定义数据通信的格式,具体的数据传输使用的是TCP/IP协议。

Tomcat深入学习与理解(一)Tomcat系统架构与原理分析_第1张图片

  1. 用户向浏览器发起http请求。
  2. 浏览器接收到用户请求,向服务器发起TCP连接请求。
  3. 服务器接收到浏览器请求,并建立TCP连接。
  4. 浏览器生成HTTP数据包,向服务器发送数据包。
  5. 服务器收到浏览器发送过来的数据包必能解析,执行请求对应的具体逻辑,将返回数据组装成http格式包并返回。
  6. 浏览器接收到服务器返回的http的数据包,解析http数据包,通过浏览器将相应静态资源呈现给用户。

3. Tomcat主体架构

3.1 Tomcat请求处理大致流程

Tomcat是一个http服务器,它能够接收并处理http请求。用户在发起http请求之后,http服务器接收到用户请求然后它会调用具体的程序(Java对象)进行处理,往往不同的请求由不同的Java对象处理。

Tomcat两个身份:

  • HTTP服务器
  • Servlet容器

Tomcat接收到http请求之后并不会让http服务器直接调用具体的java类去执行处理逻辑(这样会高度耦合),而是http服务器会把请求进行一些特殊处理后交给Servlet容器处理,Servlet容器会根据请求的不同将它们交给对应的业务类处理(这些业务类实现了Servlet接口,相当于是一个Servlet,由Servlet容器管理)。

3.2 Tomcat Servlet容器处理流程

当用户请求某个URL资源时

  1. http服务器会把请求信息使用ServletRequest对象封装起来
  2. Servelt容器拿到请求后,根据URL和Servlet的映射关系,找到容器中对应的Sevlet
  3. 如果Servlet容器还没有被加载,就用反射机制创建这个Servlet,并调用Servlet的init方法来完成初始化。
  4. 接着调用这个具体Servlet的service方法来处理请求,请求处理结果使用ServletResponse对象封装。
  5. 将封装好的ServletResponse对象返回给http服务器,http服务器把响应发送给客户端。

Tomcat深入学习与理解(一)Tomcat系统架构与原理分析_第2张图片

3.3 系统总体架构

Tomcat深入学习与理解(一)Tomcat系统架构与原理分析_第3张图片

Tomcat完成了两个非常重要的功能

  1. 和客户端浏览器进行交互,进行socket通信,将字节流和Request/Response等对象进行转换
  2. Servlet容器处理业务逻辑

Tomcat设计了两个核心组件连接器(Connector)和容器(Container)来完成Tomcat的两大核心功能。

  1. 连接器

    连接器,负责对外交流。处理Socket连接,负责网络字节流与Request和Response对象的转化。

  2. 容器

    容器,负责内部处理。加载和管理Servlet,以及具体处理Request请求。

4. Tomcat连接器组件Coyote

4.1 Coyote简介

Coyote是Tomcat中连接器的组件名称,是对外的接口。客户端通过Coyote与服务器建立连接、发送请求并接受响应。

  1. Coyote封装了底层的网络通信(Socket请求及响应处理)
  2. Coyote使Catalina容器(容器组件)与具体的请求协议及IO操作方式完全解耦
  3. Coyote将Socket输入转换封装为Request对象,进一步封装后交由Catalina容器进行处理,处理请求完成后,Catalina通过Coyote提供的Request对象将结果写入输出流
  4. Coyote负责的是具体协议(应用层协议 )和IO(传输层)相关内容

4.2 支持的应用层协议及IO模型

Tomcat默认应用层协议是HTTP1.1。

在Tomcat8.0版本之前,默认采用的I/O模型是BIO,之后改为了NIO。无论NIO、NIO2还是APR,在性能方面均优于以往的BIO。如果采用APR,甚至可以达到Apache HTTP Server的性能级别。

4.2.1 应用层协议
应用层协议 描述 备注
HTTP/1.1 这是大部分Web应用采用的访问协议 默认协议
AJP 用于和WX集成(如Apache),以实现对静态资源的优化以及集群部署
HTTP/2.0 HTTP2.0大幅度的提升了Web性能。下一代HTTP协议,自8.5以及9.0版本之后支持。
4.2.2 IO模型
IO模型 描述 备注
NIO 非阻塞I/O,采用Java NIO类库实现。 默认NIO
NIO2 异步I/O,采用JDK7最新的NIO2类库实现
APR 采用Apache可移植运行库实现,是C/C++编写的本地库。如果选择该方案,需要单独安装APR库 很少用
BIO 同步阻塞式IO,Tomcat8.0之前默认BIO,后面默认NIO,不再支持BIO 已经停用

4.3 Coyote内部组件及流程

Tomcat深入学习与理解(一)Tomcat系统架构与原理分析_第4张图片

组件 作用描述
EndPoint EndPoint是Coyote通信端点,即通信监听的端口,是具体Socket接收和发送处理器,是对传输层的抽象,因此EndPoint用来实现TCP/IP协议的
Processor Processor是Coyote协议处理接口,如果说EndPoint是用来实现TCP/IP协议的,那么Processor用来实现HTTP协议,Processor接收来自 EndPoint的Socket,读取字节流解析成Tomcat Request和Response对象,并通过Adapter讲其提交到容器处理,Processor是对应用层协议的抽象
ProtocolHandler Coyote协议接口,通过Endpoint和Processor,实现针对具体协议的处理能力。Tomcat按照协议和I/O模型提供了对应的6个实现类:AjpNioProtocol,AjpAprProtocol,AjpNio2Protocol,Http11NioProtocol,Http11Nio2Protocol,Http11AprProtocol
Adapter 由于协议不同,客户端发过来的请求信息页不尽相同,Tomcat定义了自己的Request类。但是这个Reqeust对象不是标准的ServletRequest,不能用Tomcat Request作为参数来调用Container容器。Tomcat设计者的解决方案是引入CoyoteAdapter,这是适配器模式的经典运用,连接器调用CoyoteAdapter的Service方法,传入的是Tomcat Request对象,CoyoteAdapter负责将Tomcat Request转成ServletRequest,然后再调用容器。

5. Tomcat Servlet容器Catalina

Tomcat是一个由一系列可配置(conf/server.xml)的组件构成的Web容器,而Catalina是Tomcat的Servlet容器。

从另一个角度来说,Tomcat本质上就是一款Servlet容器,因为Catalina才是Tomcat的核心,其他模块都是为Catalina提供支撑的。比如:通过Coyote模块提供连接通信,Jasper模块提供JSP引擎,Naming提供JNDI服务,Juli提供日志服务。

5.1 Servlet容器Catalina的结构

我们可以认为整个Tomcat就是一个Catalina实例,Tomcat启动的时候会初始化这个实例,Catalina实例通过加载server.xml完成其他实例的创建,创建并管理一个Server,Server创建并管理多个服务,每个服务又可以有多个Connector和一个Container。

  • 一个Catalina实例(容器)
    • 一个Sever实例(容器)
      • 多个Service实例(容器)
        • 每一个Service实例下可以有多个Connector实例和一个Container实例
实例 描述
Catalina 负责解析Tomcat的配置文件(server.xml),以此来创建服务器Server组件并进行管理
Server 服务器表示整个Catalina Servler容器以及其他组件,负责组装并启动Servlet引擎,Tomcat连接器。Server通过实现Lifecycle接口,提供了一种优雅的启动和关闭整个系统的方式。
Service 服务是Server内部的组件,一个Server包含多个Service。它将若干个Connector组件绑定到一个Container
Container 容器,负责处理用户的Servlet请求,并返回对象给Web用户的

5.2 Container组件的具体结构

Container组件下有几种具体的组件,分别是Engine、Host、Context、Wrapper。这四种组件(容器)是父子关系。Tomcat通过一种分层的结构,使得Servlet容器具有很好的灵活性。

Tomcat深入学习与理解(一)Tomcat系统架构与原理分析_第5张图片

组件/容器 描述
Engine 表示整个Catalina的Servlet引擎,用来管理多个虚拟站点,一个Service最多只能由一个Engine,但是一个引擎可以包含多个Host
Host 代表一个虚拟主机,或者说一个站点,可以给Tomcat配置多个虚拟主机地址,而一个虚拟主机下可以包含多个Context
Context 表示一个web应用程序,一个Web应用可以包含多个Wrapper
Wrapper 表示一个Servlet,Wrapper作为容器中的最底层,不能包含子容器

你可能感兴趣的:(Tomcat深入学习与理解,学习笔记,tomcat)