Tomcat请求处理过程


Tomcat是什么?

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

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

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


Tomcat Servlet容器处理流程

当用户请求某个URL资源时

①HTTP服务器会把请求信息使用ServletRequest对象封装起来
②进一步去调用Servlet容器中某个具体的Servlet
③在②中,Servlet容器拿到请求后,根据URL和Servlet的映射关系,找到对应得到Servlet
④如果Servlet还没有被加载,就用反射机制创建这个Servlet,并调用Servlet得到init方法来完成初始化
⑤接着调用这个具体Servlet的service方法来处理请求,请求处理结果使用ServletResponse对象封装
⑥把ServletResponse对象返回给HTTP服务器,HTTP服务器会把响应发送给客户端


Tomcat 系统总体架构

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

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

②Servlet容器处理业务

Tmcat设计了两个核心组件连接器(Connector)和容器(Container)来完成Tomcat的两大核心功能。
连接器:负责对外交流,处理Socket连接,负责网络字节流与Request和Response对象的转换
容器:负责内部处理,加载和管理Servlet,以及具体处理Request请求


Tomcat连接器组件 Coyote

Coyote是Tomcat中连接器的组件名称,是对外的接口。客户端通过Coyote与服务器建立连接,发送请求并接受响应。
①Coyote封装了底层的网络通信(Socket请求及响应处理)
②Coyote使Catalina容器与具体的请求协议及IO操作方式完全解耦
③Coyote将Socket输入转换封装为Request对象,进一步封装后交由Catalina容器进行处理,处理请求完成后,Catalina通过Coyote提供的Response对象将结果写入输出流
④Coyote负责的是具体协议(应用层)和IO(传输层)相关内容

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

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


Coyote内部组件及流程


Coyote组件及作用:


Tomcat Servlet容器Catalina

Tomcat 是一个由一系列可配置(conf/server.xml)的组件构成的web容器,而Catalina是Tomcat的Servlet容器。
从另一个角度来说,Tomcat本质上是一款Servlet容器,因为Catalina才是Tomcat的核心,其他模块都是为Catalina提供支撑的。比如:通过Coyote模块提供链接通信,jasper模块提供JSP引擎,Naming提供JNDI服务,jui提供日志服务。


Servlet容器Catalina的结构

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

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

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

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

Container:容器,负责处理⽤户的servlet请求,并返回对象给web⽤户的模块

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中。


Server标签


Service标签


Executor标签


Connector 标签

⽤于创建链接器实例,默认情况下,server.xml 配置了两个链接器,⼀个⽀持HTTP协议,⼀个⽀持AJP协议⼤多数情况下,我们并不需要新增链接器配置,只是根据需要对已有链接器进⾏优化


Engine标签

Engine表示Servlet引擎


Host标签

Host标签用于配置一个主机


Context标签

Context标签用于配置一个Web应用


Tomcat 源码剖析

Tomcat启动流程

Tomcat请求处理流程

请求处理流程示意图

Mapper组件体系结构


Tomcat类加载机制剖析

JVM的类加载机制

JVM的类加载机制中有一个非常重要的角色叫做类加载器(ClassLoad),类加载器有自己的体系,JVM内置了几种类加载器,包括:引导类加载器、扩展类加载器,系统类加载器,他们之间形成父子关系,通过Parent来定义这种关系,最终可以形成树形结构。

另外:用户可以自定义类加载器(Java编写,用户自定义的类加载器,可加载指定路径的class文件)
当JVM运行过程中,用户自定义了类加载器去加载某些类时,会按照下面的步骤(父类委托机制)
①用户自己的类加载器,把加载请求传给父加载器,父加载器再传给其父加载器,一直到加载器树的顶层。
②最顶层的类加载器首先针对其特定的位置加载,如果加载不到就转交给子类
③如果一直到底层的类加载都没有加载到,那么就会抛出异常ClassNotFoundException

因此,按照这个过程可以想到,如果同样在CLASSPATH指定的目录中和自己工作目录中存放相同的Class,会优先加载CLASSPATH目录中的文件


JVM双亲委派机制

什么是双亲委派机制

当某个类加载器需要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类

双亲委派机制的作用

①防止重复加载同一个.class。通过委托去向上级去问一问,判断是否被加载过,加载过了就不用再加载一遍,保证数据安全
②保证核心.class不能被篡改。通过委托方式,不会去篡改核心.class,即使篡改也不会去加载,即使加载也不会是同一个class对象。不同的类加载器加载同一个.class 也不是同一个.class对象。这样保证了class执行安全(如果子类加载器先加载,那么我们可以写一些与java.lang包中基础类同名的类,然后再定义一个子类加载器,这样整个应用使用的基础类都变成自定义的类了)

