【转】Tomcat相关面试题,看这一篇就够了!

article/2025/9/20 1:07:09

转自公众号:Java思维导图

Tomcat相关的面试题出场的几率并不高,正是因为如此,很多人忽略了对Tomcat相关技能的掌握。下面这篇文章整理了Tocmat相关的系统架构,介绍了Server、Service、Connector、Container之间的关系,各个模块的功能,可以说,把这几个掌握住了,Tomcat相关的面试题你就不会有任何问题了!另外,在面试的时候你还要有意识无意识的往Tomcat这个地方引,就比如说常见的Spring MVC的执行流程,一个URL的完整调用链路,这些相关的题目你是可以再往Tomcat处理请求的这个过程去说的!掌握住Tomcat的这些技能,面试官一定会佩服你的。

学了本节之后,你应该明白的是:

  • Server、Service、Connector、Container四大组件之间的关系和联系,以及他们的主要功能点;
  • Tomcat执行的整体架构,请求时如何被一步步处理的;
  • Engine、Host、Context、Wrapper相关的概念关系;
  • Container是如何处理请求的;
  • Tomcat用到的相关设计模式;

一、Tomcat顶层架构

俗话说,站在巨人的肩膀上看世界,一般学习的时候也是先总览一下整体,然后各个击破,最后形成思路,了解具体细节。Tomcat的结构很复杂,但是Tomcat非常模块化,找到了Tomcat最核心的模块,问题才可以游刃而解。了解Tomcat的整体架构对以后深入了解Tomcat来说至关重要!

先上一张Tomcat的顶层结构图,如下:

Tomcat中最顶层的容器室Server,代表着整个服务器,从上图中可以看出,一个Server可以包含至少一个Service,用于具体提供服务。

Service主要包含两个部分:Connector和Container。从上图中可以看出,Tomcat的心脏就是这两个组件,他们的作用如下:

1、Connector用于处理连接相关的事情,并提供Socket与Request和Response相关的转化;

2、Container用于封装和管理Servlet,以及具体处理Request请求;

一个Tomcat中只有一个Server,一个Server可以包含多个Service,一个Service只有一个Container,但是可以有多个Connectors,这是因为一个服务可以提供多个连接,如同是提供Http和Https链接,也可以提供相同协议下不同端口的连接,示意图如下(Engine、Host、Context下边会说明):

多个Connector和一个Container就组成了一个Service,有了Service就可以对外提供服务了。但是Service还要一个生存环境,必须要有人能够给他生命、掌握其生死大权,那就非Server莫属了!整个Tomcat的生命周期由Server控制。

另外,上午的包含关系,或者说父子关系,都可以在tomcat的conf目录下的server.xml配置文件中看出,下图是删除了注释内容之后的一个完整的server.xml配置文件(Tomcat版本为8.0):

详细的配置文件内容可以到Tomcat官网查看:http://tomcat.apache.org/tomcat-8.0-doc/index.html

上面的配置文件,还可以通过下边的一张结构图更清楚的理解:

Server标签设置的端口号为8005,shtudown="SHUTDOWN",标示在8005端口监听"SHUTDOWN"命令,如果接收到了,就会关闭Tomcat。一个Server有一个Service,当然还可以配置多个Service,Service左边的内容都属于Container,Service下边是Connector。

二、Tomcat顶层架构小结

1、Tomcat只有一个Server,一个Server可以有多个Connector和一个Container;

2、Server掌管着整个Tomcat的生死大权;

3、Service是对外提供服务的;

4、Connector用于接收请求并将请求封装成Request和Response来具体处理;

5、Container用于封装和管理Servlet,以及具体处理Request请求;

知道了整个Tomcat顶层的分层架构和各个组件之间的关系以及作用,对于绝大多数的开发人员来说,Server和Service对我们来说确实很遥远,而我们开发中绝大部分进行配置的内容是属于Conector和Container的,所以接下来介绍一下Connector和Container.

三、Connector和Container的微妙关系

