关于源码版本,我利用的是 tomcat6,由于 7 为了重构有太多的抽象,看其实在费劲,6 代码虽有冗余但读起来很直不雅观,并且低版本也不影响理解 Tomcat 的核心流程。

体系构造

从 server.xml 中就能够看出 Tomcat 各组件的层次构造,详细构造图如下:

jspjavatomcat架构一线互联网年夜牛带你解析 Tomcat 架构概述 Ruby

Server:代表全体容器,它可能包含一个或多个 Service 和全局 JNDI 资源;Service:包含一个或多个 Connector,这些连接器与一个 Engine 干系联;Engine:表示要求处理流水线(pipeline),它吸收所有连接器的要求,并将相应交给适当的连接器返回给客户端;Host:网络名称(域名)与 Tomcat 做事器的关联,默认主机名 localhost,一个 Engine 可包含多个 Host;Connector:处理与客户真个通信,网络 I/O;Context:表示一个 Web 运用程序,一个 Host 包含多个高下文。

做事器模型

做事器模型(或 I/O 模型),描述的是 TCP 连接的处理办法,以及 Socket 读写时线程的状态。
Java 里常用的是 BIO 和 NIO,分别对应同步壅塞和同步非壅塞两种模型,Tomcat 中的 Connector 组件便是对这两种的封装实现。

BIO - 壅塞式

Tomcat 实现了一个持续接一线程的大略做事器模型,内部采取线程池做了优化,设计如下:

当 Acceptor 吸收到一个 TCP 连接时,线程池分配一个线程进行处理;线程调用 read() 方法读取 Socket 输入流中的字节,此时线程壅塞(Block),直到收到客户端发送的数据;收到数据后,进行解码、业务处理、编码,末了把相应发送到客户端,关闭连接。

由此可以看出,合理的分配线程池大小可以一定程度长进步系统的并发能力。

NIO - 非壅塞

BIO 的缺陷在于不管当前连接有没有数据传输,它始终壅塞占用线程池内的一个线程,而 NIO 的处理办法是若通道无数据可读取,此时线程不壅塞直接返回,可用于处理其他连接,提高了线程利用率。
那怎么知道什么时候处理数据的读写呢?当通道可读或可写时,内核会关照用户程序进行处理。

NIO 的编程比较繁芜,常用的是 Reactor 模式,它描述了一个利用多路复用 I/O,基于事宜驱动的做事器处理模型, (这里) 基于 Doug Lea 的 Scalable IO in Java 对 Reactor 进行了实现。
Tomcat 的设计略有不同,其设计如下:

Acceptor 以壅塞模式吸收 TCP 连接,然后将连接注册到 Poller 上;Poller 以非壅塞模式处理 SSL 握手和 HTTP 要求头的读取;BlockPoller 仿照壅塞处理 HTTP 要求体的读取和发送相应。

值得把稳的是,两类 Poller 都只是卖力事宜的关照,I/O 操作都是由线程池中的线程完成。
那么,ServerSocketChannel 为什么壅塞?为什么要仿照壅塞处理要求体和 Servlet 相应?干系的谈论可参考:

Why Tomcat's Non-Blocking Connector is using a blocking socket?Getting my head around NIO 'simulated' blocking (trying to)

Servlet API 的实现

Servlet 规范描述了容器如何加载和运行 Servlet,如和将要求映射到用户配置的 Servlet, 如何处理要乞降相应等干系问题。
Tomcat 紧张实现了以下 API:

ServletConfig :Servlet 名字和初始化参数;ServletContext :定义了 Web 运用程序,Servlet 运行的高下文;ServletRequest :封装客户端要求;ServletResponse :封装做事端相应;FilterChain :要求过滤调用链;FilterConfig :过滤配置工具;RequestDispatcher :转发要求,将要求转发给 JSP 或另一个 Servlet 处理。

其他如 Servlet、Filter、GenericServlet、HttpServlet 接口或类则由用户程序来实现,更多详细的先容请参考规范内容。

小结

Tomcat 架构看着挺大略但做起来难,难的便是把繁芜的问题抽象化、大略化,表示到代码上便是如何设计和抽象出类并且优雅的组织在一起,它作为一个盛行的中间件,其内部代码的实现以及优化手段,也是值得我们去研究和模拟的。

对Java微做事、分布式、高并发、高可用、大型互联网架构技能、口试履历互换感兴趣的。
可以关注我的头条号,我会在微头条不定期的发放免费的资料链接,这些资料都是从各个技能网站搜集、整理出来的,如果你有好的学习资料可以私聊发我,我会注明出处之后分享给大家。
欢迎分享,欢迎评论,欢迎转发!