Connector组件介绍

Connector(连接器)组件是Tomcat最核心的两个组件之一,主要的职责是负责接收客户端连接和客户端请求的处理加工。每个Connector都将指定一个端口进行监听,分别负责对请求报文解析和对响应报文组装。

Connector组件是整个Tomcat的入口,假如我们想要学习Tomcat的源码的话,建议从Connector组件开始看起。

还有一个比喻就是Tomcat是一座城堡,而Connector组件就是这座城堡的一个个城门。

上图是Connector组件的一个典型实现,其包含Protocol组件、Mapper组件和CoyoteAdaptor组件。

Protocol组件是协议的抽象,它将不同通信协议的处理进行了封装,比如HTTP协议和AJP协议(目前Tomcat只支持这两种协议)。Endpoint是接收端的抽象,由于使用了不同的I/O模式,因此存在多种类型的Endpoint,如BIO模式的JIoEndpoint、NIO模式的NioEndpoint和本地库I/O模式的AprEndpoint。Acceptor是专门用于接收客户端连接的接收器组件,Executor则是处理客户端请求的线程池, Connector可能是使用了Service组件的共享线程池,也可能是Connector自己私有的线程池。Processor组件是处理客户端请求的处理器,不同的协议和不同的I/O模式都有不同的处理方式,所以存在不同类型的Processor。

Mapper组件可以称为路由器,它提供了对客户端请求URL的映射功能,即可以通过它将请求转发到对应的Host组件、Context组件、Wrapper组件以进行处理并响应客户端,也就是我们常说的将某客户端请求发送到某虚拟主机上的某个Web应用的某个Servlet

CoyoteAdaptor组件是一个适配器,它负责将Connector组件和Engine容器适配连接起来。把接收到的客户端请求报文解析生成的请求对象和响应对象Response传递到Engine容器,交由容器处理。

连接器支持的协议以及对应的IO模型

上面简单提到Tomcat暂时支持HTTP和AJP两种协议,对于每种协议又会有不同的IO模型,所以会有以下组合。

对于Http协议,Tomcat支持以下四种IO模型:

  • Http11Protocol:传统的BIO模型,对应的类为org.apache.coyote.http11.Http11Protocol
  • Http11NioProtocol:NIO模式,对应的类为org.apache.coyote.http11.Http11NioProtocol
  • Http11AprProtocol:Apr模式,对应的类为org.apache.coyote.http11.Http11AprProtocol
  • Http11Nio2Protocol:AIO模式,对应的类是org.apache.coyote.http11.Http11Nio2Protocol
描述 配置方法 server.xml
NIO 同步非阻塞,比传统BIO能更好的支持大并发,tomcat 8.0 后默认采用该模式 改为 protocol="org.apache.coyote.http11.Http11NioProtocol"
BIO 阻塞式IO,tomcat7之前默认,采用传统的java IO进行操作,该模式下每个请求都会创建一个线程,适用于并发量小的场景 protocol =" org.apache.coyote.http11.Http11Protocol"
APR tomcat 以JNI形式调用http服务器的核心动态链接库来处理文件读取或网络传输操作,需要编译安装APR库(也就是说IO操作的部分直接调用native代码实现) protocol ="org.apache.coyote.http11.Http11AprProtocol"
AIO 异步非阻塞 (NIO2),tomcat8.0后支持。多用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂 protocol ="org.apache.coyote.http11.Http11Nio2Protocol"

需要注意的是:上面四种IO模型的连接器我们可以同时配置使用,只要他们监听不同的端口就行了。

对于Ajp协议,Tomcat也支持下面几种IO模型:

  • AjpProtocol:对用传统的BIO
  • AjpNioProtocol:对应NIO
  • AjpAprProtocol:对应Apr模式
  • AjpNio2Protocol:对应AIO模式

这几种模式和上面的模式只是协议上的区别,我们可以重点学习Http协议的实现,毕竟这是我们平时开发中更加常用的实现。

关于AJP协议这边做下简单的介绍。

Tomcat最主要的功能是提供Servlet/JSP容器,尽管它也可以作为独立的Java Web服务器,它在对静态资源(如HTML文件或图像文件)的处理速度,以及提供的Web服务器管理功能方面都不如其他专业的HTTP服务器,如IIS和Apache的服务器。

因此在实际应用中,常常把Tomcat的与其他HTTP服务器集成。对于不支持的Servlet/JSP的HTTP服务器,可以通过的Tomcat服务器来运行的Servlet/JSP组件,而对于静态资源的处理还是在原来的Web服务器中处理。

Apache服务器和Tomcat的连接通信就可以通过AJP协议通信。

但是现在的主流开发模式中,都是使用前后端分离进行开发。比如说Nginx服务器处理静态资源,Tomcat处理动态请求,Nginx和和Tomcat中间通过ajax请求进行通信,而ajax也是通过http协议进行通信的。所以AJP协议在平时开发中用的较少。

在BIO模式下,对于每个客户端的请求连接都将消耗线程池里面的一条连接,直到整个请求响应完毕。此时,如果有很多请求几乎同时到达Connector,当线程池中的空闲线程用完后,则会创建新的线程,直到达到线程池最大线程数。但如果此时还有更多请求到来,虽然线程池已经处理不过来,但操作系统还是会将客户端接收起来放到一个队列里,这个队列的大小通过SocketServer设置backlog而来。如果还是有再多的请求过来,队列已经超过了SocketServer的backlog大小,那么连接将直接被拒绝掉,客户端将收到“connection refused”报错。

在NIO模式下,则是所有客户端的请求连接先由一个接收线程接收,然后由若干(一般为CPU个数)线程轮询读写事件,最后将具体的读写操作交由线程池处理。可以看到,以这种方式,客户端连接不会在整个请求响应过程占用连接池内的连接,它可以同时处理比BIO模式多得多的客户端连接数,此种模式能承受更大的并发,机器资源使用效率高很多。

