文章目录
上下文
tomcat源码分析共2个阶段
1.tomcat如何接收处理请求 源码分析(一)(Connector
部分)本篇
2.tomcat如何接收处理请求 源码分析(二)
(Container
部分)
目标:
本文主要分析tomcat的Connector
部分,一个请求如何封装为HttpRequest
。主要包括NioEndpoint
,Acceptor
,Poller
,PollerEvent
,selector
,SocketProcessor
的一些细节。
下图的第一个框即是本文所研究的核心内容。第二个框和第三个框分别会在后面的文章描述。
正文
我们使用tomcat的时候都知道它是多线程的,很多个用户同时访问的时候,他能够将每个应用分发给不同的线程,处理好之后将结果返回给浏览器。但是由于一个进程能打开的线程数量有限,如果使用BIO方式(一个请求对应一个线程)处理这些客户端发起的连接,妨碍了系统吞吐力的提升,所以现在的tomcat都采用了NIO的方式来提高系统的并发能力。
BIO方式的B/S模型如上,服务器S作为一个请求接待者,凡是接收到一个socket连接请求,就会立即给这个sokect分配一个后台线程,这个后台线程会负责执行完整个请求的生命周期。那么这样有什么问题吗?为啥说这个方式影响并发呢?我的理解是,当浏览器发起连接的时候,可能并不会马上发送数据,而是等着用户输入。用户什么时候输入完成我的后端线程拿到数据才会进入逻辑执行阶段(比如查表等操作)。很明显这种情况没有充分的利用线程。要知道线程是十分宝贵的资源,不仅会占用一定的内存,同时也占用了cpu资源。