由上述内容,我们大概可以知道一个请求发送到Tomcat之后,首先经过Service,然后会交给我们的Connector,Connector用于接收请求并将请求封装为Request和Response来具体处理,Request和Response封装完之后再交给Container进行处理,Container处理完请求之后再返回给Connector,最后再由Connector通过Socket将处理的结果返回给客户端,这样整个请求就处理完了!

Connector最底层使用的是Socket来进行连接的,Request和Response是按照HTTP协议来封装的,所以Connector同时需要实现TCP/IP协议和HTTP协议!

Tomcat既然处理请求,那么肯定需要先接受到这个请求,接受请求的这个东西我们首先就需要看一下Connector!

四、Connector架构分析

Connector用于接收请求并将请求封装成Request和Response,然后交给Container进行处理,Container处理完之后再交给Connector返回给客户端。

因此,我们可以把Connector分为四个方面进行理解:

1、Connector如何接收请求的?

2、如何将请求封装为Request和Response的?

3、封装完之后的Request和Response如何交给Container进行处理的?

4、Container处理完之后如何交给Connector并返回给客户端的?

首先看一下Connector的结构图,如下所示:

Connector就是通过ProtocolHandler来处理请求的,不同的是ProtocolHandler代表不同的连接类型,比如:HTTP11Protocol使用的是普通的Socket来连接的,HTTP11NipProtocol使用的是NioSocket来连接的。

其中,ProtocolHandler包含了三个部件:Endpoint、Processor、Adapter:

1、Endpoint用来处理底层Socket的网络连接,Processor用于将Endpoint接收的Socket封装成Request,Adapter用于将Request交给Container进行具体的处理。

2、Endpoint由于是处理底层Socket连接,因此Endpoint是用来实现TCP/IP协议的,而Porcessor用来实现Http协议的,Adapter将请求适配到Servlet容器进行具体的处理。

3、Endpoint的抽象实现AbstractEndpoint里面定义的Acceptor和AsyncTimeout两个内部类和一个Handler接口。Acceptor用于监听请求,AsyncTimeout用于检查异步Request的超时,Handler用于处理接收到的Socket,在内部调用Processor进行处理。

至此,我们应该额可以回答(1) (2) (3)的问题了,但是(4)还是不知道,那么我们就来看一下Container是如何进行处理以及将处理完之后的结果返回给Connector的?

五、Container架构分析

Container用于封装和管理Servlet,以及具体处理Request请求,在Container内部包含了四个子容器,结构图如下:

4个子容器的作用分别是:

1、Engine:引擎,用来管理多个站点,一个Service最多只能有一个Engine;

2、Host:代表一个站点,也可以叫虚拟主机,通过配置Host就可以添加站点;

3、Context:代表一个应用程序,对应着平时研发的一套程序,或者igeWEB-INF目录以及下面的web.xml文件

4、Wrapper:每一个Wrapper封装这一个Servlet;

下面找一个Tomat文件目录对照一下,如下图所示:

Context与Host的区别是,Context表示一个应用,我们的Tomcat中默认的配置下webapps下的每一个文件夹目录都是一个Context,其中ROOT目录中存放着主应用,其它目录存放着子应用,而整个webapps就是一个Host站点。

我们访问应用Context的时候,如果是ROOT下的则直接使用域名就可以访问,例如:www.ledouit.com,如果是Host(webapps)下的其它应用,则可以使用www.ledouit.com/docs进行访问,当然默认制定的跟应用(ROOT)是可以进行设定的,只不过Host站点下默认的主应用是ROOT目录下的。

看到这里,我们知道Container是什么,但是还是不知道Container是如何进行处理的以及处理完之后是如何将处理完的结果返回给Connector的?别急!下边就开始探讨一下Container是如何进行处理的!

六、Container如何处理请求的

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

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

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

1、每个Pileline-Value都有特定的Value,而且是在管道的最后一个执行,这个Value叫做BaseValue,BaseValue是不可删除的;

2、在上层容器的管道的BaseValue中会调用下层容器的管道。

我们知道Container容器包含四个子容器,而这四个子容器对应的BaseValue分别在:StandardEngineValue、StandardHostValue、StandardContextValue、StandardWrapperValue。

