在这里我先简单的说下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)的更多相关文章

  1. TOMCAT启动流程分析

    ------------------tomcat服务开启----------2014-9-26 9:17:07 org.apache.catalina.core.AprLifecycleListene ...

  2. Tomcat 请求处理流程详解

    Overview Connector 启动以后会启动一组线程用于不同阶段的请求处理过程. Acceptor 线程组.用于接受新连接,并将新连接封装一下,选择一个 Poller 将新连接添加到 Poll ...

  3. Tomcat源码分析(从启动流程到请求处理)

    Tomcat 8.5下载地址 https://tomcat.apache.org/download-80.cgi Tomcat启动流程 Tomcat源码目录 catalina目录 catalina包含 ...

  4. 走进JavaWeb技术世界8:浅析Tomcat9请求处理流程与启动部署过程

    谈谈 Tomcat 请求处理流程 转自:https://github.com/c-rainstorm/blog/blob/tomcat-request-process/reading-notes &l ...

  5. 【Flink】Flink作业调度流程分析

    1. 概述 当向Flink集群提交用户作业时,从用户角度看,只需要作业处理逻辑正确,输出正确的结果即可:而不用关心作业何时被调度的,作业申请的资源又是如何被分配的以及作业何时会结束:但是了解作业在运行 ...

  6. Tomcat源码分析(下载、启动)

    1.下载Tomcat源代码: https://tomcat.apache.org/download-80.cgi 2. 解压以及创建必要目录和配置 解压.新建catalina-home目录,同时将目录 ...

  7. tomcat架构分析 (connector NIO 实现)

    出处:http://gearever.iteye.com 上一篇简单记录了缺省配置的connector的内部构造及消息流,同时此connector也是基于BIO的实现.除了BIO外,也可以通过配置快速 ...

  8. springmvc源码分析系列-请求处理流程

    接上一篇-springmvc源码分析开头片 上一节主要说了一下springmvc与struts2的作为MVC中的C(controller)控制层的一些区别及两者在作为控制层方面的一些优缺点.今天就结合 ...

  9. Tomcat 第五篇:请求处理流程(下)

    1. 请求处理流程 AprEndPoint 顺着上一篇接着聊,当一个请求发送到 Tomcat 以后,会由连接器 Connector 转送至 AprEndPoint ,在 AprEndPoint 中调用 ...

随机推荐

  1. tornado架构分析2 options.py实现原理

    总结体会: options这个文件是用来管理程序运行过程中配置的,它采用了单例模式,整个程序运行时只有一个实例存在. 参数可以从命令行读取,也可以从配置文件中读取,就看你怎么用了. 同时,option ...

  2. [HTML]音乐自动播放(兼容微信)

    文件下载:音乐自动播放(兼容微信).zip   <!DOCTYPE html> <html> <head> <meta charset="utf-8 ...

  3. python_14 静态属性、类方法、静态方法;组合;继承

    静态属性 在类中函数前加@property,在实例调用函数时无需加(),将函数属性封装,调用时看起来与数据属性类似 将函数封装成数据属性的形式,外部调用时看不到逻辑,静态属性可以访问实例属性也可以访问 ...

  4. C# 字符串按 ASCII码 排序,注意其中的小坑

    https://www.cnblogs.com/similar/p/6739293.html 在和银行做数据对接时,涉及到数据传输时的验签及加密.其中数据签名方案中就要求数据项根据属性名按 ASCII ...

  5. Java运行时数据区域分析

    Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结 ...

  6. Unable to find a single main class from the following candidates ,显示有两个main class

    由于基础框架是用的网上down的源码,我将项目名字改了,估计没有进行maven clean,本地调试的时候没有问题. 当发布时候,执行maven install 一直提示上述错误. 解决办法:1.ma ...

  7. chinalife的经验

    1.当<img src="">时,浏览器会有生成border,可以使用css选择器,img[src=""] {/*设置样式*/}: 2.jquery ...

  8. (英文版)VScode一键生成.vue模板

    1. 安装vscode,官网地址 2.安装一个插件,识别vue文件 插件库中搜索Vetur,下图中的第一个,点击安装(Install) 3.新建代码片段 点击Code(代码)-Preferences( ...

  9. 项目(一)ftp搭建

    FTP服务 FTP两种模式: 主动模式服务器向客户端敲门,然后客户端开门 被动模式客户端向服务器敲门,然后服务器开门 传输模式:可以是文本模式,也可以是二进制模式,二进制模式更适合传输图片等非文本字符 ...

  10. ajax 跳转页面时添加header

    在页面中添加一个form表单隐藏域,表单的一个属性是需要传的token,然后在ajax的回调函数中提交这个表单.要把这个token添加到header中就需要重写一个过滤器filter继承org.spr ...