tomcat架构分析及配置详解


浏览器访问服务器的流程

请求发起的过程:

注意:浏览器访问服务器使用的是http协议,http是应用层协议,而具体传输还是使用的TCP/IP协议

Tomcat系统总架构

2.1 Tomcat请求处理过程

一个http请求过来,Tomcat会接收,然后根据配置调用不同的servlet来进行处理。

为了解耦,设计了一个Tomcat容器:

因此,Tomcat不仅是一个http服务器,还是一个servlet容器。这也就是它的两个重要的功能:

  1. 和客户端浏览器交互,进行socket通信,将字节流和Request/Response对象进行转换
  2. Servlet容器处理逻辑

Tomcat设计了两个核心组件来完成这两大功能

  1. 连接器:处理Socket连接
  2. 容器:加载和管理Servlet

Servlet接口和Servlet容器这一整套内容叫做Servlet规范。

2.2 Tomcat Servlet容器处理流程

当用户请求某个URL资源时

  1. Http服务器会把请求信息使用ServletRuest对象封装起来
  2. 根据URL和Servlet的映射关系,找到对应的Servlet,进一步去某个具体的Servlet
  3. 如果Servlet还没有被加载,就用反射机制创建这个Servlet,并调用Servlet的init方法来完成初始化
  4. 接着调用这个具体的Servlet的service方法来处理请求,请求处理结果使用ServletResponse对象封装
  5. 把ServletResponse对象返回给HTTP服务器,HTTP服务器会把响应结果发送给客户端

Tomcat连接器组件 Coyote(开椰踢)

3.1 Coyote简介

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

  1. Coyote封装了底层的网络通信(Socket请求及响应)
  2. Coyote使容器组件与具体的请求协议及IO操作完全解耦
  3. Coyote 将Socket输入转换封装为Request对象,进一步封装后交由Servlet的容器处理,请求处理完成后,容器通过Coyote提供的Response对象将结果写入输出流
  4. Coyote负责的是具体协议(应用层)和IO(传输层)相关内容

Tomcat支持多种应用层协议和IO模型:

名称 应用层协议或IO模型 描述
应用层 HTTP/1.1 这时大部分Web应用采用的访问协议
应用层 AJP 用于和WX集成(如Apache),以实现对静态资源的优化以及集群部署,当前支持AJP/1.3
应用层 HTTP/2 HTTP2大幅度提升了Web性能。下一代HTTP协议,自8.5以及9.0版本之后支持。
传输层 NIO 非阻塞I/O,采用Java NIO类库实现
传输层 NIO2 异步IO,采用JDK7 的NIO2类库实现
传输层 APR 采用Apache可移植允许库实现,是C/C++编写的本地库。如果选择该方案,需要单独安装APR库

Tomcat8.0 以前,Tomcat默认采用的IO方式为BIO,之后改为了NIO。无论是NIO、还是NIO2,性能都是优于以往的BIO,如果采用APR,甚至可以达到Apache HTTP Server的影响性能。

Coyote组件及作用

组件 作用
EndPoint EndPoint 是 Coyote 通信端点,即通信监听的接?,是具体Socket接收和发送处理器,是对传输层的抽象,因此EndPoint?来实现TCP/IP协议的
Processor Processor 是Coyote 协议处理接? ,如果说EndPoint是?来实现TCP/IP协议的,那么Processor?来实现HTTP协议,Processor接收来?EndPoint的Socket,读取字节流解析成Tomcat Request和Response对象,并通过Adapter将其提交到容器处理,Processor是对应?层协议的抽象
ProtocolHandler Coyote 协议接?, 通过Endpoint 和 Processor , 实现针对具体协议的处理能?。Tomcat 按照协议和I/O 提供了6个实现类 : AjpNioProtocol ,AjpAprProtocol, AjpNio2Protocol,Http11NioProtocol ,Http11Nio2Protocol ,Http11AprProtocol
Adapter 由于协议不同,客户端发过来的请求信息也不尽相同,Tomcat定义了??的Request类来封装这些请求信息。ProtocolHandler接?负责解析请求并?成Tomcat Request类。但是这个Request对象不是标准的ServletRequest,不能?Tomcat Request作为参数来调?容器。Tomcat设计者的解决?案是引?CoyoteAdapter,这是适配器模式的经典运?,连接器调?CoyoteAdapter的Sevice?法,传?的是Tomcat Request对象,CoyoteAdapter负责将Tomcat Request转成ServletRequest,再调?容器

Tomcat Servlet容器 Catalina

Catalina是一款Servlet容器,且Catalina是Tomcat的核心。

它的结构如下:

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

每个Service实例下可以有多个Connector实例和一个Container实例

Container组件的具体结构:

  • Engine

表示整个Catalina的Servlet引擎,用来管理多个虚拟站点,一个Service最多只能有一个Engine,但是一个引擎可包含多个Host

  • Host

代表一个虚拟主机,或者说一个站点,可以给Tomcat配置多个虚拟主机地址,而一个虚拟主机下可包含多个Context

  • Context

表示一个Web应用程序,一个Web应用可包含多个Wrapper

  • Wrapper

表示一个Servlet,Wrapper作为容器中的最底层,不能包含子容器

Tomcat服务器核心配置

核心配置:conf/server.xml文件

主要结构如下:
一个Server根元素,有Listener、GlobalNamingResources、Service子标签

<?xml version="1.0" encoding="UTF-8"?>


  
  
  
 
  
 

Server标签详细:























...


Service标签



...

Executor标签



Connector标签

默认情况下,server.xml配置了两个链接器,一个支持HTTP协议,一个支持AJP协议。大多数情况下,我们不需要新增链接器配置,只需要对已有的链接器进行优化





可以使用共享线程池


Engine 标签

Engine表示Servlet引擎



...

Host标签


...

可以配置多个host访问不同的目录



        

      
      

        

      

Context 标签

不配做Context的时候,appBase配置的目录下的所有项目包都会被访问,如想访问appBase配置的目录下的ROOT2,只需要localhost:8080/ROOT2






相关