Tomcat源码学习系列之一:Tomcat架构分析

引言

本篇为Tomcat源码学习的开篇,主要通过阅读Tomcat的源码来了解其真正的运行流程以及原理,同时学习其中的架构设计等等。本文主要说明Tomcat的架构。

  • Tomcat架构
  • 一次HTTP请求在tomcat中的流程
  • 总结

一、Tomcat架构

Tomcat中的架构还是有点复杂的,但是好在Tomcat属于高度模块化的容器,如果可以搞明白其中的核心模块的原理,抓住重点就可以对Tomcat的架构有更加深刻的理解。Tomcat的架构如下图所示:
在这里插入图片描述
由上图可知,Tomcat容器中的Server是其顶级接口,它管理着多个Service服务,而Service服务又管理着多个Connector以及一个Container,其中核心组件为Connector以及Container
Server组件
所谓Server组件就是Tomcat的运行实例,一个JVM只包含一个Server组件。

Service组件
Service组件是将Connector组件与Container组件包装组合在一起,对外提供服务。该组件中会包含多个Connector组件组件以及一个Container组件。

Connector组件
该组件主要负责监听指定端口的客户端请求(不同端口对应不同的Connector组件),将Socket请求过来的数据,都封装成Request请求对象,同时将该请求对象传递给容器进行下一步的处理。

Container组件
Container组件包含了四个子容器,分别为EngineHostContextWrapper ,其内部大致结构如下图所示:
在这里插入图片描述
Engine :引擎,用来管理多个站点, 一个Service最多只能有一个Engine
Host :代表一个站点,也可以叫虚拟主机,通过配置Host 就可以添加站点;
Context :代表一个应用程序,即为我们开发的一个war服务在webapp目录下的各个应用,或者一个WEB-INF 目录以及下面的web.xml 文件;
Wrapper :每个Wrapper 封装着一个servlet

二、一次HTTP请求在tomcat中的流程


图片来自于网络
由上图可知。当一个HTTP请求到达Tomcat后,所经历的大致流程如下:
1、在用户在浏览器中点击页面进行数据请求后,Tomcat本机默认端口8080接收到数据请求,被在那里监听的Coyote HTTP/1.1 Connector获得;
2、Connector把封装好的Request请求交由其所在的Service的Engine来处理,并等待Engine的回应;
3、Engine获得请求localhost/test/index.jsp,匹配所有的虚拟主机Host
4、Engine匹配到名为localhostHost(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机),名为localhostHost获得请求/test/index.jsp,匹配它所拥有的所有的ContextHost匹配到路径为/testContext(如果匹配不到就把该请求交给路径名为“ ”的Context去处理);
5、path=“/test”Context获得请求/index.jsp,在它的mapping table中寻找出对应的ServletContext匹配到URL PATTERN为*.jsp的Servlet,对应于JspServlet类;
6、构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServletdoGet()doPost().执行业务逻辑、数据存储等程序;
7、Context把执行完之后的HttpServletResponse对象返回给Host
8、HostHttpServletResponse响应对象返回至Engine
9、EngineHttpServletResponse响应对象返回至Connector
10、ConnectorHttpServletResponse响应对象返回给客户端的浏览器。

三、总结

本文主要讲解了Tomcat系统架构,同时介绍了其中涉及的重要组件。第二节主要叙述了HTTP请求在Tomcat中的流转过程。在下篇文章中,我们将从源码的角度出发来一探Tomcat的运行原理。

猜你喜欢

转载自blog.csdn.net/Diamond_Tao/article/details/87389315