Pipeline的处理流程图如下:

1、Connector在接收到请求后会首先调用最顶层容器的Pipeline来处理,这里的最顶层容器的Pileline就是EnginePileline(Engine的管道);

2、在Engine的管道中依次会执行EngineValue1、EngineValue2等等,最后会执行StandardEngineValue,在StandardEngineValue中会调用Host管道,然后再依次执行Host的HostValue1、HostValue2等,最后再执行StandardHostValue,然后在依次调用Context和Wrapper管道,最后执行到StandardWrapperValue。

3、当执行StandardWrapperValue的时候,会在StandardWrapperValue中创建FilterChain,并调用其doFilter方法来处理请求,这个FilterChain包含着我们配置的与请求相匹配的Filter和Servlet,其doFilter方法会依次调用所有的Filter的doFilter方法和Servlet的service方法,这样请求就得到了处理!

4、当所有的PIpeline-Value都执行完之后,并且处理完了具体的请求,这个时候就可以将返回的结果交给Connector了,Connector在通过Socket的方式将结果返回给客户端。

七、总结

至此,我们已经对Tomcat的整体架构有了大致的了解,前面4个图可以看出来每一个足迹的基本要素和作用。我们在脑海里应该有一个大概的轮廓了!如果你面试的时候,让你简单的聊一下Tomcat,上面的内容你能脱口而出吗?当你能够脱口而出的时候,这位面试官一定会对你刮目相看的!


http://chatgpt.dhexx.cn/article/0DDRpW5H.shtml

相关文章

10道Mybatis经典面试题,赶快上车吧!⚡⚡⚡⚡

1.Mybatis中#{}和${}的区别是什么? 1.1 #{}方式能够很大程度防止sql注入(安全); ${}方式无法防止Sql注入。 1.2 在JDBC能使用占位符的地方,最好优先使用#{}; 在JDBC不支持使用占位符的地方,就…

mybatis面试题 一

一、MyBatis工作原理? 1、 创建SqlSessionFactory 2、 通过SqlSessionFactory创建SqlSession 3、 通过sqlsession执行数据库操作 4、 调用session.commit()提交事务 5、 调用session.close()关闭会话 1)读取 MyBatis 配置文件:mybatis-c…

Java面试题Tomcat的优化经验

来源:传智论坛 Tomcat作为Web服务器,它的处理性能直接关系到用户体验,下面是几种常见的优化措施: 一、掉对web.xml的监视,把jsp提前编辑成Servlet。有富余物理内存的情况,加大tomcat使用的jvm的内存 二、服…

Tomcat相关面试题,看这篇就够了!保证能让面试官颤抖!

Tomcat相关的面试题出场的几率并不高,正式因为如此,很多人忽略了对Tomcat相关技能的掌握,下面这一篇文章最早发布在知识星球,整理了Tomcat相关的系统架构,介绍了Server、Service、Connector、Container之间的关系&…

【Tomcat专题】简单认识一下Tomcat总体架构

文章目录 什么是Tomcat?Tomcat的主要工作Tomcat总体架构连接器容器 请求定位流程 什么是Tomcat? 在Tomcat官方网站上是这样介绍的。 The Apache Tomcat software is an open source implementation of the Jakarta Servlet, Jakarta Server Pages, Jaka…

四张图带你了解Tomcat系统架构--让面试官颤抖的Tomcat回答系列!

俗话说,站在巨人的肩膀上看世界,一般学习的时候也是先总览一下整体,然后逐个部分个个击破,最后形成思路,了解具体细节,Tomcat的结构很复杂,但是 Tomcat 非常的模块化,找到了 Tomcat最…

Tomcat常见面试题

1、tomcat有哪些组件? 2、tomcat有哪些Connector? http ajp 3、tomcat的Valve的作用是什么? 给每一个虚拟主机定义访问日志 4、servlet的生命周期? Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过…

【金三银四】Tomcat面试题(2021最新版)

目录 前言 1、Tomcat的缺省端口是多少,怎么修改? 2、tomcat 有哪几种Connector 运行模式(优化)? 3、Tomcat有几种部署方式? 4、tomcat容器是如何创建servlet类实例?用到了什么原理? 5.tomcat 如何优化…

