【Java高级工程师蜕变之路】023 Tomcat高级使用及原理
什么是bs模式
browser/server:浏览器、服务器
浏览器客户端发起http请求到服务器,服务器返回结果给浏览器,浏览器展示返回的内容
浏览器访问服务器的流程
http请求处理过程
浏览器访问服务器使用的http协议,http是应用层协议,定义了数据通信的格式
具体的传输由传输层控制,使用的是TCP/IP协议
Tomcat的系统架构
tomcat是一个http服务器,能够接收并处理http请求
Tomcat请求处理流程
浏览器发起请求->远端服务器接收请求,调用java类处理对应的请求
http请求到达服务器之后,会交给Servlet容器来处理,Servlet通过Sevlet接口调用业务类。
Servlet容器和Servlet接口的整套内容叫做Servlet规范
最新的Servlet规范是Servlet5.0
https://jakarta.ee/specifications/servlet/5.0/jakarta-servlet-spec-5.0.html
Tomcat按照Servlet规范实现了Servlet容器,兼备Servlet和http的功能
Tomcat的双重身份
1、http服务器
2、Servlet容器
Tomcat Servlet容器处理流程
请求通过某个特定的URL到达服务器
1、http服务器把请求封装成SevletRequest对象
2、调用Servlet容器中的某个Sevlet
3、在上一步骤中,Servlet容器通过URL与Sevlet的映射关系,找到对应的Servlet
4、如果Servlet没有加载,就使用反射创建Servlet,并调用init方法初始化这个Servlet
5、调用Servlet的service方法处理请求,并将结果封装成ServletResponse对象
6、ServletResponse对象返回给浏览器,浏览器渲染页面
Tomcat总体系统架构
Tomcat的两个重要功能
1、和客户端浏览器交互,通过socket通信,将字节流与ServletRequest和ServletResponse进行转换
2、Servlet容器处理业务逻辑
Tomcat的2大角色对应了两个核心组件
连接器(Connector)和容器(Container)
连接器:对外交流,socket链接,处理字节流与Request和Response的转换
容器:对内管理,加载和管理Servlet,处理Request请求
Tomcat的连接器组件 Coyote
Coyote简介
客户端通过 Coyote 与服务器建立链接,发送请求并接收响应
1、Coyote 封装了底层网络通信 (接收请求与响应处理)
2、Coyote 使得 Catania 容器与具体的协议和I/O操作方式解耦
3、Coyote将Socket输入转换封装成Request对象,进一步封装之后交给 Catania 容器处理,处理完成之后,Catania通过Coyote将Response对象的结果写入到输出流
4、Coyote 负责的是具体协议(应用层)和I/O(传输层)
Coyote 支持的IO模型与协议
8.0之前Tomcat的默认IO方式为BIO,8.0之后为NIO,性能要优于BIO,APR是本地库,性能最佳,但是需要操作系统底层支持,要安装可移植库
Coyote的内部组件
Coyote 组件的作用
Tomcat的Servlet容器 Catania
Tomcat的分层结构以及Catania的位置
Tomcat是有一系列配置 conf/server.xml 构成的Web容器,而Catania 则是Servlet容器。
Tomcat的本质是Servlet容器,Catania是啥Tomcat的核心,其他组件都是为Catania服务的。
Jasper是处理jsp的,naming提供JNDI,juli提供日志服务。
Servlet容器Catania的结构
Tomcat/Catalina实例
一个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用户的模块
Container组件的具体结构
Engine
表示整个Catalina的Servlet引擎,用来管理多个虚拟站点,一个Service最多只能有一个Engine, 但是一个引擎可包含多个Host
Host
代表一个虚拟主机,或者说一个站点,可以给Tomcat配置多个虚拟主机地址,而一个虚拟主机下
可包含多个Context
Context
表示一个Web应用程序, 一个Web应用可包含多个Wrapper
Wrapper
表示一个Servlet,Wrapper 作为容器中的最底层,不能包含子容器
上述组件的配置其体现在 conf/server.xml
中
Tomcat的核心配置
Tomcat 作为服务器的配置,主要是 server.xml 文件的配置;
server.xml中包含了 Servlet容器的相关配置,即 Catalina 的配置;
server.xml 的主要结构
Server 根元素,创建一个Server实例,子标签有 Listener、GlobalNamingResources、
Service
-->
Server 标签
port:关闭服务器的监听端口 shutdown:关闭服务器的指令字符串
-->
...
Service标签
...
Executor标签
Connector 标签
用于创建连接器实例
默认配置了两个连接器,一个支持http,一个支持AJP
使用共享线程池
protocol="HTTP/1.1"
executor="commonThreadPool"
maxThreads="1000"
minSpareThreads="100"
acceptCount="1000"
maxConnections="1000"
connectionTimeout="20000"
compression="on"
compressionMinSize="2048"
disableUploadTimeout="true"
redirectPort="8443"
URIEncoding="UTF-8" />
Engine标签
Engine表示Sevlet引擎
name: 用于指定Engine 的名称, 默认为Catalina
defaultHost:默认使用的虚拟主机名称, 当客户端请求指向的主机无效时, 将交由默认的虚拟主机处 理, 默认为localhost
-->
...
Host标签
用于配置虚拟主机
...
Context标签
Context标签表示一个具体的Web应用
autoDeploy="true">