Tomcat源码分析--一次HTTP请求过程

       前两篇我们分析了Tomcat服务的启动过程和Connector(连接器)。现在让我们看看一次Tomcat服务器是怎么提供HTTP服务的。

       上文我们说到endpoint是底层处理I/O具体实现类,那么一次HTTP首先也要从这个类中开始。还是以NIOEndPoint实现类为例子。在NIOEndPoint类中有一个名为Acceptor内部类。该内部类负责接收即将到来的TCP/IP连接,并将它们分配给合适的processor处理。
Tomcat源码分析--一次HTTP请求过程_第1张图片
HTTP底层是TCP协议,Java实现TCP协议的具体的方式就是Socket连接。我相信只要了解一点Java网络编程方面的知识都会了解的,不在累述。另一个比较重要的方法是setSocketOptions(),该方法是将socket连接添加到一个缓存队列里面。这里使用的是生产者和消费者模式,如果对该模式有不了解,请看我的另一个博文,Java并发之生产者和消费者模型http://blog.csdn.net/c275046758/article/details/50492107。

Tomcat源码分析--一次HTTP请求过程_第2张图片
setSocketOptions方法内获得了channel。channel是java nio中的概念,有不了解的请查看Java nio的相关内容。然后在register()方法中将channel添加到缓存队列中。

Tomcat源码分析--一次HTTP请求过程_第3张图片

addEvent方法是内部类poller内的一个私有方法。为了能看的更清晰,故将这两个方法放在一起呈现。

Tomcat源码分析--一次HTTP请求过程_第4张图片

Poller类实现了Runnable接口,是一个线程类。在run方法的15-31行中具体实现了java nio的一些代码。28行继续调用了processKey方法。接着调用了processSocket()方法。
Tomcat源码分析--一次HTTP请求过程_第5张图片

Tomcat源码分析--一次HTTP请求过程_第6张图片

在processSocket方法中,将具体的nio连接转换成socketProcessor处理线程。这个类是一个工作线程。可以将其理解成生产者消费者模型中的消费者。然后通过executor执行这个线程。

Tomcat源码分析--一次HTTP请求过程_第7张图片

从上一篇中我们知道handler是处理协议的地方。process方法在AbstractProcessorLight中的实现。AbstractProcessorLight是一个轻量级的抽象processor实现。

Tomcat源码分析--一次HTTP请求过程_第8张图片

接着会调用service方法。看到这个方法是不是会有种莫名的激动,是不是servlet的生命周期方法service方法很像呢。别着急,让我们看看service的具体实现。

Tomcat源码分析--一次HTTP请求过程_第9张图片

在前面经过复杂的处理后,在代码的26行调用了service方法,而它的参数正好是request和response。正好是service()生命周期方法。

自己研究源码的一点心得,如有错误请批评指正。

你可能感兴趣的:(tomcat,源码)