Tomcat架构解析之2 connector BIO
在上文已介绍过,connector
组件是service
容器中的一部分。
它主要是接收,解析HTTP请求,然后调用本service下的相关Servlet
Tomcat从架构上采用的是一个分层结构,因此根据解析过的HTTP请求,定位到相应的Servlet也是一个相对比较复杂的过程
整个Connector实现了从接收
Socket
到调用 Servlet
的全部过程 先看
Connector
的执行逻辑 - 接收socket
- 从socket获取数据包,并解析成
HttpServletRequest
对象 - 从
engine
容器开始走调用流程,经过各层valve
,最后调用Servlet
完成业务逻辑 - 返回response,关闭socket
可看出,整个Connector
组件是Tomcat
运行主干,之前介绍的各个模块都是Tomcat启动时,静态创建好的,通过Connector
将这些模块串起
网络吞吐一直是整个服务的瓶颈所在,Connector
的运行效率在一定程度上影响了Tomcat的整体性能。相对来说,Tomcat在处理静态页面方面一直有一些瓶颈,因此通常的服务架构都是前端类似Nginx的web服务器,后端挂上Tomcat作为应用服务器(当然还有些其他原因,例如负载均衡等)
Tomcat在Connector
的优化上做了一些特殊的处理,这些都是可选的,通过部署,配置方便完成,例如APR(Apache Portable Runtime),BIO,NIO等
目前Connector
支持的协议是HTTP和AJP。
- AJP是Apache与其他服务器之间的通信协议。通常在集群环境中,例如前端web服务器和后端应用服务器或servlet容器,使用AJP会比HTTP有更好的性能,这里引述apache官网上的一段话
本篇主要针对HTTP协议的Connector
进行阐述
先来看一下Connector
配置,在server.xml
里
熟悉的80端口不必说了。protocol
这里是指这个Connector
支持的协议。
具体到HTTP协议,这个属性可以配置的值有
- HTTP/1.1
- org.apache.coyote.http11.Http11Protocol –BIO实现
- org.apache.coyote.http11.Http11NioProtocol –NIO实现
- 定制的接口
配置HTTP/1.1
和org.apache.coyote.http11.Http11Protocol
效果一样,因此Connector
的HTTP协议实现默认支持BIO的
无论BIO/NIO都是实现一个org.apache.coyote.ProtocolHandler
接口,因此如果需要定制,也必须实现这个接口
来看看默认状态下HTTP connector的架构及其消息流
Connector
的三大件 - HTTP11Protocol
- Mapper
- CoyoteAdapter
HTTP11Protocol
类全路径org.apache.coyote.http11.Http11Protocol
,这是支持HTTP的BIO实现
包含了JIoEndpoint对象及Http11ConnectionHandler对象。
Http11ConnectionHandler对象维护了一个Http11Processor对象池,Http11Processor对象会调用CoyoteAdapter完成http request的解析和分派。
JIoEndpoint维护了两个线程池,Acceptor及Worker。Acceptor是接收socket,然后从Worker线程池中找出空闲的线程处理socket,如果worker线程池没有空闲线程,则Acceptor将阻塞。Worker是典型的线程池实现。Worker线程拿到socket后,就从Http11Processor对象池中获取Http11Processor对象,进一步处理。除了这个比较基础的Worker线程池,也可以通过基于java concurrent 系列的java.util.concurrent.ThreadPoolExecutor线程池实现,不过需要在server.xml中配置相应的节点,即在connector同级别配置<Executor>,配置完后,使用ThreadPoolExecutor与Worker在实现上没有什么大的区别,就不赘述了。
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4"/>
图中的箭头代表了消息流。
Mapper
类全路径org.apache.tomcat.util.http.mapper.Mapper
,此对象维护了一个从Host到Wrapper的各级容器的快照
它主要是为了,当HTTP request被解析后,能够将HTTP request绑定到相应的servlet进行业务处理。前面的文章中已经说明,在加载各层容器时,会将它们注册到JMX中。
所以当
Connector
启动,会从JMX中查询出各层容器,然后再创建这个Mapper对象中的快照 CoyoteAdapter
全路径org.apache.catalina.connector.CoyoteAdapter
,此对象负责将HTTP request解析成HttpServletRequest
对象,之后绑定相应的容器,然后从engine
开始逐层调用valve
直至该servlet。
在Session管理中,已经说明,根据request中的jsessionid绑定服务器端的相应session。
这个jsessionid按照优先级或是从request url中获取,或是从cookie中获取,然后再session池中找到相应匹配的session对象,然后将其封装到HttpServletRequest对象。所有这些都是在CoyoteAdapter中完成的。
看一下将request解析为HttpServletRequest对象后,开始调用servlet的代码;connector.getContainer().getPipeline().getFirst().invoke(request, response);
connector的容器就是StandardEngine,代码的可读性很强,获取StandardEngine的pipeline,然后从第一个valve开始调用逻辑,相应的过程请参照tomcat架构分析(valve机制)。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Tomcat架构解析之1 架构简介
Tomcat除了能够支撑通常的web app外,其本身高度模块化的架构体系,也能带来最大限度的可扩展性。 目前tomcat版本已经衍生到tomcat9,但是主流的版本还是tomcat6。此系列架构体系介绍还是以tomcat6为蓝本。 Tomcat是有一系列逻辑模块组织而成,这些模块主要包括: 核心架构模块,例如Server,Service,engine,host和context及wrapper等 网络接口模块connector log模块 session管理模块 jasper模块 naming模块 JMX模块 权限控制模块 …… 这些模块会在相关的文档里逐一描述,本篇文档以介绍核心架构模块为主。 1 核心架构模块说明 核心架构模块之间是层层包含关系。 例如可以说Service是Server的子组件,Server是Service的父组件。 在server.xml已经非常清晰的定义了这些组件之间的关系及配置。 需要强调的是Service中配置了实际工作的Engine,同时配置了用来处理时间业务的线程组Executor(如果没有配置则用系统默认的WorkThread模式的线程组),以及处理网...
- 下一篇
Tomcat架构解析之3 Connector NIO
上文简单记录了默认的Connector的内部构造及消息流,同时此Connector也是基于BIO的实现。 除BIO,也可以通过配置快速部署NIO的connector。在server.xml中如下配置; 整个Tomcat是一个比较完善的框架体系,各组件间都是基于接口实现,方便扩展 像这里的 org.apache.coyote.http11.Http11NioProtocol和BIO的 org.apache.coyote.http11.Http11Protocol都是统一的实现 org.apache.coyote.ProtocolHandler接口 ProtocolHandler的实现类 从整体结构上来说,NIO还是与BIO的实现保持大体一致 NIO connector的内部结构 还是可以看见 Connector中三大件 Http11NioProtocol Mapper CoyoteAdapter 基本功能与BIO的类似 重点看看Http11NioProtocol. 和JIoEndpoint一样, NioEndpoint是 Http11NioProtocol中负责接收处理 socket的主...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Mario游戏-低调大师作品
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7