Tomcat 组成与工作原理,2024年最新多线程并发面试题

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

  • Server.xml 配置 Host 元素,指定 appBase 属性,默认 $catalina.base/webapps/

  • Server.xml 配置 Context 元素,指定 docBase,元素,指定 Web 应用的路径

  • 自定义配置在 $catalina.base/EngineName/HostName/XXX.xml 配置 Context 元素

HostConfig 监听了 StandardHost 容器的事件,在 start 方法中解析上述配置文件:

  • 扫描 appbase 路径下的所有文件夹和 war 包,解析各个应用的 META-INF/context.xml,并创建 StandardContext,并将 Context 加入到 Host 的子容器中。

  • 解析 $catalina.base/EngineName/HostName/ 下的所有 Context 配置,找到相应 Web 应用的位置,解析各个应用的 META-INF/context.xml,并创建 StandardContext,并将 Context 加入到 Host 的子容器中。

注:

  • HostConfig 并没有实际解析 Context.xml,而是在 ContextConfig 中进行的。

  • HostConfig 中会定期检查 watched 资源文件(context.xml 配置文件)

ContextConfig 解析 context.xml 顺序:

  • 先解析全局的配置 config/context.xml

  • 然后解析 Host 的默认配置 EngineName/HostName/context.xml.default

  • 最后解析应用的 META-INF/context.xml

ContextConfig 解析 web.xml 顺序:

  • 先解析全局的配置 config/web.xml

  • 然后解析 Host 的默认配置 EngineName/HostName/web.xml.default 接着解析应用的 MEB-INF/web.xml

  • 扫描应用 WEB-INF/lib/ 下的 jar 文件,解析其中的 META-INF/web-fragment.xml 最后合并 xml 封装成 WebXml,并设置 Context

注:

  • 扫描 Web 应用和 jar 中的注解(Filter、Listener、Servlet)就是上述步骤中进行的。

  • 容器的定期执行:backgroundProcess,由 ContainerBase 来实现的,并且只有在顶层容器中才会开启线程。(backgroundProcessorDelay=10 标志位来控制)

Servlet 生命周期

图片

Servlet 是用 Java 编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态 Web 内容。

  1. 请求到达 server 端,server 根据 url 映射到相应的 Servlet

  2. 判断 Servlet 实例是否存在,不存在则加载和实例化 Servlet 并调用 init 方法

  3. Server 分别创建 Request 和 Response 对象,调用 Servlet 实例的 service 方法(service 方法内部会根据 http 请求方法类型调用相应的 doXXX 方法)

  4. doXXX 方法内为业务逻辑实现,从 Request 对象获取请求参数,处理完毕之后将结果通过 response 对象返回给调用方

  5. 当 Server 不再需要 Servlet 时(一般当 Server 关闭时),Server 调用 Servlet 的 destroy() 方法。

load on startup

当值为 0 或者大于 0 时,表示容器在应用启动时就加载这个 servlet;当是一个负数或者没有指定时,则指示容器在该 servlet 被选择时才加载;正数的值越小,启动该 servlet 的优先级越高。

single thread model

每次访问 servlet,新建 servlet 实体对象,但并不能保证线程安全,同时 Tomcat 会限制 servlet 的实例数目。最佳实践:不要使用该模型,servlet 中不要有全局变量。

请求处理过程

图片

  1. 根据 server.xml 配置的指定的 connector 以及端口监听 http、或者 ajp 请求

  2. 请求到来时建立连接,解析请求参数,创建 Request 和 Response 对象,调用顶层容器 Pipeline 的 invoke 方法

  3. 容器之间层层调用,最终调用业务 servlet 的 service 方法

  4. Connector 将 response 流中的数据写到 socket 中

Pipeline 与 Valve

图片

Pipeline 可以理解为现实中的管道,Valve 为管道中的阀门,Request 和 Response 对象在管道中经过各个阀门的处理和控制。

每个容器的管道中都有一个必不可少的 basic valve,其他的都是可选的,basic valve 在管道中最后调用,同时负责调用子容器的第一个 valve。

