Tomcat源码分析--一次HTTP请求过程 小鱼儿 2022-08-22 00:16 147阅读 0赞 前两篇我们分析了Tomcat服务的启动过程和Connector(连接器)。现在让我们看看一次Tomcat服务器是怎么提供HTTP服务的。 上文我们说到endpoint是底层处理I/O具体实现类,那么一次HTTP首先也要从这个类中开始。还是以NIOEndPoint实现类为例子。在NIOEndPoint类中有一个名为Acceptor内部类。该内部类负责接收即将到来的TCP/IP连接,并将它们分配给合适的processor处理。 ![这里写图片描述][20160508194059544] HTTP底层是TCP协议,Java实现TCP协议的具体的方式就是Socket连接。我相信只要了解一点Java网络编程方面的知识都会了解的,不在累述。另一个比较重要的方法是setSocketOptions(),该方法是将socket连接添加到一个缓存队列里面。这里使用的是生产者和消费者模式,如果对该模式有不了解,请看我的另一个博文,Java并发之生产者和消费者模型[http://blog.csdn.net/c275046758/article/details/50492107][http_blog.csdn.net_c275046758_article_details_50492107]。 ![这里写图片描述][20160508195039805] setSocketOptions方法内获得了channel。channel是java nio中的概念,有不了解的请查看Java nio的相关内容。然后在register()方法中将channel添加到缓存队列中。 ![这里写图片描述][20160508195546667] addEvent方法是内部类poller内的一个私有方法。为了能看的更清晰,故将这两个方法放在一起呈现。 ![这里写图片描述][20160508200045762] Poller类实现了Runnable接口,是一个线程类。在run方法的15-31行中具体实现了java nio的一些代码。28行继续调用了processKey方法。接着调用了processSocket()方法。 ![这里写图片描述][20160508200903815] ![这里写图片描述][20160508201248148] 在processSocket方法中,将具体的nio连接转换成socketProcessor处理线程。这个类是一个工作线程。可以将其理解成生产者消费者模型中的消费者。然后通过executor执行这个线程。 ![这里写图片描述][20160508201915941] 从上一篇中我们知道handler是处理协议的地方。process方法在AbstractProcessorLight中的实现。AbstractProcessorLight是一个轻量级的抽象processor实现。 ![这里写图片描述][20160508202857086] 接着会调用service方法。看到这个方法是不是会有种莫名的激动,是不是servlet的生命周期方法service方法很像呢。别着急,让我们看看service的具体实现。 ![这里写图片描述][20160508203435853] 在前面经过复杂的处理后,在代码的26行调用了service方法,而它的参数正好是request和response。正好是service()生命周期方法。 自己研究源码的一点心得,如有错误请批评指正。 [20160508194059544]: /images/20220724/f55f5cf2381342738644c1408dde3858.png [http_blog.csdn.net_c275046758_article_details_50492107]: http://blog.csdn.net/c275046758/article/details/50492107 [20160508195039805]: /images/20220724/d673c06a6872445ea49be41189f5821c.png [20160508195546667]: /images/20220724/e0f8b2c14e604e759e2e015c73e20d28.png [20160508200045762]: /images/20220724/12b536f67111436c8753f6c696dacedf.png [20160508200903815]: /images/20220724/48a49199b31c469ab90854319f9640d3.png [20160508201248148]: /images/20220724/0b1a2e5c8e6041f1a37bb9f4ae1b9e9f.png [20160508201915941]: /images/20220724/5e17c5f762c74c4a8b267adc50aa8dda.png [20160508202857086]: /images/20220724/e3379fbfc01347dba7cea6589ca911fa.png [20160508203435853]: /images/20220724/6c7638da036b41d28ef6e7fc9c21728e.png
还没有评论,来说两句吧...