点击蓝色字免费订阅,****每天收到这样的好信息
前言:最近有不少粉丝关注本公众号。并且我已经****成功开通了流量主同时会赚一点点广告费,我打算每个月把这部分钱拿出来给大家买点书刊,算是给大家一点福利吧。大家想买什么书扫描下方的二维码加群。最后,非常感谢大家的关注。
在上一篇文章里我们主要介绍了 tomcat NIO 实现的相关架构类,在这里我们主要介绍数据处理类,即实现读写封装的 Request 和 Response 。
在 tomcat NIO 的实现里,会有一系列处理数据读写的类。并且 tomcat 也实现了servlet 标准,是 servlet 容器。所以会把处理数据读写的类封装成标准的HttpServletRequest 和HttpServletResponse 实现,从而完成从原始 socket 连接请求到 servlet API 的调用。对于请求 Request 相关的类,展示如下图:
HttpServletRequest 类,代表标准 servlet API 中对于 Request 的具体的定义,其实现类为org.apache.catalina.connector.Request 。
HttpServletResponse ,是HttpServletRequest的实例,代表标准 servlet API 中对于 Response 的具体的定义,其中具体的实现类为org.apache.catalina.connector.Response 。
Connector 类,属于 HttpServletRequest 类的实例,是对上一篇文章中介绍的顶层框架类 Connector 引用。
CoyoteRequest ,属于HttpServletRequest 类的实例,同时也是属于InputBuffer 类和 Http11InputBuffer 类的实例,是 tomcat 对连接请求的封装,同时里面也包含 http method ,uri ,querystring ,host ,port 等 items 的封装。
CoyoteInputStream,是 HttpServletRequest 类的实例,是 tomcat 对于输入流的包装。
InputBuffer 类,属于 HttpServletRequest 类的实例,也属于 CoyoteInputStream 类的实例,用来完成请求数据的读取。其中包含 Bytebuffer 和 CharBuffer 作为字节和字符读取缓冲区,默认大小为1028*8 bit ,即8KB。
CoyoteResponse 类,属于 CoyoteRequest 类的实例,是 tomcat 对于对连接响应的封装。
Http11InputBuffer 类,主要用于完成请求数据的读取,其中包含 Bytebuffer 作为字节读取缓冲区,包含 SocketInputBuffer 辅助类用于完成到 Bytebuffer 字节缓冲区的读操作。
NioSocketWrapper 类,是 Http11InputBuffer 类的实例,封装了原始的 scoket ,提供封装的 socket 读写操作。
NioSelectorPool 类,属于 NioSocketWrapper 类的实例,当数据需要多次读写的时候,监测注册在原始 scoket 上的读写事件是否发生。
CountDownLatch 类,这里有 readLatch 实例和 writeLatch 两个实例,而这两个均是属于 NioSocketWrapper 类的实例。用于当数据不可读,或者不可写的时候对 tomcat io 线程的阻塞,即如果数据不可读写,tomcat io 线程会分别在 readLatch 实例和 writeLatch 实例上等待。
Poller 类,是属于 NioSocketWrapper 类的实例,主要监测 epoll 模型里注册原始 scoket 上的读写事件是否发生。里面包含事件队列SynchronizedQueue ,java NIO 事件轮询对象 selector,同时还包含了并发事件计数器 weakupCounter。
NioChannel 类,是属于 NioSocketWrapper 类的实例,对原始 java NIO 对象 ScoketChannel 的封装,同时它的内部也引用了其所从属的NioSocketWrapper 类的实例。
SocketBufferHandler 类,属于 NioChannel 类的实例,主要是用于进行封装原始 java NIO ScoketChannel 对象的读写 buffer 。其内部有 DirectBuffer 类型的读缓冲与写缓存,这里的 DirectBuffer 是堆外内存,而不是 jvm 内存,从而提高了读写效率。
对于请求 Reponse 相关的类,展示如下图:
HttpServletReponse 类,代表标准 servlet API中对于Reponse 的定义,其具体实现类为 org.apache.catalina.connector.Reponse。
HttpServletRequest,是HttpServletReponse的实例,代表标准 servlet API 中对于 Request 的具体的定义,其中的具体的实现类为org.apache.catalina.connector.Request 。
CoyoteOutputStream,是 HttpServletReponse 类的实例,是 tomcat 对于输出流的包装。
OutputBuffer 类,是属于 CoyoteOutputStream 类的实例,也属于 HttpServletReponse 类的实例,用来完成响应数据的写操作。其中包含Bytebuffer 和 CharBuffer 作为字节和字符写操作缓冲区,默认大小为1024*8 bit,即8KB。
CoyoteResponse 类,即是属于 CoyoteRequest 类的实例,也属于 OutputBuffer 类的实例,是 tomcat 对于对连接响应的封装。
Http11OutputBuffer 类,主要用于完成响应数据的写操作,其中包含 Bytebuffer 作为 header 字节写缓冲区,包含 SocketOutputBuffer 辅助类完写操作。
NioSocketWrapper,属于Http11OutputBuffer类的实例,封装了原始的 scoket ,提供封装的 socket 读写操作。
打油诗
我不在乎我的作品文章是被现在的人读还是由子孙后代来读。既然上帝花了六千年来等一位观察者,我可以花上一个世纪来等待读者。
往期推荐
[
spring 状态机
[
spring 状态机 (二)
[
mybatis用到的设计模式
[
jvm高级面试题(必须看)
[
MySQL索引实现原理分析
[
Spring中的用到的设计模式
[
SpringBoot 自动装配原理解析(一)
[
java 8 lambda表达式中的异常处理
[
spring @Async异步方法使用及原理说明
[
Spring 和 SpringBoot 之间到底有啥区别?
[
只需这10步,通过历史控制文件恢复数据库
[
让bug无处藏身,Java 线上问题排查思路、常用工具
本文分享自微信公众号 - Java小白学心理(gh_9a909fa2fb55)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。