目录
一. Tomcat 系统架构与原理剖析
b/s(浏览器/服务器模式) 浏览器是客户端(发送http请求) ———> 服务器端
(一)浏览器访问服务器的流程
http 请求的处理过程
注意:浏览器访问服务器使⽤的是 Http 协议, Http 是应⽤层协议,⽤于定义数据通信的格式,具体的数据传输使⽤的是 TCP/IP 协议。
(二)Tomcat 系统总体架构
1. 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 容器
2. 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 服务器会把响应发送给客户端
3. Tomcat 系统总体架构
通过上⾯的讲解,我们发现tomcat有两个⾮常重要的功能需要完成
1 )和客户端浏览器进⾏交互,进⾏ socket 通信,将字节流和 Request/Response 等对象进⾏转换
2 ) Servlet 容器处理业务逻辑
Tomcat 设计了两个核⼼组件 连接器( Connector ) 和 容器( Container ) 来完成 Tomcat 的两⼤核⼼功能。
连接器,负责对外交流: 处理 Socket 连接,负责⽹络字节流与 Request 和 Response 对象的转化;
容器,负责内部处理: 加载和管理 Servlet ,以及具体处理 Request 请求;
(三)Tomcat 连接器组件 Coyote
1. 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 模型,如下:
在 8.0 之前 , Tomcat 默认采⽤的 I/O ⽅式为 BIO ,之后改为 NIO 。 ⽆论 NIO 、 NIO2 还是 APR , 在性能⽅⾯均优于以往的 BIO 。 如果采⽤ APR , 甚⾄可以达到 Apache HTTP Server 的影响性能。
2. Coyote 的内部组件及流程
Coyote 组件及作⽤
(四)Tomcat Servlet 容器 Catalina
1. Tomcat 模块分层结构图及Catalina位置
Tomcat 是⼀个由⼀系列可配置( conf/server.xml )的组件构成的 Web 容器,⽽ Catalina 是 Tomcat 的
servlet 容器。
从另⼀个⻆度来说, Tomcat 本质上就是⼀款 Servlet 容器 , 因为 Catalina 才是 Tomcat 的核⼼ , 其他模块都是为 Catalina 提供⽀撑的。 ⽐如 : 通过 Coyote 模块提供链接通信, Jasper 模块提供 JSP 引 擎, Naming 提供 JNDI 服务, Juli 提供⽇志服务。
2. Servlet 容器 Catalina 的结构
Tomcat (我们往往有⼀个认识, Tomcat 就是⼀个 Catalina 的实例,因为 Catalina 是 Tomcat 的核⼼)
Tomcat/Catalina 实例。
其实,可以认为整个 Tomcat 就是⼀个 Catalina 实例, Tomcat 启动的时候会初始化这个实例, Catalina实例通过加载 server.xml 完成其他实例的创建,创建并管理⼀个 Server , Server 创建并管理多个服务, 每个服务⼜可以有多个 Connector 和⼀个 Container 。
⼀个 Catalina 实例(容器)
⼀个 Server 实例(容器)
多个 Service 实例(容器)
每⼀个 Service 实例下可以有多个 Connector 实例和⼀个 Container 实例
- Catalina 负责解析Tomcat的配置⽂件(server.xml) , 以此来创建服务器Server组件并进⾏管理
- Server 服务器表示整个Catalina Servlet容器以及其它组件,负责组装并启动Servlaet引擎,Tomcat连接器。Server通过实现Lifecycle接⼝,提供了⼀种优雅的启动和关闭整个系统的⽅式
- Service 服务是Server内部的组件,⼀个Server包含多个Service。它将若⼲个Connector组件绑定到⼀个Container 。
- Container 容器,负责处理⽤户的servlet请求,并返回对象给web⽤户的模块
3. 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中
二. Tomcat 服务器核⼼配置详解
(一)主要标签结构如下:
(二)Server 标签
(三)Service 标签
(四)Executor 标签
(五)Connector 标签
Connector 标签⽤于创建链接器实例
默认情况下, server.xml 配置了两个链接器,⼀个⽀持 HTTP 协议,⼀个⽀持 AJP 协议
⼤多数情况下,我们并不需要新增链接器配置,只是根据需要对已有链接器进⾏优化
可以使⽤共享线程池
(六)Engine 标签
Engine 表示 Servlet 引擎
(七)Host 标签
Host 标签⽤于配置⼀个虚拟主机
(八)Context 标签
Context 标签⽤于配置⼀个Web应⽤,如下: