系列文章目录和关于我

参考书籍《Tomcat架构解析》

一丶Tomcat总体架构

本文沿袭《Tomcat架构解析》中启发式的方式来总结Tomcat总体架构

1 Server

Server接受客户端发送的请求数据并进行解析,完成相关的业务处理,然后将处理结果作为响应返回给请求计算机。

从上面这段话来看,如果我们将上述功能全部让Server去做实现,那么让请求监听和请求处理耦合度很高,不利于适配。

2.Connector 和 Container

如何解决请求监听和请求处理耦合度很高的问题?加一层就好。

  • Connector

    Connector负责开启socket并且监听客户端请求,返回响应数据。

  • Engine

    Engine负责处理具体的请求

如是我们有下面这种设计

这种设计需要server维护Connector和Engine的关系,才可以将Connector的请求交给对应Engine

并且无法做到一个Tomcat服务器运行多个服务,比如订单服务,用户服务。将Connector和Engine都交给Server处理,无法实现服务间的隔离。

3.Service

如何实现服务间的隔离?加一层就好

Server表示Tomcat服务器,一个Tomcat服务器可以部署多个服务,比如订单服务,用户服务。这里的服务就是Service。

由Service负责当前自己服务中的维护Connector 和 Engine,Server负责管理多个服务

4.Context,Host,Wrapper

  • Context

    应用服务器是用来部署并允许web应用的,是一个运行环境,而不是一个独立业务处理系统,因此在Engine容器需要支持管理web应用,这里便是使用Context来表示一个web应用

  • Host

    Tomcat除了可以支持多个web应用之外,还需要可以支持多域名服务,比如一个主机可以承担多个域名,比如newx.cuzz.com,game.cuzz,com。因此需要把每一个域名视为一个虚拟主机,在每一个虚拟主机下包含多个web应用。

  • Wrapper

    在一个web应用中可以包含多个不同的servlet实例处理来自不同连接的请求,因此还需要一个组件的概念来表示tomcat中的servlet,这个组件就是Wrapper

5.Container

Container表示一类组件,它们负责接受来自客户端的请求,并返回响应数据,这个过程往往会委托其他组件去完成,但是本质上它们是一致的——都是接受请求,返回响应数据。

Container表示容器,可以添加并维护子容器,因此Engine,Host,Context,Wrapper均继承自Container

Container还提供了backgroundProcess方法,方便子类实现后台任务

6.Lifecycle

可以看到上图中组件都存在start,stop等生命周期方法,因此Tomcat抽象出Lifecycle接口,表示生命周期,定义了init,start,stop,destory等生命周期回调方法。并且还提供了LifecycleListener使用监听器模式来实现生命周期事件监听。

7.Pipeline和Valve

为了增强扩展性,tomcat定义了Pipeline(管道)和Valve(阀),Pipeline使用职责链的方式串联多个Valve——来自客户端的请求如同流水一样流淌在管道中,收到每一个阀的作用。

Pipeline中维护了基础的Valve,始终位于Pipeline末端,通过Pipeline#addValve添加的Valve违约基础的Valve之前。

在Tomcat中Engine,Host,Context,Wrapper都有对应的Valve实现,同时维护了一个Pipeline,从而让我们可以对请求的处理进行扩展。

8.Connector设计

一个Connector处理请求的流程大致如下

这些操作会被委托给Endpoint,ProtocolHandler,Processor

  • Endpoint:tomcat中没有这个接口,只有AbstractEndpoint,它负责启动线程来监听服务器端口,并且在接受到数据后交给Processor处理
  • Processor:Processor读取到客户端请求后按照请求地址映射到具体的容器进行处理,这个过程请求映射,Processor实现请求映射依赖于Mapper对象,在容器发生注册和注销的时候,MapperListener会监听到对应的事件,从而来变更Mapper中维护的请求映射信息。
  • ProtocolHandler:协议处理器,针对不同的IO方式(NIO,BIO等)和不同的协议(Http,AJP)具备不同的实现,ProtocolHandler包含一个Endpoint来开启端口监听,并且包含一个Processor用于按照协议读取数据并将请求交给容器处理。

在次之外Tomcat 还有一个Adapter接口,上面说到Processor会依赖Mapper实现请求映射,但是其实Proccessor并没有直接持有一个Mapper,而是持有一个Adapter,由Adapter负责实现请求映射并交由Container处理请求。Adapter在Tomcat中只有一个实现CoyoteAdapter。

CoyoteAdapter在Processor和 Mapper以及Container中横插一脚,实现Connector和Mapper以及Container的解耦。

结合tomcat整体架构后的图

9.Executor

Tomcat定义了Executor接口,只有一个实现类StandardThreadExecutor,目的是为了实现tomcat组件间的线程池共享,并且这个线程池由Service进行管理,即同一个Server中的组件可以共享一个线程池。

10 Bootstrap与Catalina

Tomcat通过类Catalina提供了一个Shell程序,用于解析server.xml创建各个组件。同时,负责启动、停止应用服务器(启动tomcat顶层组件Server)

Tomcat提供了Bootstrap作为应用服务器启动入口,Bootstrap负责反射创建Catalina实例,根据执行参数调用Catalina相关方法完成针对应用服务器的操作(启动、停止)。

在Tomcat发布包中,Bootstrap位于$CATALINA_HOME/bin下,和Tomcat应用服务器完全松耦合(通过反射调用Catalina实例),它可以直接依赖JRE运行并为Tomcat应用服务器创建共享类加载器,用于构造Catalina实例及整个Tomcat服务器。



二丶Tomcat启动流程

可以看到Tocmat的启动流程非常标准化,这得益于这些组件都实现了Lifecyle接口。首先是调用init初始化组件,然后调用start方法启动组件,每次调用都伴随着生命周期事件的触发。

三丶Tomcat处理一个请求的流程

应用程序的请求处理,开始于监听服务器socket端口接受到数据,结束与服务器处理结果写入Socket输出流。

在此过程中,服务器需要将请求内容按照协议内容进行解析,封装为对象,然后根据请求映射规则定位到具体Servlet,这个Servlet中就是我们业务逻辑(SpringMVC中是DispatcherServlet将进一步将请求分发到Controller)Servlet处理结束后,响应对象将按照协议内容写如输出流。

Tomcat总体架构,启动流程与处理请求流程的更多相关文章

  1. Tomcat总体架构和启动流程

    Tomcat大家都知道,这个没什么好描述的,我们先看Tomcat的总体架构 1.总体架构 架构一步一步增加组件,先来个最原始的 === Server:Tomcat的整体服务,负责接收和处理请求.其拥有 ...

  2. Tomcat架构解析(一)-----Tomcat总体架构

    Tomcat是非常常用的应用服务器,了解Tomcat的总体架构以及实现细节,对于理解整个java web也是有非常大的帮助. 一.Server   1.最简单的服务器结构 最简单的服务器结构如图所示: ...

  3. tomcat总体架构

    Tomcat 总体结构图 从上图中可以看出Tomcat的心脏是两个组件:Connector 和 Container,关于这两个组件将在后面详细介绍.Connector 组件是可以被替换,这样可以提供给 ...

  4. java面试记录二:spring加载流程、springmvc请求流程、spring事务失效、synchronized和volatile、JMM和JVM模型、二分查找的实现、垃圾收集器、控制台顺序打印ABC的三种线程实现

    注:部分答案引用网络文章 简答题 1.Spring项目启动后的加载流程 (1)使用spring框架的web项目,在tomcat下,是根据web.xml来启动的.web.xml中负责配置启动spring ...

  5. Tomcat 第三篇:总体架构设计

    Tomcat 总体架构设计 在开始这篇文章的时候,忽然发现上一篇内容的题目不是很合适,不应该叫启动流程,更确切的应该是叫启动脚本. 在最开始,先介绍下 Tomcat 的总体设计,先有一个大概的印象,对 ...

  6. SpringMVC学习笔记一(请求流程和配置,启动项目)

    springmvc请求流程: 1.用户发送请求至前端控制器DispatcherServlet 2.DispatcherServlet收到请求调用HandlerMapping处理器映射器. 3.处理器映 ...

  7. Tomcat 系统架构与设计模式

    Tomcat 系统架构与设计模式,第 1 部分: 工作原理 这个分为两个部分的系列文章将研究 Apache Tomcat 的系统架构以及其运用的很多经典设计模式.本文是第 1 部分,将主要从 Tomc ...

  8. Tomcat 系统架构与设计模式,第 1 部分: 工作原理(转载)

    简介: 这个分为两个部分的系列文章将研究 Apache Tomcat 的系统架构以及其运用的很多经典设计模式.本文是第 1 部分,将主要从 Tomcat 如何分发请求.如何处理多用户同时请求,还有它的 ...

  9. Tomcat 系统架构与设计模式,第 1 部分: 工作原理

    简介: 这个分为两个部分的系列文章将研究 Apache Tomcat 的系统架构以及其运用的很多经典设计模式.本文是第 1 部分,将主要从 Tomcat 如何分发请求.如何处理多用户同时请求,还有它的 ...

  10. tomcat 系统架构与设计模式 第一部分 系统架构工作原理 转

    Tomcat 系统架构与设计模式,第 1 部分: 工作原理 许 令波, Java 开发工程师, 淘宝网 许令波,现就职于淘宝网,是一名 Java 开发工程师.对大型互联网架构设计颇感兴趣,并对一些开源 ...

