tomcat组件架构图梳理(代码片段)

默辨 默辨     2022-12-04     151

关键词:

本文适合有基础的小伙伴,如果你对tomcat启动及请求的流程处理不熟悉,可能看起来会比较吃力。有兴趣了解的小伙伴可以参考我之前的博客,希望对你有帮助:


浅谈Tomcat的启动流程(源码级别)

浅谈Tomcat接收到一个请求后在其内部的执行流程(源码)


文章目录



本文主要目的为简单梳理tomcat组件架构,及其整体架构的设计模式。



一、整体架构图




二、准备工作(tomcat启动)

整个准备工作,可以直接理解为一个模板方法模式

1、startup.sh:直接启动tomcat时,使用到的shell脚本,该脚本是整个tomcat的启动入口;

2、LifecycleBase:tomcat为了统一管理tomcat启动过程中相关组件的生命周期,使用了模板方法设计模式。该方法中包含了顶层的接口为Lifecycle,以顶层接口中的init和stop方法为例,LifecycleBase抽象类首先对init和stop方法进行一个基础的过滤,然后继续调用子类的initInternal和stopInternal方法。如果希望向tomcat中添加组件,就可以直接实现LifecycleBase抽象类,然后重写我们希望处理的生命周期的各个方法;

3、init:初始化需要使用的类加载器(tomcat需要打破双亲委派机制,用来保证应用与应用之间的隔离性)

4、load:首先按照catalina.java类中配置的标签规则,解析server.xml类中各个标签的数据;然后根据前面的配置信息,初始化相关的组件对象,这里就包含了我们后文所需要的Connector、ProtocolHandler、Pipeline等对象;

5、start:我们实例化出来的一些组件对象,是用来处理请求的,这里就涉及相关后台线程的开启,该步骤的主要任务也主要就是开启对应的后台线程任务。




三、处理请求(后台线程处理)

整个tomcat是一个大的server组件,每部署一个服务就是一个service组件。

整个请求处理组件是基于组合模式,这里涉及了ProtocolHandler、EndPoint、Processor

具体ServletRequest对象数据的转发涉及到适配器模式,这里涉及Container、Adapter

1、Connector:在tomcat启动阶段,会根据server.xml中如下的标签,选择初始化何种的Connector对象,即完成对protocolHandlerClassName参数的赋值,后期利用反射初始化ProtocolHandler对象

<Connector connectionTimeout="20000" port="8082" protocol="HTTP/1.1" redirectPort="8443"/>

2、ProtocolHandler:内部含有EndPoint+Processor的组合操作。分别用于解决什么网络IO模型(NIO、APR、JIO),什么应用层协议(HTTP、AJP)。这里就是组合模式的体现

3、EndPoint:用于通信监听的接口,是具体的 Socket 接收和发送处理器,是对传输层的抽象。每一个EndPoint类中都有一个Acceptor类,用来接收外部发来的请求。

4、Processor:Processor 用来实现 HTTP/AJP 协议,是对应用层的抽象。Processor 接收来自 EndPoint 的 Socket,读取字节流解析成 Tomcat Request 和 Response 对象,并通过 Adapter 将其提交到容器处理

5、Adapter:紧接上文, Adapter接收由ProtocolHandler组件处理后的ServletRequest,但由于协议不同,客户端发过来的请求信息也不尽相同,但我们编写的具体的业务代码中的ServletRequest是一个标准的对象。Tomcat的解决办法为使用适配器模式门面模式,通过CoyoteAdapter 类的service方法,将非标准的ServletRequest对象(org.apache.coyote.ServletRequest)适配为ServletRequest对象(org.apache.catalina.connector),但真正的传递给业务层面的ServletRequest是经过tomcat门面模式处理后符合servlet规范的ServletRequest对象(javax.servlet.ServletRequest)

6、Container:用来装载东西的容器,在 Tomcat 里,容器就是用来装载 Servlet 的。Tomcat 通过一种分层的架构,使得 Servlet 容器具有很好的灵活性。Tomcat 设计了 4 种容器,分别是 Engine、Host、Context 和 Wrapper。这 4 种容器不是平行关系,而是父子关系。**该部分对象的初始化也是在tomcat启动阶段完成的,这里将所有的组件以内部next属性嵌套的关系完成调用。**这里的四个对象虽然属于父子关系,但是他们的实现方式都是基于一个ValveBase抽象类的模板方法,使用内部的next属性完成父子关系的构建。

  • Engine:引擎,Servlet 的顶层容器,用来管理多个虚拟站点,一个 Service 最多只能有一个 Engine;
  • Host:虚拟主机,负责 web 应用的部署和 Context 的创建。可以给 Tomcat 配置多个虚拟主机地址,而一个虚拟主机下可以部署多个 Web 应用程序;
  • Context:Web 应用上下文,包含多个 Wrapper,负责 web 配置的解析、管理所有的 Web 资源。一个Context对应一个 Web 应用程序;
  • Wrapper:表示一个 Servlet,最底层的容器,是对 Servlet 的封装,负责 Servlet 实例的创建、执行和销毁。
// 指定service中的,指定container中的,指定的pipeline中的,第一个需要处理的ValveBase请求过滤实现类
xxx.getService().getContainer().getPipeline().getFirst().invoke(request, response)

tomcat组件梳理--server(代码片段)

Tomcat组件梳理--Server1.Server组件的定义和功能概述定义:Server组件用于描述一个启动的Tomcat实例,一个Tocmat被启动,在操作系统中占用一个进程号,提供web服务的功能,那个这个整个服务用Server来表示。功能Server作为描述一个Tomca... 查看详情

tomcat组件梳理--catalina(代码片段)

Tomcat组件梳理--Catalina1.定义和功能Catalina是Tomcat的核心组件,是Servlet容器,Catalina包含了所有的容器组件,其他模块均为Catalina提供支撑。通过Coyote模块提供连接通信,Jasper模块提供JSP引擎,Naming提供JNDI服务,Juli提供日志服务。... 查看详情

1.tomcat组件梳理—bootstrap启动器(代码片段)

Tomcat组件梳理—Bootstrap启动器一开始是直接从Server开始做梳理的,但是发现有很多东西是从Catalina传输过来的,Catalina又是从Bootstrap启动的,所以还是回过头来从Bootstrap开始梳理吧。1.定义和功能Bootstrap是Tomcat的入口类,main方法... 查看详情

tomcat底层原理(代码片段)

目录前言Tomcat底层架构组成1、Context——servlet容器2、Host——servlet容器3、Engine——servlet容器4、Wrapper——servlet容器5、Pipiline管道Tomcat的请求处理流程Tomcat架构平视图JavaSocket底层实现Connector组件1、BIO的方式取数据2、NIO的方式取... 查看详情

openstack入门之核心组件梳理——glance篇(代码片段)

OpenStack入门之核心组件梳理(3)——Glance篇前言?之前的文章中相继介绍了OpenStack中关于Keystone以及Nova组件的概念、架构、原理等内容,那么本文继续讲述OpenStack中的Glance组件的相关理论要点。?对于Glance组件的理解还是需要对Ope... 查看详情

19张图梳理springcloud中的重要知识点

...案2、SpringCloud概览2.1、什么是SpringCloud2.1、SpringCloud主要组件3、总结1、什么是微服务1.1、架构演进架构的发展历程是从单体式架构,到分布式架构,到SOA架构,再到微服务架构。图1:架构演进单体架构:未做任何拆分的JavaWeb程... 查看详情

tomcat学习笔记系统架构和原理(代码片段)

