当前位置: 首页 > news >正文

Tomact高级使用及原理剖析

tomact官方网站:https://tomcat.apache.org/

浏览器访问服务器流程

http请求处理流程:

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

Tomcat系统总体架构

Tomcat 请求处理大致过程

Tomcat是一个Http服务器(能够接收并且处理http请求,所以tomcat是一个http服务器)

我们使用浏览器向某一个网站发起请求,发出的是Http请求,那么在远程,Http服务器接收到这个请求之后,会调用具体的程序(Java类)进行处理,往往不同的请求由不同的Java类完成处理。

HTTP 服务器接收到请求之后把请求交给Servlet容器来处理,Servlet 容器通过Servlet接口调用业务类。Servlet接口和Servlet容器这一整套内容叫作Servlet规范。

注意:Tomcat既按照Servlet规范的要求去实现了Servlet容器,同时它也具有HTTP服务器的功能。

Tomcat的两个重要身份

1)http服务器

2)Tomcat是一个Servlet容器

Tomcat Servlet容器处理流程

当用户请求某个URL资源时

1)HTTP服务器会把请求信息使用ServletRequest对象封装起来

2)进一步去调用Servlet容器中某个具体的Servlet

3)在2)中,Servlet容器拿到请求后,根据URL和Servlet的映射关系,找到相应的Servlet

4)如果Servlet还没有被加载,就用反射机制创建这个Servlet,并调用Servlet的init方法来完成初始化

(5) 接着调用这个具体Servlet的service方法来处理请求, 请求处理结果使用ServletResponse对象封装。

6)把ServletResponse对象返回给HTTP服务器,HTTP服务器会把响应发送给客户端

Tomcat系统总体架构

通过上面的讲解,我们发现tomcat有两个非常重要的功能需要完成

1)和客户端浏览器进行交互,进行socket通信,将字节流和Request/Response等对象进行转换

2)Servlet容器处理业务逻辑

对应角色:http服务器功能

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

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

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

Tomcat连接器组件Coyote

Coyote简介

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

(1) Coyote 封装了底层的网络通信 (Socket 请求及响应处理)

(2) Coyote 使Catalina 容器(容器组件)与具体的请求协议及IO操作方式完全解耦

(3) Coyote 将 Socket 输入转换封装为 Request 对象,进一步封装后交由 Catalina 容器进行处理,处理请求完成后,Catalina 通过 Coyote 提供的 Response 对象将结果写入输出流

(4) Coyote 负责的是具体协议(应用层)和 IO(传输层)相关内容

Tomcat Coyote 支持的 IO模型与协议

Tomcat支持多种应用层协议和I/O模型,如下:

应用层

应用层协议

描述

HTTP/1.1

这是大部分Web应用采用的访问协议。

AJP

用于和WX集成(如Apache),以实现对静态资源的优化以及集群部署,当前支持AJP/1.3。

HTTP/2

HTTP 2.0大幅度的提升了Web性能。下一代HTTP协议,自8.5以及9.0版本之后支持。

传输层

IO模型

描述

NIO

非阻塞I/O,采用Java NIO类库实现。

NIO2

异步I/O,采用JDK 7最新的NIO2类库实现。

APR

采用Apache可移植运行库实现,是C/C++编写的本地库。如果选择该方案,需要单独安装APR库

应用层

应用层协议

描述默认的协议是Http/1.1 协议部分

HTTP/1.1

这是大部分Web应用采用的访问协议。

AJP

用于和WX集成(如Apache),以实现对静态资源的优化以及集群部署,当前支持AJP/1.3。

HTTP/2

HTTP 2.0大幅度的提升了Web性能。下一代HTTP协议,自8.5以及9.0版本之后支持。

Bio同步阻塞IO

传输层

IO模型

描述现在默认的IO模型是NIO io模型部分

NIO

非阻塞I/O,采用Java NIO类库实现。

NIO2

异步I/O,采用DK 7最新的NIO2类库实现。

APR

采用Apache可移植运行库实现,是C/C++编写的本地库。如果选择该方案,需要单独安装APR库

在8.0之前,Tomcat默认采用的I/O方式为BIO,之后改为NIO。无论NIO、NIO2还是APR,在性能方面均优于以往的BIO。如果采用APR,甚至可以达到Apache HTTP Server 的影响性能。

Coyote的内部组件及流程

Coyote 组件及作用

组件

