Tomcat NIO(3)-架构类

上一篇文章里我们主要介绍了 tomcat NIO 的基础,多路复用。多路复用除了 java NIO API 之外还需不同操作系统的底层支持,对于 linux 系统来说,就是我们上一篇文章介绍的 epoll 模型,在这里我们主要介绍 tomcat NIO 的主要涉及的 java 类以及其作用。

我们可以把 tomcat NIO 涉及的主要 java 类大致分为两种类型,一种类型是框架类,主要实现 NIO 的架构。另一种类型是数据处理类,实现读写的封装,类似于 Request 和 Response ,在这里我们主要介绍 tomcat NIO 涉及的框架类,下图展示了这些类:

Tomcat NIO(3)-架构类

  • 顶层类是 Connector 类型,主要负责用来初始化具体应用协议的处理类 ProtocolHandler 。应用协议包括 http 协议,http/1.1 版本,http/1.0 版本。AJP 协议,AJP/1.3 版本。

  • 次顶层类是 ProtocolHandler 类型,代表不同协议处理的实现类,对于 tomcat NIO 来说,实现类为 Http11NioProtocol ,用来处理 http/1.1 协议。对于普通的 http/1.0 版本协议来说,实现类为 Http11Protocol 。对于AJP/1.3 版本协议来说,为 AjpAprProtocol 和 AjpNioProtocol 这个两个类。

  • AbstractEndpoint 类是属于 Http11NioProtocol 类,其主要用来处理底层 socket 的连接,对于 tomcat NIO 的实现类来说是 NioEndpoint 。

  • Poller 类属于 NioEndpoint ,主要监测 epoll 模型里注册原始 socket 上的读写事件是否发生。

  • NioSelectorPool 类属于 NioEndpoint ,当数据需要多次读写的时候,监测注册在原始 socket 上的读写事件是否发生。

  • NioBlockingSelector 类属于 NioSelectorPool 类,对于监测注册在原始 scoket 上的读写事件,delegate 给 NioBlockingSelector 处理。

  • BlockPoller 类属于 NioBlockingSelector 类,实现具体的监测读写事件的逻辑。

  • SocketWrapper 类封装了原始 socket ,提供封装的 socket 读写操作。

  • ConnectionHandler 类属于 Http11NioProtocol 类,主要对 SocketWrapper 类进行操作,整个 tomcat NIO 的处理框架就仅仅只有一个 ConnectionHandler 实例,是 global 的,也就是说所有的连接 SocketWrapper 都由这个实例处理

  • Http11Processor,该类由 ConnectionHandler 实例调用,会把接收到的 SocketWrapper 封装成 tomcat 的 Request 和 Response 对象。

  • CoyoteAdapter,该类负责把 Http11Processor 封装的 tomcat Request 和 Response 对象给转换成 HttpServletRequest/HttpServletResponse 对象,并完成对 servlet API 的调用。

  • ConnectionHandler 实例中有一个 Map 类型的对象,key 为SocketWrapper 类型,value 为 Http11Processor 类型。也就是说为每一个连接都分配了处理类 Http11Processor ,可以保存连接的状态信息。

目前先写到这里,下一篇文章里我们继续介绍 tomcat NIO 中处理请求和响应相关的类以及这些类的作用。

Tomcat NIO(3)-架构类