Valve 中主要的三个方法:setNext、getNext、invoke。Valve 之间的关系是单向链式结构,本身 invoke 方法中会调用下一个 Valve 的 invoke 方法。

各层容器对应的 basic valve 分别是 StandardEngineValve、StandardHostValve、StandardContextValve、StandardWrapperValve。

JSP引擎

图片

JSP 生命周期

  • 编译阶段:servlet 容器编译 servlet 源文件,生成 servlet 类

  • 初始化阶段:加载与 JSP 对应的 servlet 类,创建其实例,并调用它的初始化方法

  • 执行阶段:调用与 JSP 对应的 servlet 实例的服务方法

  • 销毁阶段:调用与 JSP 对应的 servlet 实例的销毁方法,然后销毁 servlet 实例

JSP元素

  • 代码片段:<% 代码片段 %>

  • JSP声明:<%! declaration; [ declaration; ]+ … %>

  • JSP表达式:<%= 表达式 %>

  • JSP注释:<%-- 注释 --%>

  • JSP指令:<%@ directive attribute=“value” %>

  • JSP行为:<jsp:action_name attribute=“value” />

  • HTML元素:html/head/body/div/p/……

  • JSP隐式对象:request、response、out、session、application、config、 pageContext、page、Exception

JSP 元素说明

  • 代码片段:包含任意量的 Java 语句、变量、方法或表达式

  • JSP 声明:一个声明语句可以声明一个或多个变量、方法,供后面的 Java 代码使用

  • JSP 表达式:输出 Java 表达式的值,String 形式;

  • JSP 注释:为代码作注释以及将某段代码注释掉

  • JSP 指令:用来设置与整个 JSP 页面相关的属性:

  • <%@ page … %> 定义页面的依赖属性,比如 language、contentType、errorPage、 isErrorPage、import、isThreadSafe、session 等等

  • <%@ include … %> 包含其他的 JSP 文件、HTML 文件或文本文件,是该 JSP 文件的一部分,会被同时编译执行

  • <%@ taglib … %> 引入标签库的定义,可以是自定义标签

  • JSP 行为:jsp:include、jsp:useBean、jsp:setProperty、jsp:getProperty、jsp:forward

JSP 解析过程

图片

  • 代码片段:在 _jspService() 方法内直接输出

  • JSP 声明:在 servlet 类中进行输出

  • JSP 表达式:在 _jspService() 方法内直接输出

  • JSP 注释:直接忽略,不输出

  • JSP 指令:根据不同指令进行区分,include:对引入的文件进行解析;page 相关的属性会做为 JSP 的属性,影响的是解析和请求处理时的行为

  • JSP 行为:不同的行为有不同的处理方式,jsp:useBean 为例,会从 pageContext 根据 scope 的 类别获取 bean 对象,如果没有会创建 bean,同时存到相应 scope 的 pageContext 中

  • HTML:在 _jspService() 方法内直接输出

  • JSP 隐式对象:在 _jspService() 方法会进行声明,只能在方法中使用

Connector

图片

  • HTTP,HTTP 是超文本传输协议,是客户端浏览器或其他程序与 Web 服务器之间的应用层通信协议

  • AJP,Apache JServ 协议(AJP)是一种二进制协议,专门代理从 Web 服务器到位于后端的应用程序服务器的入站请求

阻塞 IO

图片

非阻塞 IO

图片

IO 多路复用

图片

阻塞与非阻塞的区别在于进行读操作和写操作的系统调用时,如果此时内核态没有数据可读或者没有缓冲空间可写时,是否阻塞。

IO 多路复用的好处在于可同时监听多个 socket 的可读和可写事件,这样就能使得应用可以同时监听多个 socket,释放了应用线程资源。

Tomcat 各类 Connector 对比

图片

Connector 的实现模式有三种,分别是 BIO、NIO、APR,可以在 server.xml 中指定。

  • JIO:用 java.io 编写的 TCP 模块,阻塞IO

  • NIO:用 java.nio 编写的 TCP 模块,非阻塞 IO,(IO 多路复用)

  • APR:全称 Apache Portable Runtime,使用 JNI 的方式来进行读取文件以及进行网络传输