Tomcat面试题(2020最新版)

文章目录 Tomcat是什么?Tomcat的缺省端口是多少,怎么修改tomcat 有哪几种Connector 运行模式(优化)?Tomcat有几种部署方式?tomcat容器是如何创建servlet类实例?用到了什么原理?Tomcat工作模式Tomcat顶层架构…

「面试必背」Tomcat面试题(收藏)

「面试必背」Tomcat面试题(建议收藏) 2022-04-27 16:31java柚子茶 前言 在工作中,作为 Java 开发的程序员,Tomcat 服务器是大家常用的,也是很多公司现在正在用的。但是,在系统并发量比较大的情况下&…

Tomcat面试题(总结最全面的面试题)

Tomcat是什么? Tomcat 服务器Apache软件基金会项目中的一个核心项目,是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首…

【面试】Tomcat面试题

文章目录 Tomcat是什么?Tomcat的缺省端口是多少,怎么修改怎么在Linux上安装Tomcat怎么在Linux部署项目Tomcat的目录结构类似Tomcat,发布jsp运行的web服务器还有那些:tomcat 如何优化?tomcat 有哪几种Connector 运行模式…

Linux面试问题---常用命令

Linux面试问题---常用命令 1、cd命令 用于切换当前目录,参数是要切换到的目录的路径。 Cd /root/Documents #切换到/root/Documents目录Cd ./path 切换到当前目录下的path目录 Cd ../path 切换到上层目录下的path目录 2、ls命令 查看文件与目录的命令 3、grep…

Linux命令面试突击

Linux 命令常见面试题总结。 其它面试知识点突击整理: 序号文章1Java基础面试突击2JVM面试突击3设计模式面试突击4并发编程面试突击5消息队列Kafka面试突击6Redis面试突击7计算机网络面试突击8Spring面试突击9Dubbo面试突击10MyBatis面试突击11操作系统面试突击12…

Linux面试题(2020最新版)

Java面试总结(2021优化版)已发布在个人微信公众号【技术人成长之路】,优化版首先修正了读者反馈的部分答案存在的错误,同时根据最新面试总结,删除了低频问题,添加了一些常见面试题,对文章进行了…

Linux面试问题

grep和find的区别? 所以简单点说说,grep是查找匹配条件的行,find是搜索匹配条件的文件。 find /dir -name filename grep的使用干货: ls -l | grep ^a 通过管道过滤ls -l输出的内容,只显示以a开头的行。 grep test…

Linux面试总结

一.常用命令 1.目录切换 cd / 切换到根目录 cd ../ 切换到上级目录 cd ~ 切换到home目录 2.查看目录 ls 列出当前目录下所有的文件 ls [路径] ls / 查看根目录 ls -l 相当于 ll 最常用的命令,用了表的方式列出当前目录的内容 3.查看当前目录 pwd- 4.创建一组空文件 touch 5.显…

Linux面试相关知识点看着一文就够了

今天和大家分享一下linux操作系统下主要用到的几个知识点,分别是:linux目录结构、linux常用命令、文件权限操作、服务操作、yum安装命令、docker服务、vim编译器、pymysql测试连接、用户及组命令、mysql创建用户和数据库 目录 一、linux目录结构 二、l…

面试要求 熟悉linux系统,Linux面试中最常问的10个问题总结

前言 如果你要去面试一个linux系统运维工程师的职位,下面这十个最常见的问题一定要会,否则你的面试可能就危险了。这些都是比较基本的问题,大家要理解,不能光死记硬背。 1、如何查看系统内核的版本 这里有两种方法: 1) uname -a uname 这个命令是用来打印系统信息的, -a …

「面试必背」Linux面试题(2022最新版)

作为 Java 的从业者,在找工作的时候,一定会被问及关于Linux 相关的知识。Linux知识的掌握程度,在很多面试官眼里是候选人技术深度的一个重要评判标准。在这里我们将详细的整理常见的Linux面试题目, 提供给大家学习参考。 1. 什么…