APR/native模式也是NIO模式,只不过它是直接用本地代码实现NIO模式(而不是基于JDK的NIO)。

AIO模式,使用JDK的AIO模式。

从连接器组件看Tomcat的线程模型——连接器简介的更多相关文章

  1. 从连接器组件看Tomcat的线程模型——BIO模式

    在高版本的Tomcat中,默认的模式都是使用NIO模式,在Tomcat 9中,BIO模式的实现Http11Protocol甚至都已经被删除了.但是了解BIO的工作机制以及其优缺点对学习其他模式有有帮助 ...

  2. 从连接器组件看Tomcat的线程模型——NIO模式

    Tomcat8之后,针对Http协议默认使用org.apache.coyote.http11.Http11NioProtocol,也就是NIO模式.通过之前的博客分析,我们知道Connector组件在 ...

  3. 性能追击:万字长文30+图揭秘8大主流服务器程序线程模型 | Node.js,Apache,Nginx,Netty,Redis,Tomcat,MySQL,Zuul

    本文为<高性能网络编程游记>的第六篇"性能追击:万字长文30+图揭秘8大主流服务器程序线程模型". 最近拍的照片比较少,不知道配什么图好,于是自己画了一个,凑合着用,让 ...

  4. tomcat 线程模型

    最近看到了内网ATA上的一篇断网故障时Mtop触发tomcat高并发场景下的BUG排查和修复(已被apache采纳),引起了我的好奇,感觉原作者对应底层十分了解,写的很复杂.原来对于tomcat的线程 ...

  5. 一文弄懂-Netty核心功能及线程模型

    目录 一. Netty是什么? 二. Netty 的使用场景 三. Netty通讯示例 1. Netty的maven依赖 2. 服务端代码 3. 客户端代码 四. Netty线程模型 五. Netty ...

  6. Memcached源码分析之线程模型

    作者:Calix 一)模型分析 memcached到底是如何处理我们的网络连接的? memcached通过epoll(使用libevent,下面具体再讲)实现异步的服务器,但仍然使用多线程,主要有两种 ...

  7. 死磕 java线程系列之线程模型

    问题 (1)线程类型有哪些? (2)线程模型有哪些? (3)各语言使用的是哪种线程模型? 简介 在Java中,我们平时所说的并发编程.多线程.共享资源等概念都是与线程相关的,这里所说的线程实际上应该叫 ...

  8. Tomcat线程模型分析及源码解读

    1 四种线程模型  配置方法:在tomcat conf 下找到server.xml,在<Connector port="8080" protocol="HTTP/1 ...

  9. 曹工说Tomcat:200个http-nio-8080-exec线程全都被第三方服务拖住了,这可如何是好(上:线程模型解析)

    前言 这两年,tomcat慢慢在新项目里不怎么接触了,因为都被spring boot之类的框架封装进了内部,成了内置server,不用像过去那样打个war包,再放到tomcat里部署了. 但是,内部的 ...

随机推荐

  1. 深度学习中损失函数之RMS和MES

    学校给我们一人赞助了100美元购买英文原版图书,几方打听后选择了PRML 即Pattern Recognition and Machine Learning.自从拆封这本书开始慢慢的品读,经常会有相见 ...

  2. MVC、MVP、MVVM模型

    在学习vue.react的过程中,总能看到MVVM模型,那么MVVM究竟是什么,下面将我最近看到的资料以及自己的想法总结一下. 与MVVM相似的,还有MVC.MVP,先从MVC.MVP这两个入手,方面 ...

  3. 腾讯云Redis混合存储版重磅推出,万字长文助你破解缓存难题!

    导语 | 缓存+存储的系统架构是目前常见的系统架构,缓存层负责加速访问,存储层负责存储数据.这样的架构需要业务层或者是中间件去实现缓存和存储的双写.冷热数据的交换,同时还面临着缓存失效.缓存刷脏.数据 ...

  4. WeChair项目Beta冲刺(1/10)

    团队项目进行情况 1.昨日进展    Beta冲刺第一天 前期进展: 对代码进行优化,完成上阶段冲刺未完成的实名认证上传图片的功能,解决解密存在部分失败的bug问题 2.今日安排 前端:设计扫码占座功 ...

  5. Beta冲刺<7/10>

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta冲刺 这个作业的目标 Beta冲刺--第七天(05.25) 作业正文 如下 其他参考文献 ... B ...

  6. Java基础-Java中transient有什么用-序列化有那几种方式

    此文转载于知乎的一篇文章,看着写的非常全面,分享给大家. 先解释下什么是序列化 我们的对象并不只是存在内存中,还需要传输网络,或者保存起来下次再加载出来用,所以需要Java序列化技术. Java序列化 ...

  7. 虹软AI 人脸识别SDK接入 — 参数优化篇

    引言 使用了免费的人脸识别算法,感觉还是很不错的,但是初次接触的话会对一些接口的参数有些疑问的.这里分享一下我对一些参数的验证结果(这里以windows版本为例,linux.android基本一样), ...

  8. 2、struct2的工作流程

    1.首先执行StrutsPrepareAndExecuteFilter,调用StrutsPrepareAndExecuteFilter类的doFilter方法 在该方法中会产生一个ActionMapp ...

  9. Lens —— 最炫酷的 Kubernetes 桌面客户端

    原文链接:https://fuckcloudnative.io/posts/lens/ Kubernetes 的桌面客户端有那么几个,曾经 Kubernetic 应该是最好用的,但最近有个叫 Lens ...

  10. Jmeter系列(31)- 获取并使用 JDBC Request 返回的数据

    如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html 前言 Jmeter 使用 JDBC R ...