Tomcat网络模型

Connector(连接器)

        和Tomcat网络模型关系最密切的是Tomcat的核心组件Connector(连接器),主要的职责就是负责接收客户端连接和客户端请求的处理加工。每个Connector都将指定一个端口进行监听,分别负责对请求报文的解析和响应报文组装,解析过程生成Request对象,而组装过程涉及Response对象。

        如果将Tomcat整体比作一个大房间,那么Connector组件就是房间的门,每个人要进入房间就必须通过门,它为人们进出房间提供了通道。同时,一个房间还可能有两个或者多个门,每个门代表了不同的通道。

Connector组件

        Connector组件其中包含Protocol组件、Mapper组件和CoyoteAdapter组件。

        Protocol组件是协议的抽象,对不同的通信协议进行了封装,比如HTTP协议和AJP协议。

        Endpoint组件是接收端的抽象,由于使用了不同的I/O模式,因此存在很多类型的Endpoint,如BIO模式的JionPoint、NIO模式的NioEndPoint和本地库I/O模式的APREndpoint。

        Acceptor是专门用于接收客户端连接的接收器组件。

        Executor则是处理客户端请求的连接池,Connector可能使用了Service组件的共享线程池,也可能是Connector自己私有的线程池。

        Processor组件是处理客户端请求的处理器,不同的协议和不同的I/O模式都有不同的处理方式,所以存在不同类型的Processor。

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

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

        HTTP Connector所支持的协议版本为HTTP/1.1和HTTP/1.0,无须显式适配HTTP的版本,Connector会自动适配版本。每个Connector实例对应一个端口,在同个service实例内可以配置若干个Connector实例。

源码跟踪

       以8.5.x版本为例, 首先看Connector的构造方法,在构造方法中,先是调用了setProtocol(protocol),这个方法主要是通过协议类型选择生成不同的ProtocolHandler。

Connector构造方法

        以Http11NioProtocol为例,看一下Http11NioProtocol的构造方法。发现Http11NioProtocol的构造方法需要传入了NioEndpoint。

Http11NioProtocol构造方法

        进入NioEndpoint看一下startInternal()方法,注释已经写的清楚了。在pollers = new Poller[getPollerThreadCount()];处,创建了一个Poller,而Poller里面封装了Selector。

startInternal方法

        那么创建了几个Poller呢?进入getPollerThreadCount()方法看一下,了无秘密。

getPollerThreadCount方法

       再看startInternal()方法中的startAcceptorThreads()方法,acceptors = new Acceptor[count];说明可以有多个Acceptor。

startAcceptorThreads方法

        那么有多少个Acceptor呢?进入getAcceptorThreadCount()方法看一下,了无秘密。

getAcceptorThreadCount方法

        总结:一个Connector可以对应多个Acceptor,默认1个。一个Connector可以对应多个Selector,默认Math.min(2,Runtime.getRuntime().availableProcessors())个。

你可能感兴趣的:(Tomcat网络模型)