面试官:Tomcat 有哪些组成部分?讲讲工作原理?面试必问。。(3)

简介: 面试官:Tomcat 有哪些组成部分?讲讲工作原理?面试必问。。(3)

Tomcat各类Connector对比

image.png

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处理相关类

image.png

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主要参数

image.png


Comet

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

image.png

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

  • Begin:新的请求连接接入调用,可进行与Request和Response相关的对象初始化操作,并保存response对象,用于后续写入数据
  • Read:请求连接有数据可读时调用
  • End:当数据可用时,如果读取到文件结束或者response被关闭时则被调用
  • Error:在连接上发生异常时调用,数据读取异常、连接断开、处理异常、socket超时


Note:

  • Read:在post请求有数据,但在begin事件中没有处理,则会调用read,如果read没有读取数据,在会触发Error回调,关闭socket
  • End:当socket超时,并且response被关闭时也会调用;server被关闭时调用
  • Error:除了socket超时不会关闭socket,其他都会关闭socket
  • End和Error时间触发时应关闭当前comet会话,即调用CometEvent的close方法 Note:在事件触发时要做好线程安全的操作


异步Servlet

image.png

传统流程:

  • 首先,Servlet 接收到请求之后,request数据解析;
  • 接着,调用业务接口的某些方法,以完成业务处理;
  • 最后,根据处理的结果提交响应,Servlet 线程结束

image.png

异步处理流程:

  • 客户端发送一个请求
  • Servlet容器分配一个线程来处理容器中的一个servlet
  • servlet调用request.startAsync(),保存AsyncContext, 然后返回
  • 任何方式存在的容器线程都将退出,但是response仍然保持开放
  • 业务线程使用保存的AsyncContext来完成响应(线程池)
  • 客户端收到响应


Servlet 线程将请求转交给一个异步线程来执行业务处理,线程本身返回至容器,此时 Servlet 还没有生成响应数据,异步线程处理完业务以后,可以直接生成响应数据(异步线程拥有 ServletRequest 和 ServletResponse 对象的引用)


为什么web应用中支持异步?

推出异步,主要是针对那些比较耗时的请求:比如一次缓慢的数据库查询,一次外部REST API调用, 或者是其他一些I/O密集型操作。这种耗时的请求会很快的耗光Servlet容器的线程池,继而影响可扩展性。


Note:从客户端的角度来看,request仍然像任何其他的HTTP的request-response交互一样,只是耗费了更长的时间而已


异步事件监听

  • onStartAsync:Request调用startAsync方法时触发
  • onComplete:syncContext调用complete方法时触发
  • onError:处理请求的过程出现异常时触发
  • onTimeout:socket超时触发


Note : onError/ onTimeout触发后,会紧接着回调onComplete onComplete 执行后,就不可再操作request和response

相关文章
|
5天前
|
中间件 数据库连接 API
Python面试:FastAPI框架原理与实战
【4月更文挑战第18天】FastAPI是受欢迎的高性能Python Web框架,以其简洁的API设计、强大的类型提示和优秀的文档生成能力著称。本文将探讨FastAPI面试中的常见问题,包括路由、响应对象、Pydantic模型、数据库操作、中间件和错误处理。同时,还会指出一些易错点,如类型提示不准确、依赖注入误解,并提供实战代码示例。通过理解和实践FastAPI,可以在面试中展示出色的Web开发技能。
30 1
|
4天前
|
Android开发 移动开发 小程序
binder机制原理面试,安卓app开发教程
binder机制原理面试,安卓app开发教程
binder机制原理面试,安卓app开发教程
|
5天前
|
算法 网络协议 安全
HTTP 原理和面试题
HTTP 原理和面试题
|
3天前
|
前端开发 算法
【css炫酷动画】让面试官眼前一亮的故障风格文字动画,3年Web前端开发工程师面试经验分享
【css炫酷动画】让面试官眼前一亮的故障风格文字动画,3年Web前端开发工程师面试经验分享
|
3天前
|
Android开发 异构计算 前端开发
Android显示原理,安卓自定义view面试
Android显示原理,安卓自定义view面试
|
4天前
|
设计模式 前端开发 网络协议
Android 开发网易面试凉凉经,面试官:基础不牢,彻底帮你搞懂
Android 开发网易面试凉凉经,面试官:基础不牢,彻底帮你搞懂
|
4天前
|
Android开发
Flutter完整开发实战详解(六、 深入Widget原理),2024百度Android岗面试真题收录解析
Flutter完整开发实战详解(六、 深入Widget原理),2024百度Android岗面试真题收录解析
|
4天前
|
Java 数据库连接 Spring
K8S+Docker理论与实践深度集成java面试jvm原理
K8S+Docker理论与实践深度集成java面试jvm原理
|
5天前
|
分布式计算 监控 大数据
《吊打面试官》- 大数据工程师50道中大厂面试真题保姆级详解
《吊打面试官》- 大数据工程师50道中大厂面试真题保姆级详解
27 1
《吊打面试官》- 大数据工程师50道中大厂面试真题保姆级详解
|
6天前
|
安全 Java
美团一面,面试官让介绍AQS原理并手写一个同步器,直接凉了
【5月更文挑战第2天】美团一面,面试官让介绍AQS原理并手写一个同步器,直接凉了
31 6