Tomcat NIO(3)-架构类
在上一篇文章里我们主要介绍了 tomcat NIO 的基础,多路复用。多路复用除了 java NIO API 之外还需不同操作系统的底层支持,对于 linux 系统来说,就是我们上一篇文章介绍的 epoll 模型,在这里我们主要介绍 tomcat NIO 的主要涉及的 java 类以及其作用。
我们可以把 tomcat NIO 涉及的主要 java 类大致分为两种类型,一种类型是框架类,主要实现 NIO 的架构。另一种类型是数据处理类,实现读写的封装,类似于 Request 和 Response ,在这里我们主要介绍 tomcat NIO 涉及的框架类,下图展示了这些类:
顶层类是 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 中处理请求和响应相关的类以及这些类的作用。