深入拆解Tomcat

194 阅读5分钟

前言

作为一个JavaWeb开发者,你是否曾有过这样的疑问,怎样才能成为一个优秀的架构师?

拿笔者自身的例子来说,笔者从最开始实习工作到现在有四个年头了,前两年里除了复杂CRUD操作,很少有意识的去拓宽知识的宽度和广度,于是在工作第三年才开始逐渐的提升自己眼界,业界那么多优秀的开源框架,为什么我不能站在巨人的肩膀上去学习呢?

于是,我想到了优秀的开源Web容器Tomcat。作为一个优秀的开源框架,Tomcat的性能得到了无数的开发者的见证,所以研究源码以及性能优化能够很快的提升我们的知识面。Tomcat容器的本质是“Http服务器”加上“Servlet容器”,听到容器你是不是很自然的联想到了Spring的IOC设计理念,听到Http服务器,大多数Http服务器势必是对传输层和应用层协议的二进制比特流数据的处理,这中间势必会用到网络IO,那么你是不是很容易想到其他处理网络IO的框架,比如Netty,Netty是怎么处理IO通信的呢?所以学习Tomcat,对于我们学习其他开源框架也能起到很好的促进作用。

在深入拆解Tomcat之前,我们必须要具备操作系统基础和Java语言基础。因为在我们深入理解源码时,必然会使用到这些知识。

操作系统基础: 对于WEB容器来说,操作系统方面你必然要懂得它的操作原理,比如什么是进程、什么是内核,什么是内核空间和用户空间,线程和进程的区别,什么是I/O,什么是IO模型,同步和异步的区别,阻塞和非阻塞的区别,网络通信的原理,OSI七层模型,TCP/IP协议,TCP的三次握手,TCP和UDP

JAVA语言基础: Java的基础知识包括Java基本语法、面向对象设计的概念(封装、继承、多态、接口、抽象类等)、Java集合的使用、Java I/O体系、异常处理、基本的多线程并发编程(包括线程同步、原子类、线程池、并发容器的使用和原理)、Java网络编程(I/O模型BIO、NIO、AIO的原理和相应的Java API)、Java注解以及Java反射的原理等。

什么是Http协议

Http是浏览器和服务器之间的数据传输协议。作为应用层协议,HTTP是基于TCP/IP协议来传递数据(HTML文件、图片、查询结果等)的,Http不涉及数据包传输,主要规定了客户端和服务器的通信连接。

HTTP的本质是什么?

假如浏览器需要远程从Http服务器获取一个HTML文本,那么它需要做两件事。

1.与服务器建立Socket连接。

2.生成请求数据并通过Socket发送出去。

第一步比较容易理解,浏览器与服务器建立连接就是在浏览器输入网址和端口,远程去连接远端的服务器,这样就可以通信了。

我们重点来看第二步,这个请求数据到底长什么样呢?都请求些什么内容呢?或者换句话说,浏览器需要告诉服务端什么信息呢?

首先最基本的是,你要让服务端知道你的意图,你是想获取内容还是提交内容;其次你需要告诉服务端你想要哪个内容。那么要把这些信息以一种什么样的格式放到请求里去呢?这就是HTTP协议要解决的问题。也就是说,HTTP协议的本质就是一种浏览器与服务器之间约定好的通信格式。那浏览器与服务器之间具体是怎么工作的呢?

HTTP工作原理

下图为HTTP的请求过程:

从图上你可以看到,这个过程是:

1.用户通过浏览器进行了一个操作,比如输入网址并回车,或者是点击链接,接着浏览器获取了这个事件。

2.浏览器向服务端发出TCP连接请求。

3.服务程序接受浏览器的连接请求,并经过TCP三次握手建立连接。

4.浏览器将请求数据打包成一个HTTP协议格式的数据包。

5.浏览器将该数据包推入网络,数据包经过网络传输,最终达到端服务程序。

6.服务端程序拿到这个数据包后,同样以HTTP协议格式解包,获取到客户端的意图。

7.得知客户端意图后进行处理,比如提供静态文件或者调用服务端程序获得动态结果。

8.服务器将响应结果(可能是HTML或者图片等)按照HTTP协议格式打包。

9.服务器将响应数据包推入网络,数据包经过网络传输最终达到到浏览器。

10.浏览器拿到数据包后,以HTTP协议的格式解包,然后解析数据,假设这里的数据是HTML。

11.浏览器将HTML文件展示在页面上。

Tomcat系统架构