文章目录

  • 什么是Tomcat?
  • Tomcat的主要工作
  • Tomcat总体架构
    • 连接器
    • 容器
  • 请求定位流程

什么是Tomcat?

在Tomcat官方网站上是这样介绍的。

  • The Apache Tomcat® software is an open source implementation of the Jakarta Servlet, Jakarta Server Pages, Jakarta Expression Language, Jakarta WebSocket, Jakarta Annotations and Jakarta Authentication specifications. These specifications are part of the Jakarta EE platform.

  • The Jakarta EE platform is the evolution of the Java EE platform. Tomcat 10 and later implement specifications developed as part of Jakarta EE. Tomcat 9 and earlier implement specifications developed as part of Java EE.

简单点来说,Tomcat就是一个开源的,支持了Servlet等规范的Wer应用服务器,相对于JBoss或者WebLogic,它不包含EJB容器,对于CPU和内存的消耗也更小,应用部署和启动更简单,是一种轻量级的应用服务器。

Tomcat的主要工作

Tomcat可以理解为就是“HTTP服务器 + Servlet容器”,主要有两个核心的功能:

  1. 要解决浏览器与服务器之间的数据传输问题,所以需要管理Socket连接,负责网络信息流的处理
  2. 要遵循Servlet规范,加载和管理Servlet,以及处理Request和返回Reponse。

Tomcat总体架构

为了实现HTTP服务器+Servlet容器这两个核心的功能,Tomcat设计了Connector和Container两个组件来分别完成这两件事情,Connector负责HTTP服务器部分,Container负责容器内部处理。

连接器

既然Connector是负责HTTP服务器部分,那就要思考HTTP服务器最核心的功能到底有哪些,首先应该要有最基本的接受网络连接、读写网络数据流、协议解析,因此Tomcat也设计了相关的组件来分别对应上面的功能,他们分别是Endpoint,负责管理网络连接,Processor,负责协议解析,他们之间的关系是Endpoint负责接受网络连接并将网络中接收的数据流给到Processor,Processor负责解析协议,并将数据封装成Tomcat自己的Request、Response对象。

当然为了最终能够适配Servlet规范,Tomcat还设计了Adapter类,专门用于将TomcatRequest/Response转换成ServletRequest/ServletResponse。

所以我们梳理下他们的关系大致如下图所示

容器

连接器部分了解后,接下来就是容器了,Tomcat设计了4种容器,分别为:Engine、Host、Context和Wrapper,他们之间是一种父子关系,这一点实际上我们通过Tomcat的server.xml配置文件也能看得出来。

Engine表示引擎,是每个请求的入口点,用于分析处理请求中包含的HTTP头部信息,并将其传递给合适的虚拟主机,一个Service最多只能有一个Engine。

Host就表示一个虚拟主机,一个Tomcat可以配置多个虚拟主机,一个虚拟主机又可以配置多个Web应用程序。

Context表示一个Web应用程序。

Wrapper表示一个Servlet。

请求定位流程

所以根据Tomcat架构设计来看,总体请求流程应该是这样的:

  1. 首先我们知道默认不修改的Service的情况下,Tomcat默认会监听8080端口,并按照HTTP协议对请求进行解析,这主要由连接器中的各个组件来完成。
  2. 当确认连接器之后,也就确认了容器中的Service和Engine。
  3. 接下来,通过解析URL中的域名,就可以找到相应的Host。
  4. 再通过URL中的路径,又可以找到相应的Context。
  5. 最后根据web.xml中配置的Servlet映射路径找到具体的Wrapper。