Tomcat的类加载机制

引导类加载器和扩展类加载器的作用不变

系统类加载器正常情况吓加载的是CLASSPATH下的类,但是Tomcat的启动脚本并未使用该变量,而是加载Tomcat启动的类,比如bootstrap.jar,通常再Catalina.sh中指定。位于CATALINA_HOME/bin下

Common通用类加载器加载Tomcat使用以及应用通用的一些类,位于CATALINA_HOME/bin下,比如servlet-api.jar

Catalina ClassLoader用于加载服务器内部可见类,这些类应用程序不能访问

Shared ClassLoader,每个应用程序都会有一个独一无二的webapp ClassLoader,它用来加载本应用程序/WEB-INF/classes和/WEB-INF/lib下的类。

Tomcat8.5默认改变了严格的双亲委派机制
首先从Bootstrap ClassLoader加载指定的类
未加载到,从/WEB-INF/classes加载
未加载到,从/WEB-INF/lib/*.jar加载
未加载到,则依次从System、Common、Shared加载(该步骤使用双亲委派机制)


Tomcat对Https的支持及Tomcat性能调优策略

Https和Http的主要区别

HTTPS协议使用时需要到电子商务认证授权机构(CA)申请SSL证书
HTTP默认使用8080端口,HTTPS默认使用8443端口
HTTPS则是具有SSL加密的安全性传输协议,对数据的传输进行加密,效果上相当于HTTP的升级版
HTTP的连接是无状态的、不安全的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全

Tomcat对HTTPS的支持

  1. 使用JDK中的keytool工具生成免费的密钥库文件(证书)keytool -genkey -alias xxx -keyalg RSA -keystore xxx.keystore

  2. 配置conf/server.xml

Tomcat性能优化策略

系统性能的衡量指标,主要是响应时间和吞吐量

①响应时间:执行某个操作的耗时
②吞吐量:系统在指定时间内能够支持的事务数量,单位为TPS,也就是事务数/秒,一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程

①Tomcat优化从两个方面进行
②JVM虚拟机优化(优化内存模型)
Tomcat自身配置的优化(比如是否使用了线程池?IO模型)

虚拟机运行优化(参数配置)

①Java虚拟机的运行优化主要是内存分配和垃圾回收策略的优化
内存直接影响服务的运行效率和吞吐量
JVM垃圾回收机制则会不同程度地导致程序运行中断(我们可以选择不同的垃圾回收策略,调整JVM垃圾回收策略,可以极大减少垃圾回收次数,提升垃圾回收效率,改善程序运行性能)
Java虚拟机内存相关参数

②.垃圾回收策略

垃圾回收性能指标
吞吐量:工作时间(排除GC时间)占总时间的百分比,工作时间并不仅是程序运行的时间,还包含内存分配时间。
​​​​​暂停时间:由垃圾回收导致的应用程序停止响应次数/时间

垃圾收集器
串行收集器:单线程执行所有的垃圾回收工作,适用于单核CPU服务器
并行收集器:又称为吞吐量收集器(关注吞吐量),以并行的方式执行年轻代的垃圾回收,该方式可以显著降低垃圾回收的开销(指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态)。适用于多处理器或多线程硬件上运行的数据量较大的应用
并发收集器:以并发的方式执行大部分垃圾回收工作,以缩短垃圾回收的暂停时间。适用于那些响应时间优先于吞吐量的应用,因为该收集器虽然最小化了暂停时间(指用户线程与垃圾收集线程同时执行,但不一定是并行的,可能会交替进行),但会降低应用程序的性能
CMS收集器:并发标记清除收集器,适用于那些更愿意缩短垃圾回收暂停时间并且负担的起与垃圾回收共享处理器资源的应用
G1收集器:适用于大容量内存的多核服务器,可以在满足垃圾回收暂停时间目标的同时,以最大可能性实现高吞吐量

垃圾回收器参数

Tomcat配置调优

调整tomcat线程池

调整tomcat的连接器

调整tomcat/conf/server.xml中关于连接器的配置可以提升应用服务器的性能

禁用AJP连接器

调整IO模式

Tomcat8之前的版本默认使用BIO(阻塞式IO),对每一个请求都要创建一个线程来处理,不适合高并发Tomcat 8之后的版本默认使用NIO模式(非阻塞式IO)

当Tomcat并发性能有较高要求或者出现瓶颈时,我们可以尝试使用APR模式,APR是从操作系统级别解决异步IO问题,使用时需要在操作系统上安装APR和Native(因为APR原理是使用JINI技术调用操作系统底层的IO接口)

动静分离

可以使用Nginx+Tomcat结合的部署方式,Nginx负责静态资源访问,Tomcat负责JSP等动态资源访问处理(因为Tomcat不擅长处理静态资源)


Nginx课程笔记


Nginx 是什么?

Nginx是一个高性能的HTTP和反向代理web服务器,核心特点是占有内存少,并发能力强


Nginx应用场景?

①http服务器(web服务器)

性能⾮常⾼,⾮常注重效率,能够经受⾼负载的考验。

⽀持50000个并发连接数,不仅如此,CPU和内存的占⽤也⾮常的低,10000个没有活动的连

接才占⽤2.5M的内存。

②反向代理服务器

a) 正向代理

在浏览器中配置代理服务器的相关信息,通过代理服务器访问⽬标⽹站,代理服务器收

到⽬标⽹站的响应之后,会把响应信息返回给我们⾃⼰的浏览器客户端

b) 反向代理

浏览器客户端发送请求到反向代理服务器(⽐如Nginx),由反向代理服务器选择原始

服务器提供服务获取结果响应,最终再返回给客户端浏览器

③负载均衡服务器

负载均衡,当⼀个请求到来的时候(结合上图),Nginx反向代理服务器根据请求去找到⼀个

原始服务器来处理当前请求,那么这叫做反向代理。那么,如果⽬标服务器有多台(⽐如上

图中的tomcat1,tomcat2,tomcat3...),找哪⼀个⽬标服务器来处理当前请求呢,这样⼀

个寻找确定的过程就叫做负载均衡。

负载均衡就是为了解决⾼负载的问题。

④动静分离


Nginx 的特点

跨平台:Nginx可以在⼤多数类unix操作系统上编译运⾏,⽽且也有windows版本

Nginx的上⼿⾮常容易,配置也⽐较简单

⾼并发,性能好

稳定性也特别好,宕机概率很低


Nginx底层进程机制剖析

Nginx启动后,以daemon多进程⽅式在后台运⾏,包括⼀个Master进程和多个Worker进程,Master进程是领导,是⽼⼤,Worker进程是⼲活的⼩弟

master进程

主要管理worker进程,比如:

①接收外界信号向各worker进程发送信号(./nginx -s reload)

②监控worker进程的运行状态,当worker进程异常退出后Master进程会自动重新启动新的worker进程

worker进程

worker进程具体处理网络请求。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程之间是相互独立的。一个请求,只能在一个worker进程中处理,一个worker进程,不可能处理其他进程的请求。worker进程的个数是可以设置的,一般设置与机器CPU核数一致。

Nginx进程模型

以 ./nginx -s reload 来说明nginx信号处理这部分

1)master进程对配置⽂件进⾏语法检查

2)尝试配置(⽐如修改了监听端⼝,那就尝试分配新的监听端⼝)

3)尝试成功则使⽤新的配置,新建worker进程

4)新建成功,给旧的worker进程发送关闭消息

5)旧的worker进程收到信号会继续服务,直到把当前进程接收到的请求处理完毕后关闭

所以reload之后worker进程pid是发⽣了变化的​​​​​​​

worker进程处理请求部分的说明

例如,我们监听9003端⼝,⼀个请求到来时,如果有多个worker进程,那么每个worker进程都有可能处理这个链接。

master进程创建之后,会建⽴好需要监听的的socket,然后从master进程再fork出多个worker进程。所以,所有worker进程的监听描述符listenfd在新连接到来时都变得可读。

nginx使⽤互斥锁来保证只有⼀个workder进程能够处理请求,拿到互斥锁的那个进程注册listenfd读事件,在读事件⾥调⽤accept接受该连接,然后解析、处理、返回客户端

Nginx多进程模型好处

每个worker进程都是独立的,不需要加锁,节省开销

每个worker进程都是独立的,互不影响,一个异常结束,其他的能照样提供服务

多进程模型为reload热部署机制提供了支撑

拉钩教育高薪训练营学习笔记相关推荐

  1. 拉勾教育Java训练营学习感受/学习笔记--MyBatis

    拉勾教育Java训练营学习感受/学习笔记–MyBatis 文章目录 拉勾教育Java训练营学习感受/学习笔记--MyBatis 1.普通jdbc操作流程以及问题 1.1 流程 1.2 问题 2.自定义 ...

  2. 单例设计模式(拉勾教育大数据学习笔记)

    单例设计模式的概念: 在某些特殊场合中,一个类对外提供且只提供一个对象时,这样的类叫做单例类,而设计单例的流程和思想叫做单例设计模式. 单例设计模式的实现流程: 1. 私有化构造方法,使用privat ...

  3. 拉勾教育大数据高薪训练营学习心得与笔记(开启属于自己的The Way To God)

    目录 改变/坚持/努力/成神 一.Before The Way To Lagou 1.个人经历 2.认识拉钩 3.选择拉钩 4.心里话!!! 二.After The Way To Lagou 1.课程 ...

  4. python 下载拉钩教育AES加密视频

    说在前面: 下面我们要爬取的是拉钩教育课程上面的视频,课程已经购买过了.但是由于没有提供缓冲和下载视频的功能,所以就打算把视频通过python给下载下来,以下的文章都是参考博友的,自己总结下并学习学习 ...

  5. Python爬虫实现全自动爬取拉钩教育视频

    ps:改良之后的多线程版本在最后 背景 大饼加了不少技术交流群,之前在群里看到拉钩教育平台在做活动,花了1块钱买了套课程.比较尴尬的是大饼一般都会在上下班的路中学习下(路上时间比较久)而这个视频无法缓 ...

  6. 算法训练营学习笔记1

    算法训练营学习笔记 贪心算法 心算法总是做出当前最好的选择,期望通过局部最优选择得到全局最优的解决方案.从问题的初始解开始,一步歩地做出当前最好的选择,逐步逼近问题的目标,尽可能得到最优解: 贪心本质 ...

  7. 05_01_拉钩教育课程管理系统之一:项目介绍

    任务一 项目介绍与后台系统搭建 1. 项目架构 1.1 项目介绍 ​ 拉钩教育后台管理系统,是提供给拉钩教育的相关业务人员使用的一个后台管理系统, 业务人员可以在这个后台管理系统中,对课程信息.讲师信 ...

  8. 阿里云趣味视觉AI训练营学习笔记Day 5

    阿里云趣味视觉AI训练营学习笔记Day 5 学习目标 学习内容 前言 一.创建人像卡通化应用 二.应用配置 三.后端服务开发部署 四.小程序前端开发 阿里云高校计划,陪伴两千多所高校在校生云上实践.云 ...

  9. ECS 7天实践训练营学习笔记——DAY5

    ECS 7天实践训练营学习笔记--DAY5 今日份学习--阅读阿里云<7天学会ECS> 前言 一. ECS概述 二. ECS产品架构 三. ECS管理软件 四. 基于ECS的各种搭建 今日 ...

最新文章

  1. 20170401 11G Deprecated Attributes for LOG_ARCHIVE_DEST_n
  2. Hive表与hdfs文件关联
  3. Android之自定义标题
  4. Jenkins: 执行 PowerShell 命令
  5. 9.28 linux系统基础优化
  6. java 不执行构造函数_函数作为构造函数执行,但不作为函数执行
  7. 7种方法让你养出干净的肺
  8. Spring 框架基础(06):Mvc架构模式简介,执行流程详解
  9. 使用UWP人脸检测API在WPF中进行人脸检测
  10. 列表 list的技巧
  11. php代码输出sql语句,教你在Laravel中轻松容易的输出完整的SQL语句
  12. DAG(有向无环图)有向树 转换为树
  13. 管理感悟:独当一面,很难
  14. 修电脑入门名词及等级划分
  15. 备案指的是域名还是服务器?
  16. Java实现九宫格游戏
  17. html 调用es2015模块,给大家分别介绍一下CommonJS和ES2015的import
  18. 微信小程序支付PHP实例
  19. 让SVG 自己动起来!SMIL animation动画详解
  20. virtio网络Data Plane卸载原理——vhost protocol

热门文章

  1. 研究生博士生都喜欢逛哪些网站?
  2. 冰河指南AI技术社区基于ChatGPT正式启动运营
  3. 28335之GPIO输出
  4. 大话人机混合智能中深度情境意识
  5. 【Python机器学习】01_机器学习概述
  6. 如何防止验证码接口被恶意攻击
  7. 虚拟机安装Linux系统
  8. 下载的问题,attachment什么意思??
  9. PTA团体天梯赛汇总
  10. 移动支付进入下半场 BAT将各自为王