tomcat 学习 | 源码学习方法及 tomcat 处理 Web 请求

本贴最后更新于 1926 天前,其中的信息可能已经事过境迁

开头说两句

小刀博客: https://www.lixiang.red
小刀公众号: 程序员学习大本营

学习背景

上一波,我们一起新建了 web 应用,然后把 war 包丢到 tomcat 源码中的 webapps 目录,然后通过源码启动的方式成功 debug 运行了我们 web 应用,并且在浏览器上看到了相应的输出:
https://www.lixiang.red/articles/2019/08/13/1565705566068.html

源码学习方法

能 debug 就 debug

直接看源码就很容易头晕,加上现在面向接口编程,我们很难直观看到在运行时,这个接口实际的实现类是什么
但在 debug 界面就不一样了,我们可以清楚的看到变量的状态值,调用的接口实际上是哪个实现类,如下图所示
image.png
所以说,学习源码,公司的项目代码,要运行起来,这样还可以边改边看效果

寻找有效文档并分段

直接从代码看,如果不找文档的话,没有一个学习的入口,不知道从什么地方下手,面对庞大的代码,就会感到学习不下,没法学
我们最开始学习 tomcat 时,是因为我们知道平时启动 tomcat 是从 startup.sh 开始的,所以我们沿着这个脚本,一步步的找到了 Bootstrap.java 的 main 函数,然后通过 main 函数又一步步的研究到各个组件.
从文档中找到学习的入口,可能是某个类的某个方法,可以能是张流程图等等,如现在我们要去学习 tomcat 处理 web 请求,我们可以从相关书籍上找到, 是从 CoyoteAdapter.service 进行的主要处理. 这时候,我们就找到了我们学习的入口,然后打断点在方法入口处,后面就可以一步一步的跟踪下去了
然后通过文档里面的关键点,找到代码的对应部分,然后划分代码段落,找到每段代码的大致意思

建立知识库

知识主要分已知和未知,我们大部分的学习,都应该是从已知到未的过程,随着我们学习的深入,不断的有知识点被加入到我们的已知库里面.
如: 我们现在知道知识点 A, 然后可以从 A 推导出 B,C. 那么就把 B,C 也加入到我们的已知库里面,下次学习的时候,就可以用 B 推导 D, C 推导 E 等等,这样不断的去壮大.
现在对于我们 tomcat 学习,我们的已知有以下几点:
A. 我们已知请求的 url ,http://localhost:8088/study/hello
B. 我们已知请求处理的方法入口: CoyoteAdapter.service
C. 我们通过以前的文章学习已知: 有 coyote 组件, Connector 组件, Engine 组件 等等
那么下面,我们开始边看断点的运行状态边推导,如下图所示
由 A 和断点状态,可以看到我们的 url 最开始是和 org.apache.coyote.Request 是对应起来的,
然后用 Connector.createRequest 去创建了一个 org.apache.catalina.connector 下的 Request,也是我们后面一直用的 request.
这个就是新知识 D, 我们把他加入到我们已知库里面, 然后类似于这样,不断的去壮大已知库
image.png

web 请求处理

通过上面的方法,我们可以运用到今天的源码学习中.
通过查找资料,我们可以看到 tomcat 处理 web 请求时,有以下几个关键点:
1.CoyoteAdapter.Service
2.请求映射
3.获取并执行 Engine 的 valve
4. 判断是否是同步/异步
5.执行对应的逻辑
我们对源码的分段如下图所示,这样本来 130 多行的源代码,我们只用近 10 行就把大致意思,过程给精简出来了:
image.png
然后我们就可以深入到每一段,看他是怎么处理的,可以循环使用上面的学习方法
下面,我们以请求映射为例一起深入学习下

请求映射

同样,我们先进行代码分段,如下图所示,可以看到 300 行的代码我们一个屏幕内就可以看到整个大体的逻辑,后面我们可以再把这个再深入,然后分段,这样一直学习下去
image.png

最后说两句

后面的学习,基本上都是重复这一段,不停的分段,然后不停去看小段里面的逻辑,直到最底层的,大家加油! 在学习过程中有什么想法,可以随时和小刀分享: best396975802

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    169 引用 • 506 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...