First

上篇分析了下tomcat启动过程的源码,本篇分享下tomcat是如何处理http请求的。

此阶段,我愿称为“敌方还有30s到达战场”(网络请求到service处理)

AbstractEndpoint

前面文章也说过,endpint为tomcat底层处理io的核心类,可看到,有很多实现,本篇文章以NioEndpoint为例子,展开分析

NioEndpoint

NioEndpoint 内部,通过Acceptor负责接收即将到来的TCP/IP连接,并将它们分配给合适的processor处理
方法内获得了channel,调用Poller的register方法,将连接添加到一个缓存队列里面

register方法内部调用了addEvent将请求放到了SynchronizedQueue队列里

Poller

Poller为NioEndpoint的内部类

本身继承了Runnable方法,本身是个线程类

其run方法内部负责消费SynchronizedQueue队列,获取到请求,调用processKey

将具体的nio连接转换成SocketProcessorBase(本身是个工作线程)调用其execute方法,执行这个线程

SocketProcessorBase

SocketProcessorBase doRun方法是个抽象方法,在各自Endpoint类中各自实现

NioEndpoint的实现类中,调用Handler的 process方法,用来处理nio的请求,实现类为AbstractProtocol

AbstractProtocol

根据socket的类型,选择不同的processor,调用其process进行请求的处理

AbstractProcessorLight

Processor的process方法在AbstractProcessorLight中实现,会调用抽象service()方法
查看service实现,发现,service方法,主要将网络请求封装成request、reqpons,调用adapter.service方法

总结

看文章可能觉得有些饶,一是表达形式的原因,可能表达的不是那么请求,简单做个总结

个人觉得上述流程,我想称之为“请求还有30s到达容器”

即,通过Endpoint socket监听,拿到网络请求,通过protocol选择不同的processor进行请求的处理,

将请求转发给tomcat的不同的servce进行处理