vlambda博客
学习文章列表

作为web开发的你,怎能不了解tomcat


作者|知视

本文主要介绍Tomcat的整体架构


说到Tomcat大家肯定不陌生,今天我们来聊聊Tomcat,聊聊Tomcat的架构设计。

Tomcat的架构设计,就像俄罗斯套娃一样,一层套一层。如图,就是tomcat整体架构图。


Tomcat主要有两部分组成:连接器Connector和容器Container。


所谓连接器就是负责接收和解析请求,然后转发给容器。


容器代表的是一类组件,它有很多层。


其中最大的是引擎Engine,它代表一个Servlet引擎。它主要的功能是将传入的请求委托给适当的虚拟机Host处理。


引擎Engine的下一层是Host,它代表一个虚拟机。Tomcat自带一个localhost的虚拟机。虚拟机有两个重要的概念域名和根目录。


  • 域名:每个虚拟主机是由它注册的域名来标识的

  • 根目录:根目录所在的文件夹包含将被部署到此主机的上下文。根目录可以是一个绝对路径,也可以是对CATALINA_BASE 来说的一个相对路径


为了提供对多个域名的服务,通过配置Host就可以添加虚拟机。每个虚拟机Host下可以包含多个上下文Context。


虚拟机Host的下一层是上下文Context,一个Context代表一个Web应用,就是我们平常开发的一套Web应用程序。上下文是应用自定义代码(servlet、jsp)所存活的地方。


其实,在Context内部还有一层包装器Wrapper,包装器是context容器的子容器。一个Wrapper对应一个Servlet。在一个Web应用中会包含多个Servlet,来处理不同的请求。所以一个Context内部会有多个对应的包装器Wrapper。


为了很好地统一管理连接器和容器,Tomcat提供了另外两个组件:服务器Server和服务Service。


服务器Server代表完整的Tomcat实例,在Java虚拟机中它是一个单实例,主要是用来管理各个服务Service组件的生命周期的。服务器Server中可以有多个服务Service,每个服务Service都是相互独立的。


服务器Server是Tomcat中的顶级组件。可以这样说,它掌握着整个Tomcat的生死大权。


前面说到,Server代表Tomcat实例本身。那么,Service则代表具体的服务,负责对外提供服务。每个Service都是相互独立的,一个Service组件中可以有多个Connector和一个Engine,这样一来,对应的多个Connector的请求就只能由一个Engine处理。


那么,请求是如何到达Servlet的?


  • 客户端的请求首先到达的是连接器Connector

  • 连接器将请求封装成Request对象和Response对象,再将请求传递给容器

  • 请求到达容器后,容器会按照上述组件的顺序,一层一层地对请求做相应的处理

  • 最后请求会被传递给特定的Servlet