Apache Portable Runtime 是一个高度可移植的库,它是 Apache HTTP Server 2.x 的核心。APR 具有许多用途,包括访问高级 IO 功能(如 sendfile,epoll 和 OpenSSL),操作系统级功能(随机数生成,系统状态等)和本地进程处理(共享内存,NT 管道和 Unix 套接字)。

表格中字段含义说明:

  • Support Polling:是否支持基于 IO 多路复用的 socket 事件轮询

  • Polling Size:轮询的最大连接数

  • Wait for next Request:在等待下一个请求时,处理线程是否释放,BIO 是没有释放的,所以在 keep-alive=true 的情况下处理的并发连接数有限

  • Read Request Headers:由于 request header 数据较少,可以由容器提前解析完毕,不需要阻塞

  • Read Request Body:读取 request body 的数据是应用业务逻辑的事情,同时 Servlet 的限制,是需要阻塞读取的

  • Write Response:跟读取 request body 的逻辑类似,同样需要阻塞写

NIO处理相关类

图片

Acceptor 线程负责接收连接,调用 accept 方法阻塞接收建立的连接,并对 socket 进行封装成 PollerEvent,指定注册的事件为 op_read,并放入到 EventQueue 队列中,PollerEvent 的 run 方法逻辑的是将 Selector 注册到 socket 的指定事件。

Poller 线程从 EventQueue 获取 PollerEvent,并执行 PollerEvent 的 run 方法,调用 Selector 的 select 方法,如果有可读的 Socket 则创建 Http11NioProcessor,放入到线程池中执行。

CoyoteAdapter 是 Connector 到 Container 的适配器,Http11NioProcessor 调用其提供的 service 方法,内部创建 Request 和 Response 对象,并调用最顶层容器的 Pipeline 中的第一个 Valve 的 invoke 方法。

Mapper 主要处理 http url 到 servlet 的映射规则的解析,对外提供 map 方法。

NIO Connector主要参数

图片

Comet

Comet 是一种用于 Web 的推送技术,能使服务器实时地将更新的信息传送到客户端,而无须客户端发出请求,在 WebSocket 出来之前,如果不使用 comet,只能通过浏览器端轮询 Server 来模拟实现服务器端推送。Comet 支持 servlet 异步处理 IO,当连接上数据可读时触发事件,并异步写数据(阻塞)。

图片

Tomcat 要实现 Comet,只需继承 HttpServlet 同时,实现 CometProcessor 接口。

  • Begin:新的请求连接接入调用,可进行与 Request 和 Response 相关的对象初始化操作,并保存 response 对象,用于后续写入数据

  • Read:请求连接有数据可读时调用

  • End:当数据可用时,如果读取到文件结束或者 response 被关闭时则被调用

  • Error:在连接上发生异常时调用,数据读取异常、连接断开、处理异常、socket 超时

面试结束复盘查漏补缺

每次面试都是检验自己知识与技术实力的一次机会,面试结束后建议大家及时总结复盘,查漏补缺,然后有针对性地进行学习,既能提高下一场面试的成功概率,还能增加自己的技术知识栈储备,可谓是一举两得。

以下最新总结的阿里P6资深Java必考题范围和答案,包含最全MySQL、Redis、Java并发编程等等面试题和答案,用于参考~

重要的事说三遍,关注+关注+关注!

历经30天,说说我的支付宝4面+美团4面+拼多多四面,侥幸全获Offer

image.png

更多笔记分享

历经30天,说说我的支付宝4面+美团4面+拼多多四面,侥幸全获Offer

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

复盘,查漏补缺,然后有针对性地进行学习,既能提高下一场面试的成功概率,还能增加自己的技术知识栈储备,可谓是一举两得。

以下最新总结的阿里P6资深Java必考题范围和答案,包含最全MySQL、Redis、Java并发编程等等面试题和答案,用于参考~

重要的事说三遍,关注+关注+关注!

[外链图片转存中…(img-9BqcvCHu-1713655905389)]

[外链图片转存中…(img-3oCX8rNJ-1713655905389)]

更多笔记分享

[外链图片转存中…(img-pujsIxDk-1713655905390)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-klmV9Kgl-1713655905391)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值