手把手带你写一个 MiniTomcat
郭屹
前 Sun Microsystems Java 研发工程师
1792 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 22 讲
开篇词 (1讲)
手把手带你写一个 MiniTomcat
15
15
1.0x
00:00/00:00
登录|注册

19|Servlet与NIO的协同:如何在NIO模式下调用Servlet?

你好,我是郭屹。今天我们继续手写 MiniTomcat。
上节课我们从原理出发探讨了 Java 的 NIO 模式,以及 Tomcat 如何实现 NIO 的。我们知道把 Socket 设置为 NIO 模式,通过注册事件的方法来进行读写处理,就相当于有一排信号灯,来了请求就会亮灯,还可以用不同的颜色区分不同的请求,比如连接、读、写等等,然后有一个 Poller 程序轮询,对不同的信号进行不同的处理。
这节课我们继续聊这个话题,看一下在 NIO 模式下如何调用 Servlet。我们最后再来探讨一下 MiniTomcat 如何支持 NIO。同样的,这节课也是对思路和原理的讨论,并没有对应的源码。

NIO 与 Servlet 的协同

我们来探讨支持 NIO 的另一件事情:Servlet 协同。我们得先描述一下,前面说了,改成 NIO 模式之后,网络连接这一部分现在是非阻塞的模式了,主线程不用阻塞等待网络返回,而是可以接着做别的工作了。反映在程序上,我们现在拿到的不再是一个普通的 Java socket 了,而是 SocketChannel。
但是 Servlet 的行为呢?按照通常的理解,是要阻塞地对数据进行读取,也就是说 Servlet 程序员写程序的时候,头脑里总是想象数据同步读写完成。这样我们就了解到了,现在网络连接和 Servlet 调用之间存在一个模式的差别。你可以结合我给出的示意图来理解。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了在NIO模式下调用Servlet以及Tomcat如何模拟阻塞式读写的技术细节。首先解释了NIO与Servlet的协同,指出NIO模式下的非阻塞网络连接与Servlet的阻塞式读写行为之间存在差异,需要模拟同步阻塞以协调二者。随后详细分析了Tomcat如何模拟阻塞式读写,包括使用CoyoteInputStream重新实现read()方法以及NioSocketWrapper和Poller的配合实现阻塞式读写。通过这些技术手段,Tomcat成功地在NIO通道上模拟了阻塞式的实现方案。文章还探讨了如何将MiniTomcat改造为NIO模式,包括将Connector改成NIO模式进行连接、实现NIO服务端、包装SocketChannel为NIOSocketWrapper等具体修改方案。总的来说,本文内容涵盖了NIO模式下的Servlet调用和Tomcat的阻塞式读写模拟技术,为读者提供了深入的技术细节和实现原理。文章内容丰富,对于想要深入了解NIO模式和Tomcat技术细节的读者具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手带你写一个 MiniTomcat》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(3)

  • 最新
  • 精选
  • 彩笔采购
    这两节很赞啊。“Tomcat NioEndPoint结构”还有“NIO模拟BIO的方式”让我有了很直观的了解

    作者回复: 感谢感谢!这两节是扩展讨论,前几年线下给研究生讲课的时候讨论的材料。未来有机会或许会单独出课程。

    2024-01-19归属地:河南
    1
  • 风轻扬
    老师,miniRedis有想法吗?最近一直在学redis源码,很想自己从头实现一个redis

    作者回复: Redis是值得好好研究。极客上已经有很好的Redis课程了,计算所的蒋教授讲的。平台上的课程有互补性,是一个知识体系。

    2024-01-28归属地:北京
  • peter
    请教老师几个问题: Q1:SocketChannel与Socket是什么关系吗? Q2:第16课的代码链接打开后是第七课的链接 第16课的末尾放的链接是: https://gitee.com/yaleguo1/minit-learning-demo/tree/geek_chapter16 点击以后,浏览器地址栏中显示的是: https://gitee.com/yaleguo1/minit-learning-demo/tree/geek_chapter07 Q3:能否讲一下Tomcat中的设计模式?

    作者回复: socketchannel和socket,你自己最好看看Java网络编程基础材料。有个基础了解,再来学我的MiniTomcat和MiniSpring会顺利很多。 链接已经报告给编辑,多谢指正。 我们编程过程中,遇到有典型设计模式的地方,我都有提及。没有单独讲设计模式,我不太主张单独讲这个,应该是设计开发中遇到什么场景需要什么模式就用什么模式。纯粹地光看设计模式,你可以看看GoF的经典著作。

    2024-01-21归属地:北京
收起评论
显示
设置
留言
3
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部