随机推荐

  1. JSP基础语法笔记一

    JSP是一种脚本语言. 代码片段,方法内容: <% 代码片段 %> <jsp:scriptlet> 代码片段 </jsp:scriptlet> 设置编码格式,正常显 ...

  2. 通过cpolar内网穿透 https://blog.csdn.net/CpolarLisa/article/details/128148698

    远程办公:通过cpolar内网穿透,远程桌面控制家里公司内网电脑_Cpolar Lisa的博客-CSDN博客 https://blog.csdn.net/CpolarLisa/article/deta ...

  3. ThinkPHP网站安全方案

    一.ThinkPHP介绍 ThinkPHP是一款优秀的网站内容管理系统,因其功能强大,操作简单,拥有海量用户和其他CMS一样,安全漏洞也是其无法避免的问题.虽然官方不断发布补丁.升级版本,但安全问题依 ...

  4. Caused by: java.lang.NoSuchMethodError

    ERROR [localhost-startStop-1] - Context initialization failedorg.springframework.beans.factory.BeanD ...

  5. ICSFUZZ:操纵I/O、二进制代码重用以及插桩,来Fuzzing工业控制应用程序

    ​ 本文系原创,转载请说明出处 Please Subscribe Wechat Official Account:信安科研人,获取更多的原创安全资讯 源码:GitHub - momalab/ICSFu ...

  6. 【LeetCode回溯算法#06】复原IP地址详解(练习如何处理边界条件,判断IP合法性)

    复原IP地址 力扣题目链接(opens new window) 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255 ...

  7. 记录一次线上gitlab11.x升级gitlab14.x版本操作

    前言:gitlab11升级到14还是有挺多需要注意的坑,也算是做一次积累吧,升级前后,gitalb的WEB界面也变化了很多,升级过程需要注意的地方我放到最后说明,挺关键的 一.首先需要下载好要升级的包 ...

  8. Java笔记第七弹

    案例:复制Java文件(打印流改进版) import java.io.*; public class Main{ public static void main(String[] args) thro ...

  9. University of Toronto Faculty of Arts and Science MAT344– Final Assessment Combinatorics Instructors: Stanislav Balchev and Max Klambauer 19 August 2020

    目录 随便找的一份测试题 T7 T9 T6 T5 solution to (a) solution to (b) solution to (c) solution to (d) T1 T2 T3 T4 ...

  10. GO实现Redis:GO实现内存数据库(3)

    实现Redis的database层(核心层:处理命令并返回) https://github.com/csgopher/go-redis datastruct/dict/dict.go type Con ...