作用描述

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类来封装这些请求信息。ProtocolHandler接口负责解析请求并生成Tomcat Request类。但是这个Request对象不是标准的ServletRequest,不能用Tomcat Request作为参数来调用容器。Tomcat设计者的解决方案是引入CoyoteAdapter,这是适配器模式的经典运用,连接器调用CoyoteAdapter的Sevice方法,传入的是Tomcat Request对象,CoyoteAdapter负责将Tomcat Request转成ServletRequest,再调用容器

TomcatServlet 容器Catalina

Tomcat 模块分层结构图及Catalina位置

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

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

Servlet 容器 Catalina 的结构

Tomcat (我们往往有一个认识, Tomcat就是一个Catalina的实例, 因为Catalina是Tomcat的核心)

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

一个Catalina实例(容器)

一个 Server实例(容器)

多个Service实例(容器)

每一个Service实例下可以有多个Connector实例和一个Container实例

Catalina

负责解析Tomcat的配置文件(server.xml),以此来创建服务器Server组件并进行管理

Server

服务器表示整个Catalina Servlet容器以及其它组件,负责组装并启动Servlet引擎,Tomcat连接器。Server通过实现Lifecycle接口,提供了一种优雅的启动和关闭整个系统的方式

Service

服务是Server内部的组件,一个Server包含多个Service。它将若干个Connector组件绑定到一个Container

  • Container

容器,负责处理用户的<servlet请求,并返回对象给Tomact高级使用及原理剖析

Container 组件的具体结构

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

  • Engine

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

  • Host

代表一个虚拟主机,或者说一个站点,可以给Tomcat配置多个虚拟主机地址,而一个虚拟主机下可包含多个Context

  • Context

表示一个Web应用程序,一个Web应用可包含多个Wrapper

  • Wrapper

表示一个Servlet, Wrapper 作为容器中的最底层, 不能包含子容器

上述组件的配置其实就体现在conf/server.xml中。

http://www.cnnetsun.cn/news/183493.html

相关文章:

  • 如何快速掌握Iwara视频高效下载:新手完整教程
  • ViGEmBus控制器模拟驱动:突破游戏兼容性瓶颈的终极方案
  • 如何快速掌握Iwara视频下载工具:新手必学的5个核心技巧
  • 【花雕学编程】Arduino BLDC 之LQR最优控制倒立摆
  • 技术研究 | 绕过WAF的常见Web漏洞利用分析
  • 数字内容访问助手:Bypass Paywalls Clean全方位实战指南
  • 如何3分钟免费解锁付费内容:Bypass Paywalls Clean终极指南
  • NCM音乐格式终极转换指南:从加密到通用MP3的完整方案
  • 3步解锁ncmdump:轻松实现NCM转MP3的终极解决方案
  • 网易云NCM解密终极指南:3种简单方法快速转换音乐文件
  • 终极音乐解密工具:快速转换网易云NCM加密格式
  • 联想拯救者工具箱:解锁笔记本隐藏性能的智能管家
  • 如何安全使用AO3镜像?新手终极入门指南
  • 如何在Win10工控机上完成STLink驱动下载
  • 猫抓浏览器扩展:3步轻松捕获网页视频资源的终极指南
  • 写论文软件哪个好?实测 10 款后,这款凭 “学术安全感” 赢麻了![特殊字符]
  • 拯救者工具箱终极指南:小白也能轻松掌握的隐藏性能优化技巧
  • 如何实现智能内容解锁?终极免费阅读解决方案
  • 基于LabVIEW与Matlab script绘制电机、控制器、系统效率MAP图
  • ServiceWorker 的生命周期包含6种核心状态
  • 网易云NCM文件终极解密:从加密音乐到自由播放的完整方案
  • Betaflight与F4/F7飞控硬件兼容性:核心要点
  • 猫抓Cat-Catch资源嗅探工具完整教程:从新手到高手
  • 猫抓Cat-Catch:新手必学的网页视频下载全攻略
  • Expo CLI常用命令详解:完整指南
  • RePKG终极指南:5分钟掌握Wallpaper Engine资源提取与转换
  • 超星网课助手完整操作指南:告别手动刷课烦恼
  • 联想拯救者工具箱功能解析:7大特色功能深度探索与实践指南
  • 逆向工程深度解析:Wallpaper Engine资源格式完全解密指南
  • 【大模型开发效率提升10倍】:Open-AutoGLM开源实战指南