tomcat学习笔记(一)系统架构和原理Tomcat浏览器访问服务器的流程tomcat请求处理大致过程tomcat系统总体架构coyote连接器组件coyote内部组件和工作流程servlet容器Catalinatomcat核心配置文件server.xmlTomcatb/s(浏览器/服务器模... 查看详情

day676.jetty架构之connector组件-深入拆解tomcat&jetty(代码片段)

...ctor组件部分。Jetty是Eclipse基金会的一个开源项目,和Tomcat一样,Jetty也是一个“HTTP服务器+Servlet容器”,并且Jetty和Tomcat在架构设计上有不少相似的地方。但同时Jetty也有自己 查看详情

day677.jetty架构之handler组件-深入拆解tomcat&jetty(代码片段)

Jetty架构之Handler组件Hi,阿昌来也,今天学习记录的是关于Jetty架构之Handler组件的学习。Jetty就是由多个Connector(连接器)、多个Handler(处理器),以及一个线程池组成,整体结构图如下。JettyConnect... 查看详情

apachetomcat(代码片段)

Tomcat讲解第⼀部分:Tomcat系统架构与原理剖析第1节浏览器访问服务器的流程第2节Tomcat系统总体架构2.1Tomcat请求处理⼤致过程2.2TomcatServlet容器处理流程2.3Tomcat系统总体架构第3节Tomcat连接器组件Coyote3.1Coyote简介3.2Coyote的内部组... 查看详情

你可能不那么知道的tomcat生命周期管理|博学谷狂野架构师(代码片段)

Tomcat生命周期管理各种组件如何统一管理Tomcat的架构设计是清晰的、模块化、它拥有很多组件,加入在启动Tomcat时一个一个组件启动,很容易遗漏组件,同时还会对后面的动态组件拓展带来麻烦。如果采用我们传统的方式的话,... 查看详情

tomcat组件化设计(代码片段)

1组件化及可配置Tomcat整体架构基于组件,可通过XML或代码配置组件。如server.xml配置Tomcat的连接器及容器组件。Tomcat提供一堆积木,怎么搭建这些积木你决定,你可根据需要灵活选择组件搭建你的Web容器,并且可... 查看详情

jetty架构设计之connectorhandler组件(代码片段)

Jetty是Eclipse基金会的一个开源项目,和Tomcat一样,Jetty也是一个“HTTP服务器+Servlet容器”,并且Jetty和Tomcat在架构设计上有不少相似的地方。但同时Jetty也有自己的特点,主要是更加小巧,更易于定制化。Jett... 查看详情

sedna终身学习以及kubeedge梳理(代码片段)

文章目录一、KubeEdge以及Sedna架构1KubeEdge架构及组件1.1整体架构1.2CloudCore组件1.3EdgeCore组件1.4EdgeMesh插件2Sedna架构及组件二、Sedna边云协同终身学习1边云协同机器学习的挑战以及解决方式1.1挑战1.2如何解决2经典终身学习框架与Sedna... 查看详情

openstack架构知识梳理(代码片段)

OpenStack既是一个社区,也是一个项目和一个开源软件,提供开放源码软件,建立公共和私有云,它提供了一个部署云的操作平台或工具集。包括OpenStack计算(代号为Nova),OpenStack对象存储(代号为Swift),并OpenStack镜像服务(代... 查看详情

vue使用vue-tree-color组件实现组织架构图(递归数据,简单明了)(代码片段)

npm#usenpmnpminstallvue-tree-color安装loadernpminstall--save-devlessless-loaderImportPluginsimportVuefrom'vue'importVue2OrgTreefrom'vue-tree-color'Vue.use(Vue2OrgTree)开始因为已经安装过了组件, 查看详情

day673.tomcat系统架构(容器)-深入拆解tomcat&jetty(代码片段)

Tomcat系统架构(容器)Hi,我是阿昌,昨天学习的是关于Tomcat系统架构的连接器内容,今天是关于容器的内容。Tomcat有两个核心组件:连接器和容器,其中连接器负责外部交流,容器负责内部处理。具体来说... 查看详情

calicoonkubernetes(代码片段)

文章目录Calico网络模型Calico网络的转发细节路由配置组件Felix路由广播组件BGPSpeakerCalico架构Calico全景架构图全连接复杂性与规模问题大规模部署架构图跨网段访问问题Calico的IPIP模式(解决物理机不在一个网段的问题)推荐阅读Calico... 查看详情