tomcat 请求处理流程分析(基于nio)
在这里我先简单的说下bio和nio的区别
这里我以电话客服的情况来解释
bio
一个客户对应一个客服,
假如客户比较麻烦,中途不挂电话,或者去做其他事情了,而客服资源会被一直占用
导致的后果是系统处理能力大大降低
Nio
中间加入了一个协调员,假如遇到比较麻烦的用户,请求可以先到协调员这里,当用户准备好以后,在转接给客服。
那这两种方式有啥区别呢?
理论上来说,如果是完全没有网络延迟,阻塞的情况下,其实这两者的性能差不多。
但是实际情况下,服务器根本无法确定客户端的网络情况,所以,一般不使用bio
Tomcat处理请求核心流程图
Acceptor (Acceptor的作用是控制与tomcat建立连接的数量,但Acceptor只负责建立连接)
接收socket线程,这里虽然是基于NIO的connector,但是在接收socket方面还是传统的serverSocket.accept()方式,获得SocketChannel对象,然后封装在一个tomcat的实现类org.apache.tomcat.util.net.NioChannel对象中。然后将NioChannel对象封装在一个PollerEvent对象中,并将PollerEvent对象压入一个队列中里。这是典型的生产者-消费者模式,Acceptor与Poller线程之间通过queue通信,Acceptor是生产者,Poller是消费者。
Poller (socket内容的读写)
Poller线程中维护了一个Selector对象,NIO就是基于Selector来完成逻辑的。
Poller是NIO实现的主要线程。首先作为消费者,从队列中取出PollerEvent对象,然后将此对象中的channel以OP_READ事件注册到Selector中,然后Selector执行select操作,遍历出可以读数据的socket,并从Worker线程池中拿到可用的Worker线程,然后将socket传递给Worker。这个过程是典型的NIO实现。
Worker (执行相关业务逻辑)
Worker线程拿到Poller传过来的socket后,将socket封装在SocketProcessor对象中。然后从Http11ConnectionHandler中取出Http11NioProcessor对象,从Http11NioProcessor中调用CoyoteAdapter的逻辑,跟BIO实现一样。在Worker线程中,会完成从socket中读取http request,解析成HttpServletRequest对象,分派到相应的servlet并完成逻辑,然后将response通过socket发回client。
核心参数说明
参数名称 |
可选值 |
参数解释 |
protocol |
HTTP/1.1 org.apache.coyote.http11.Http11NioProtocol |
网络传输协议 bio Nio |
maxThreads |
工作线程的最大线程数 |
|
minSpareThreads |
工作线程的最小线程 |
|
connectionTimeout |
连接超时(当请求数量超过了 maxConnections,系统会继续接收连接但不会超过acceptCount的值 ) |
|
acceptCount |
等待队列的长度 |
|
acceptorThreadCount |
Acceptor线程数量 |
|
maxConnections |
最大连接数 |
|
pollerThreadCount |
Poller线程数量(nio独有) |
|
tomcat 请求处理流程分析(基于nio)的更多相关文章
- TOMCAT启动流程分析
------------------tomcat服务开启----------2014-9-26 9:17:07 org.apache.catalina.core.AprLifecycleListene ...
- Tomcat 请求处理流程详解
Overview Connector 启动以后会启动一组线程用于不同阶段的请求处理过程. Acceptor 线程组.用于接受新连接,并将新连接封装一下,选择一个 Poller 将新连接添加到 Poll ...
- Tomcat源码分析(从启动流程到请求处理)
Tomcat 8.5下载地址 https://tomcat.apache.org/download-80.cgi Tomcat启动流程 Tomcat源码目录 catalina目录 catalina包含 ...
- 走进JavaWeb技术世界8:浅析Tomcat9请求处理流程与启动部署过程
谈谈 Tomcat 请求处理流程 转自:https://github.com/c-rainstorm/blog/blob/tomcat-request-process/reading-notes &l ...
- 【Flink】Flink作业调度流程分析
1. 概述 当向Flink集群提交用户作业时,从用户角度看,只需要作业处理逻辑正确,输出正确的结果即可:而不用关心作业何时被调度的,作业申请的资源又是如何被分配的以及作业何时会结束:但是了解作业在运行 ...
- Tomcat源码分析(下载、启动)
1.下载Tomcat源代码: https://tomcat.apache.org/download-80.cgi 2. 解压以及创建必要目录和配置 解压.新建catalina-home目录,同时将目录 ...
- tomcat架构分析 (connector NIO 实现)
出处:http://gearever.iteye.com 上一篇简单记录了缺省配置的connector的内部构造及消息流,同时此connector也是基于BIO的实现.除了BIO外,也可以通过配置快速 ...
- springmvc源码分析系列-请求处理流程
接上一篇-springmvc源码分析开头片 上一节主要说了一下springmvc与struts2的作为MVC中的C(controller)控制层的一些区别及两者在作为控制层方面的一些优缺点.今天就结合 ...
- Tomcat 第五篇:请求处理流程(下)
1. 请求处理流程 AprEndPoint 顺着上一篇接着聊,当一个请求发送到 Tomcat 以后,会由连接器 Connector 转送至 AprEndPoint ,在 AprEndPoint 中调用 ...
随机推荐
- nginx功能扩展整理
0.基本负载均衡配置 编辑/etc/nginx/nginx.conf,加入负载平衡配置: http { upstream tomcat { server localhost:8080; server ...
- 网页换肤:原生js与jq
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Mysql将查询结果合并为一列
利用函数:group_concat(),实现一个ID对应多个名称时,原本为多行数据,把名称合并成一行. 完整的语法如下: group_concat([DISTINCT] 要连接的字段 [Order B ...
- 如何安装MySQL5.5.62
1.首先进入官网https://www.mysql.com MySQL分为社区版和商业版,社区版是免费的,这里选择社区版的. 2.此时选择一个比较简单的5.5版本 直接下载Wisndow(X86,32 ...
- tensorflow 如何读取npy文件里的参数
import numpy as npc = np.load( "vgg16.npy" ) #npy的文件名x = c.item() #此时,x的type是一个字典nam ...
- ssl简介与openssl的使用
SSL证书: 是数字证书的一种,类似于驾驶证.护照和营业执照的电子副本.因为配置在服务器上,也称为SSL服务器证书. ssl也是传输协议. 基于ssl协议开发的一款软件叫openssl linux系 ...
- [原创] debian 9.3 搭建Jira+Confluence+Bitbucket项目管理工具(三) -- 安装confluence 6.6.1
[原创] debian 9.3 搭建Jira+Confluence+Bitbucket项目管理工具(三) -- 安装confluence 6.6.1 有了安装Jira的经验, 这次再安装conflue ...
- std::condition_variable::wait_until segment
原因是使用了 -static 改为 -static-libstdc++ -static-libgcc
- CSS 背景图像 重复图像
重复图像 background-repeat 属性可以重复图像,这对于小图片来说是福音. background-repeat 属性有6个值: repeat 背景图像在垂直方向和水平方向都重复 repe ...
- 【java】多个对象的序列化和反序列化
当我们需要序列化多个对象的时候,可以采用集合把多个对象放到集合中,然后序列化整个集合. 而我们要反序列化的时候,就使用集合接收反序列化后的对象 如: List<Student> stude ...