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 中调用 ...
随机推荐
- jersey 用FastJson替换掉默认的Jackson
@Bean public ResourceConfig resourceConfig() { ResourceConfig resourceConfig = new ResourceConfig(); ...
- Hibernate的查询方式
Hibernate的查询的方式 OID检索 get或load方法进行的查询 对象导航检索 linkman.getCustomer(); HQL检索 用于接收hql语句进行查询,面向对象查询方式. 通过 ...
- 1024程序员节宅男节日快乐 -- JAVA快速开发平台,JEECG 3.8宅男优化版本发布
JEECG 3.8 版本发布,系统全面升级,重构上传组件.优化代码生成器机制! 导读 ⊙平台性能优化,系统更稳定,速度闪电般提升 ⊙系统上传组件全面重构,使用plupload组件,解决flash的 ...
- Java 字符串拼接四种方式的性能比较分析
一.简单介绍 编写代码过程中,使用"+"和"contact"比较普遍,但是它们都不能满足大数据量的处理,一般情况下有一下四种方法处理字符串拼接,如下: 1. 加 ...
- 如何在Chrome中导入和导出密码
如果想让 Chrome 支持密码导入和导出,需要先在地址栏中执行 chrome://flags/#password-import-export 将该功能启用并重启浏览器才能生效. 浏览器重启完成后 ...
- jquery通过AJAX从后台获取信息并显示在表格上的类
前一阵我写了:<jquery通过AJAX从后台获取信息并显示在表格上,并支持行选中.>现在,我把他们处理了一下,不需要每次写代码了: 具体代码如下: //获取数据并显示数据表格 funct ...
- mysql学习一 常用语句
操作系统为windows 1 启动关闭mysql服务 //windows mysqld --console //开启mysql服务 mysqladmin -uroot shutdown //关闭my ...
- C语言典型编程2
关于C的一些小而精的编程,适合希望提升编程能力的初学者学习:关键编程也就几句,但思维可以迁移到其他编程语言.同一问题,算法多种. //任意整数的任意次方取后3位(算数取位)#include<st ...
- 云笔记项目- 上传文件报错"java.lang.IllegalStateException: File has been moved - cannot be read again"
在做文件上传时,当写入上传的文件到文件时,会报错“java.lang.IllegalStateException: File has been moved - cannot be read again ...
- mysql批量update更新,mybatis中批量更新操作
在日常开发中,有时候会遇到批量更新操作,这时候最普通的写法就是循环遍历,然后一条一条地进行update操作.但是不管是在服务端进行遍历,还是在sql代码中进行遍历,都很耗费资源,而且性能比较差,容易造 ...