你好,我是yes。
Tomcat 作为一款历史悠久的开源软件,很多朋友可能大学的时候就认识它了,工作中和它打交道的人也不少,甚至可以说是使用最广泛的 Web 应用服务器。
这样一个成熟的工具,我们还有必要深入学习它吗?如果手写一个 Tomcat,我们又有什么收获呢?
很多人觉得日常工作中我会用就行了,刚开始的时候确实没问题,不过如果仅仅停留在会用,那么你离掌握这门技术就还远,遇到复杂问题的时候也就不知道从哪儿下手去解决了。

Tomcat 处理一个 HTTP 请求的完整流程

用的时候它确实很简单,说白了就是一个 Socket Server,但是对应到工程上却并不容易。如果这个服务器只需要响应一次请求,确实是没有什么可做的,但是现实世界并不是这样,我们还要考虑一些啰嗦事:
  1. 如何管理多个 Servlet?
  2. 如何支持多个独立的应用?
  3. 大量用户请求的性能问题如何解决?
Tomcat 作为一款实用的 Servlet 应用服务器,考虑到这些事项,内部的程序结构会变得很复杂。这些在我们学习了 Tomcat 的源码后,会有很多的启发。


另一方面,近几年各种应用数不胜数,各种语言和工具也频繁迭代,我们作为专业程序员,深入底层,理解中间层是很必要的。
对这些基础服务的理解,能让我们以不变应万变,把握住技术快速流变中相对稳定的内核理解了底层运行原理,知道了所以然,工作中可以更加高效准确地使用中间件提供的服务,提高应用程序的质量。长期来讲,让我们的事业更成功。
跳出功利心,我们从更高的角度来看。作为一个专业人士,能将自己的专业从头到尾融会贯通,这种收获感,也是对自己定下志向一生选择这个专业的一个交代。而作为个人,对这个世界的某个方面有了一个透彻的理解,会感到不虚此生之行,更是一种深层的幸福。

那么,如何高效地掌握 Tomcat?

都说学习一种技能最好的形式,就是用自己的方式复现,但是手撸 Tomcat 这件事我们真的能做到吗?
当然可以,如果我们只是实现一个「微型」的 Tomcat 框架的话,还是可以搞定的。
我们写 MiniTomcat 的目标是掌握 Tomcat,所以我们不会自己创新什么,而是老老实实按照 Tomcat 的样子模仿着手写。因此我们的目录结构、包名、类名、接口名、继承体系、类中的主要方法名都是参照 Tomcat 本身的。
在这里,我推荐一张「中国 Java 研发工程师鼻祖」之一郭屹梳理的「手写 MiniTomcat 体系图」,内容自于他的《手把手带你写一个 MiniTomcat》专栏,建议先码后看。 
他采取重造轮子的方法和快速迭代的开发模式,从 Web 应用服务器讲起,深入 Servlet 原理,攻克 Web 开发核心技术,解密 Tomcat 的设计思路与内部结构,跟着学下来,只用 6 周,就可以搭建一实用的 Tomcat 框架。
我对这方面挺感兴趣的,所以一上线就入手了,今天早鸟特惠,价格也很合适,推荐给你:

关于作者 - 郭屹

作为一个 30 年技术老兵,他可以称为中国 Java 研发工程师鼻祖之一:曾在 Sun Microsystems 公司 Java 研发中心担任 J2EE 研发工程师,同时他也是 JDBC Driver、Minis 开发者,Norming 软件国际的 CTO。 
在长达 30 余年的编程生涯中,他经历了 Java 技术的飞速发展,积累了丰富的行业经验和技术实践,有MiniSpring、MiniTomcat、MiniRedis、MiniLanguage 等多款开源作品。除此之外,他还十分乐于分享自己的知识和经验,是《手把手带你写一个 MiniSpring》专栏以及技术类书籍《认识编程》和《Java 编程十五讲》的作者,一直以来他都在通过写作、讲演等方式推动着编程社区的发展。
这种资历的专家能出来开课,把自己独特的学习方法和经验分享出来,真的很难得。

手写 MiniTomcat 是如何设计的?

MiniTomcat 的课程大体上分成四大块:HTTP Server、Connector、Container和扩展部分。熟悉Tomcat的人也知道,Connector+Container 就是 Tomcat 的核心了。学习这些,会为进一步的研究会打下良好的基础。
第一章 实现一个简单的 Web 应用服务器
Web 应用的核心是对 HTTP 协议的支持,接收浏览器发送的 HTTP 请求,解析 url,找到资源返回内容,显示在客户浏览器上。这一部分先不引进任何规范,而是自己简单地实现 Request 请求与 Response 响应。虽然它很简单,但是也是一个地道的 Web 应用服务器,不仅支持静态资源,还能运行程序动态返回内容。后面的改造都会基于这个简单服务器。
第二章 实现专业的 Connector
基于简单的应用服务器,这部分会来重点实现 MiniTomcat 连接层,并且按照 Servlet 规范进行改造。优化代码结构,将第一部分的 Server 拆分为 Connector 与 Processor。之后初步优化性能,引入 Processor 池化技术,支持 Processor并发执行,提高 Server 的高并发能力。然后,就要按照规范行事,实现Servlet对请求和响应的接口规范。
这一部分的改造过后,MiniTomcat 的连接层就有模有样了。
第三章 实现专业的 Container
连接层解决后,再重点设计实现容器。先引入 Wrapper,实现 Context 与 Wrapper,形成两层容器,将整个框架进一步按照功能拆分成不同模块,每一部分各司其职。最后引入日志、过滤器、监听器等通用组件。这一部分之后,Tomcat 的核心就模仿出来了。
第四章 完成 MiniTomcat 及扩展讨论
这个部分我们将考虑多应用支持,进一步拆分功能,BootStrap 只负责启动服务器,业务代码都在 Context 内运行,支持不同路由转发到不同应用之中,而应用之前相互隔离。这个需求就要求我们改变标准的 Java 类加载机制,自定义加载过程。最后通过 web.xml 各项配置,启动 Server,实现完整而基本的 Tomcat。
作为扩展,课程会探讨如何把 MiniSpring 打包放在 MiniTomcat 中运行,形成 Mini 系列的核心环境,还将探讨将网络 IO 扩展为支持 NIO,以支持高并发场景的方案。
通过目录来看看具体内容吧:
我们在工作中,总是有前辈谆谆教导不要重新造轮子。这句话是对的,对于要快速搭建交付给客户的项目来讲,尽量采用第三方来搭建项目是明智的选择。然而选择就意味着取舍,不重新造轮子,失去的就是对软件基础的透彻理解,技术流于表面,软件工程师变成了码农。为了弄清楚软件系统如何运行起来的,成为专家,我们必须学会重新造轮子。
课程原价 ¥99
今日早鸟到手,仅需 ¥69 
点击「阅读原文」,我们一起通过「手写一个 MiniTomcat 」去掌握 Tomcat 这只三脚猫。
继续阅读
阅读原文