【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">