一、概述

概述

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器

核心功能

Tomcat 实现 2 个核心功能:

  • 处理 Socket 连接,负责网络字节流与 Request 和 Response 对象的转化。(连接器(Connector)
  • 加载和管理 Servlet,以及具体处理 Request 请求。(容器(Container)

因此 Tomcat 设计了两个核心组件连接器(Connector)和容器(Container)来分别做这两件事情。连接器负责对外交流,容器负责内部处理。

二、Tomcat目录结构

image.png

2.1、一级目录详解

image.png
1
2
3
4
5
6
7
8
- Tomcat
- bin: 用于存放 Tomcat的启动、停止等批处理脚本和Shell脚本
- conf: 用于存放 Tomcat的相关配置文件
- lib: Tomcat服务器依赖库目录,包含 Tomcat服务器运行环境依赖lar包
- logs: Tomcat默认的日志存放路径
- temp: 存放tomcat在运行过程中产生的临时文件
- webapps: Tomcat默认的Web应用部署目录
- work: 存放Web应用JSP代码生成和编译后产生的class文件目录

2.2、二级目录详解

2.2.1、bin

主要用于Tomcat的启停

1
2
3
4
5
- bin
- startup.bat: 用于在 Windows下启动 Tomcat
- startup.sh: 用于在 Linux下启动 Tomcat
- shutdown.bat: 用于在 Windows下停止 Tomcat
- shutdown.sh: 用于在 Linux下停止 Tomcat

2.2.2、conf

主要用于修改Tomcat的配置文件,比如修改server.xml中默认端口号等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
- conf
- Catalina: 用于存储针对每个虚拟机的 Context 配置
- context.xml: 用于定义所有Web应用均需要加载的 Context 配置,
如果Web应用指定了自己的context.xml,那么该文件的配置将被覆盖
- catalina.properties: Tomcat环境变量配置
- catalina.policy: 当 Tomcat在安全模式下运行时,此文件为默认的安全策略配置
- logging.properties: Tomcat日志配置文件,可通过该文件修改 Tomcat日志级别以及日志路径等
- server.xml: Tomcat服务器核心配置文件,用于配置 Tomcat的监听端口、处理请求的虚拟主机等。
可以说,Tomcat主要根据该文件的配置信息创建服务器实例
- tomcat-users.xml: 用于定义 Tomcat默认用户及角色映射信息,
Tomcat的 Manager模块即用该文件中定义的用户进行安全认证
- web.xml: Tomcat中所有应用默认的部署描述文件,主要定义了基础 Servlet和MIME映射。
如果应用中不包含 Web. xml,那么 Tomcat将使用此文件初始化部署描述,
反之,Tomcat会在启动时将默认部署描述与自定义配置进行合并

2.2.3、webapps

编写程序的目录

1
2
3
4
5
6
7
8
9
10
11
12
13
- webapps: Tomcat服务器的web目录
- ROOT
- mynet: 网站目录名
- WEB-INF
- classs: java程序
- lib: web应用依赖的jar包
- jsp: 存放jsp
- web.xml: 网站配置文件
- index.html: 默认的首页
- static
- css
- js
- img

三、Tomcat架构及流程梳理

3.1、Tomcat宏观架构

Tomcat主要由两大功能组成:Connector处理请求、Servletr容器Container

image.png

  • TCP&Socket】:服务器之间通过TCP进行通信,TCP是不能随意调的,提供了Socket接口用于调用

  • Tomcat】:Web 应用服务器

    • Server】:代表着整个服务器,整个 Tomcat 的生命周期由 Server 控制

      • Service】:主要包含两个部分(Connector和Container),用于对外提供服务

        • Connector】:用于处理连接,将Socketz字节流转化为Container可以识别的ServletRequest

          • ProtocolHandler】:Connector使用ProtocolHandler来处理请求
            • Endpoint】:用来实现TCP/IP协议,处理底层Socket的网络连接
              • Acceptor】:监听请求
              • Handler】:处理接收到的Socket,在内部调用Processor进行处理
              • AsyncTimeout】:检查异步Request的超时
            • Processor】:实现HTTP协议,将Endpoint接收到的Socket封装成Request和Response(org.apache.coyote.Request)
            • Adapter】:将Request转化为Container容器可以识别的ServletRequest、ServletResponse,,并交给Container
        • Container】:用于封装和管理Servlet,以及具体处理Request请求(Servlet容器)

          • Engine】:引擎,用来管理多个站点,一个Service最多只能有一个Engine在server.xml中配置

            • Host】:代表一个站点,也可以叫虚拟主机,通过配置Host就可以添加站点(webapps)在server.xml中配置
            • Context】:代表一个应用程序,对应着平时开发的一套程序,或者一个WEB-INF目录以及下面的web.xml文件(webapps子目录)在server.xml中配置
            • Wrapper】:每一Wrapper封装着一个Servlet(Servlet类),调用servlet的service()方法。在web.xml中配置

3.2、细节详解

3.2.1、Connector

  • 整体架构

    用于处理连接(Socket字节流与ServletRequest类和ServletResponse类相关的转化

    image.png

  • 处理连接流程

    image.png

  • Connector配置(Tomcat调优)

    org.apache.catalina.connector.Connector 是 “Tomcat” 的核心组件,负责协议的解析(由它持有的ProtocolHandler处理)以及相关处理等,并定义了运行中需要的相关配置项,包括支持协议,端口,以及解析相关参数等,可在conf/server.xml文件中对Connector进行配置

    Tomcat处理HTTP请求 详解Connector模块-张华

    注:对调优还没深入学习和实践,暂不做记录

3.2.2、Container

用于封装和管理Servlet,以及具体处理Request请求(Servlet容器)

  • 责任链模式

    责任链模式是指在一个请求处理的过程中有很多处理者依次对请求进行处理,每个处理者负责做自己相应的处理,处理完之后将处理后的结果返回,再让下一个处理者继续处理。

    image.png

  • 整体架构

    Container处理请求是使用Pipeline-Valve管道来处理的!(Valve是阀门之意)

    Pipeline-Valve使用的责任链模式和普通的责任链模式有些不同!区别主要有以下两点:

    • 每个Pipeline都有特定的Valve,而且是在管道的最后一个执行,这个Valve叫做BaseValve,BaseValve是不可删除的;
    • 在上层容器的管道的BaseValve中会调用下层容器的管道。

image.png

3.2.3、Servlet生命周期

Servlet原理.png

3.3、Tomcat运行流程

假设来自客户的请求为:https://baidu.com

image.png

【browser--->Connector】

1、监听8080(port=”8080” protocol=”HTTP/1.1”)获得请求

2、将Socket转化为Request和Response再转化为容器能识别的ServletRespoinse和ServletRequest

【Connector--->Container】

3、Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应

【Container】

4、Engine匹配到14.215.177.39的Host

5、Host匹配到路径为/test的Context(如果匹配不到就把该请求交给路径名为””的Context去处理)

6、Context匹配路径下的index.jsp,并匹配jsp中对应的servlet

7、ServletRespoinse和ServletRequest作为参数调用Servlet的Service方法构造HttpServletRequest对象和HttpServletResponse对象,并作为参数调用对应servlet的doGet或doPost方法

8、Context把执行完了之后的HttpServletResponse对象返回给Host

9、Host把HttpServletResponse对象返回给Engine

【Container--->Connector】

10、Engine把HttpServletResponse对象返回给Connector

【Connector--->browser】

11、Connector把HttpServletResponse对象返回给客户browser