1. Tomcat系统架构

  1.1 Tomcat请求处理大致过程

  Tomcat是一个Http服务器(能够接收并且处理http请求),当使用浏览器发起请求,发出的是http请求,http服务器接收到这个请求之后,会调用具体的程序(java类)进行处理,不同的请求由不同的java类完成处理。

 

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

Tomcat按照servlet规范的要求实现了servlet容器,同时它具有http服务器的功能。

 1.2 处理流程

用户请求URL资源时,有以下过程。

 

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

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

3)servlet容器拿到请求后,根据url和servlet的映射关系,找到具体的servlet

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

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

6)把这个对象返回给http服务器,然后把响应发送给客户端

1.3 总体架构

 

 tomcat两大核心组件连接器和容器。连接器负责处理socket连接,负责网络字节流与request和response对象的转化,容器负责加载和管理servlet,处理具体request请求。

2. tomcat连接器组件Coyote

2.1 简介

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

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

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

3)将socket输入转化封装为request对象,进一步交由Catalina容器进行处理,处理请求完成后,Catalina通过Coyote提供的response对象将结果写入输出流。

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

 支持的IO模型与协议如下图所示:

 

 默认的协议的http/1.1,8.0之后默认的IO模型是NIO,之前是BIO。

2.2  Coyote的内部组件及流程

 

 

 

 

3. Tomcat Servlet容器 Catalina

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

 

 通过coyote模块提供连接通信,Jasper模块提供jsp引擎,naming提供jndi服务,juli提供日志服务。

tomcat本质上是servlet容器,Catalina是tomcat的核心,其他模块都是为Catalina提供支撑的。

 

可以认为 tomcat是一个Catalina实例。tomcat启动时会初始化这个实例。

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

 server:表示整个Catalina servlet容器及其他组件,负责组装并启动servlet引擎,tomcat连接器,server通过实现LifeCycle接口,提供了一种优雅的启动和关闭整个系统的方式。

service:server内部的组件,一个server包含多个service,将若干个connector组件绑定到一个container

container:负责处理用户的servlet请求,并返回对象给web用户模块。

engine:整个Catalina的servlet引擎,管理多个模拟站点,一个service最多只有一个engine

host:代表虚拟主机,或者说一个站点,可以给tomcat配置多个虚拟主机地址

context:表示一个web应用程序

wrapper:表示一个servlet,wrapper作为 容器的最底层,不能包含子容器。

4. 核心配置

核心配置在tomcat目录下conf/server.xml文件。

主要标签如下:

 

 server标签:

 

 

 

 service标签

 

 Executor标签

 

 connector标签:

用于创建连接器的实例,配置了两个连接器,一个支持http协议,一个支持ajp协议,默认情况下不需要新增连接器配置,只是根据对已有的连接器进行优化。

 

 Engine标签:表示servlet引擎。

 

 Host标签:用于配置一个虚拟主机

 

posted on 2021-07-18 11:43  jeolyli  阅读(49)  评论(0编辑  收藏  举报