Tomcat 架构概述

Tomcat 是一个 Web 应用服务器,它是对 HTTP 和 Servlet 规范的实现,简单来说它做了这几件事:处理 HTTP 协议、执行 Servlet 和处理网络 I/O。这里以 6.0.53 版本为例(实现了 HTTP/1.1、Servlet2.5),研究其基本结构。

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

体系结构

server.xml 中就能够看出 Tomcat 各组件的层次结构,具体结构图如下:

  • 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 响应?相关的讨论可参考:

Servlet API 的实现

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

  • ServletConfig :Servlet 名字和初始化参数;
  • ServletContext :定义了 Web 应用程序,Servlet 运行的上下文;
  • ServletRequest :封装客户端请求;
  • ServletResponse :封装服务端响应;
  • FilterChain :请求过滤调用链;
  • FilterConfig :过滤配置对象;
  • RequestDispatcher :转发请求,将请求转发给 JSP 或另一个 Servlet 处理。

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

小结

Tomcat 架构看着挺简单但做起来难,难的就是把复杂的问题抽象化、简单化,体现到代码上就是如何设计和抽象出类并且优雅的组织在一起,它作为一个流行的中间件,其内部代码的实现以及优化手段,也是值得我们去研究和模仿的。

原文地址:https://www.cnblogs.com/wskwbog/p/9347653.html

时间: 2024-08-03 21:48:48

Tomcat 架构概述的相关文章

大型互联网架构概述

本文旨在简单介绍大型互联网的架构和核心组件实现原理. 理论上讲,从安装配置,最佳实践以及源码来剖析各个组件,这个自然是极好的.由于笔者时间以及知识有限,有很多知识没有在工作中亲自实践的机会.所以有些地方语焉不详,还请大家多多指教. 大型互联网架构 解决问题的通用思路是将分而治之(divide-and-conquer),将大问题分为若干个小问题,各个击破.在大型互联网的架构实践中,无一不体现这种思想. 架构目标 低成本:任何公司存在的价值都是为了获取商业利益.在可能的情况下,希望一切都是低成本的.

Java生鲜电商平台-微服务架构概述

Java生鲜电商平台-微服务架构概述 单体架构存在的问题 在传统的软件技术架构系统中,基本上将业务功能集中在单一应用内,或者是单一进程中.尽管现代化的软件架构理论以及设计原则已推广多年,但实际技术衍化的速度迟缓并且变革动力不足. 其中的原因存在着复杂性以及多样性,我想主要的原因是没有一套整体的解决方案能够让工程师在面临稳定性风险下,毅然决然地实施系统重构.当系统应用规模随着业务的迅速发展时,系统的重要性愈发突出,开发人员将对系统的改造尤为敏感,从之前的徘徊犹豫,随之变得更加保守,只能延续过去的技

Scrapy架构概述

Scrapy架构概述 1, 从最初自己编写的spiders,获取到start_url,并且封装成Request对象. 2,通过engine(引擎)调度给SCHEDULER(Requests管理调度器). 3,SCHEDULER管理ENGINE传递过来的所有Requests,通过优先级,传递给ENGINE. 4,ENGINE 将传递过来的Request对象传递给Downloader(下载器),但是在传递之间会通过MiddleWare(中间件)对Requests进行包装,添加头部,代理IP之类的.

Tomcat架构以及理解sever.xml

Tomcat架构图 当用户在地址栏输入访问地址后,首先识别访问协议(假设为http),那么通过针对于http协议传输的Connector连接器,连接到tomcat的服务中,连接后开始检测Engine下的host主机名中有无匹配项,如果有,通过appBase找到目标文件夹,然后开始访问相应的html文件等:如果没匹配到,执行<Engine name="Catalina" defaultHost="localhost">这一默认匹配项进行默认匹配. 理解se

JavaEE体系架构概述、MyBatis总结

JavaEE体系架构概述 java EE是sum公司发布的标准企业级应用规范集合,它提供了一个多层结构的分布式应程序模型,是开发基于网络的企业级应用首选平台.Java EE技术平台的核心思想是“容器”加组件 事务:有明确边界的一组序列,在应用程序中一个请求对应一个事务,当请求发送时,事务开始,当请求结束,事务也就结束.总的来说,事务有四个特性:1.原子性,一个请求要么成功,要么失败,不会再有其他情况:2.一致性,事务处理需要的和得到的时相同的:3.持久性,事务处理的结果时确认的.持久的,如果需要

Tomcat 学习进阶历程之Tomcat架构与核心类分析

前面的http及socket两部分内容,主要是为了后面看Tomcat源码而学习的一些网络基础.从这章开始,就开始实际深入到Tomcat的'内在'去看一看. 在分析Tomcat的源码之前,准备先看一下Tomcat的架构与一些核心类的简单分析,并简单介绍一下Tomcat是如何处理一次Http请求的.这部分内容有相当一部分来源于网络,在此,感谢原作者的贡献. Tomcat的总体架构 Tomcat的架构关系可以从Tomcat的配置文件server.xml中看到端倪. 从上图中可以看出Tomcat 的心脏

Tomcat架构(四)

8.标准覆盖机制 J2SE 1.4 and 1.5 都包含了一个XML处理解析器的Java API .Bootstrap 类加载器加载这个解析器的类文件,所以这个解析器会优先于任何一个安装在CLASSPATH里的解析器 被加载,即使您已经安装了新版本的解析器.标准覆盖机制允许您重写JAVA_HOME/lib/endorsed文件夹里某些特定的类(例如CORBA 和 JAXP 类).Bootstrap 类加载器将会优先加载这些类.想详细了解此机制,请访问http://java.sun.com/j2

tomcat架构分析-索引

tomcat架构分析 (概览) tomcat架构分析 (容器类) tomcat架构分析 (valve机制) tomcat架构分析 (valve源码导读) tomcat架构分析 (Session管理) tomcat架构分析 (JNDI配置) tomcat架构分析 (JNDI体系绑定) tomcat架构分析 (connector BIO 实现) tomcat架构分析 (connector NIO 实现)

基于ONOS的SDN-IP架构概述篇

编者按:SDN-IP是ONOS上的一个应用程序,允许软件定义网络使用标准的边界网关协议(BGP)连接到外部网络.从BGP角度看,SDN网络表现为单一的自治系统(AS),其行为与任何传统的AS一样.基于AS的SDN-IP应用提供BGP和ONOS之间的集成整合机制,在协议层SDN-IP的行为作为一个有规则的BGP发言人.从ONOS的角度来看,它只是使用其服务,在SDN数据平面安装和更新相应的转发状态的应用程序. 1 架构目标  1.1 SDN-IP设计目标 (1)兼容性Compatibility:S