Tomcat启动流程分析

news2024/11/17 17:45:38

通过前面的学习,相信已经对Tomcat这个容器已经有了自己的一些认知,接下来的话我们将会一起来进行探讨Tomcat的架构设计和目录解析。

一、Tomcat目录解析

  • /bin 启动、关闭和其他脚本
  • /conf 配置文件和相关DTD。比较重要的是server.xml,这里面书写了tomcat的相关配置,可以配置最大线程数,连接器的类型等等。
  • /logs 默认的配置文件存放的地址
  • /webapps 这是网络应用程序所在的位置

二、名词解释

2.1 Server

在 Tomcat 的世界里,服务器代表了整个容器。Tomcat 提供了服务器接口的默认实现,用户很少对其进行自定义。Server元素代表整个 Catalina servlet 容器。因此,它必须是配置文件中的单个最外层元素conf/server.xml。它的属性代表了servlet容器整体的特征。

public interface Server extends Lifecycle {

    public NamingResourcesImpl getGlobalNamingResources();

    public void setGlobalNamingResources
        (NamingResourcesImpl globalNamingResources);

    public javax.naming.Context getGlobalNamingContext();

    public int getPort();
    
    public void setPort(int port);
    
    public int getPortOffset();

    public void setPortOffset(int portOffset);

    public int getPortWithOffset();

    public String getAddress();

    public void setAddress(String address);

    public String getShutdown();

    public void setShutdown(String shutdown);

    public ClassLoader getParentClassLoader();

    public void setParentClassLoader(ClassLoader parent);

    public Catalina getCatalina();

    public void setCatalina(Catalina catalina);

    public File getCatalinaBase();

    public void setCatalinaBase(File catalinaBase);
    
    public File getCatalinaHome();

    public void setCatalinaHome(File catalinaHome);

    public int getUtilityThreads();

    public void setUtilityThreads(int utilityThreads);

    public void addService(Service service);

    public void await();

    public Service findService(String name);

    public Service[] findServices();

    public void removeService(Service service);

    public Object getNamingToken();

    public ScheduledExecutorService getUtilityExecutor();
}

2.2 Service

服务是一种中间组件,位于服务器内部,并将一个或多个连接器绑定到一个引擎。Service 元素很少由用户自定义,它的默认实现已经很丰富了。Service元素表示一个或多个连接器组件的组合,这些连接器组件共享单个 引擎组件来处理传入请求。一个或多个Service元素可以嵌套在Server元素内。唯一可以嵌套在Service 元素内的组件是一个或多个Connector元素,后跟一个Engine元素。

public interface Service extends Lifecycle {

    public Engine getContainer();

    public void setContainer(Engine engine);

    public String getName();

    public void setName(String name);

    public Server getServer();

    public void setServer(Server server);

    public ClassLoader getParentClassLoader();

    public void setParentClassLoader(ClassLoader parent);

    public String getDomain();

    public void addConnector(Connector connector);

    public Connector[] findConnectors();
    
    public void removeConnector(Connector connector);

    public void addExecutor(Executor ex);

    public Executor[] findExecutors();

    public Executor getExecutor(String name);

    public void removeExecutor(Executor ex);

    Mapper getMapper();
}

2.3 Engine

引擎 代表特定服务的请求处理管道。由于服务可能有多个连接器,引擎接收并处理来自这些连接器的所有请求,将响应返回到适当的连接器以传输给客户端。 可以实现引擎接口来提供定制引擎。
Engine元素代表与特定 Catalina服务关联的整个请求处理机制 。它接收并处理 来自一个或多个Connector 的所有请求,并将完成的响应返回给 Connector,以便最终传输回客户端。

恰好有一个Engine元素必须嵌套在Service元素内,位于与该 Service 关联的所有相应 Connector 元素之后。

2.4 Host

主机是网络名称与 Tomcat 服务器的关联。一个引擎可以包含多个主机,Host 元素还支持网络别名。
一个或多个Host元素嵌套在 Engine元素内。在 Host 元素内,您可以为与该虚拟主机关联的 Web 应用程序嵌套Context元素。与每个引擎关联的主机之一必须具有与 defaultHost该引擎的属性匹配的名称。

客户端通常使用主机名来标识他们希望连接的服务器。此主机名也包含在 HTTP 请求标头中。Tomcat 从 HTTP 标头中提取主机名并查找 具有匹配名称的主机。如果未找到匹配项,则请求将路由到默认主机。默认主机的名称不必与 DNS 名称匹配(尽管可以),因为任何 DNS 名称与 Host元素的名称不匹配的请求都将被路由到默认主机。

2.5 Connector

连接器处理与客户端的通信。Tomcat 有多个连接器。其中包括 HTTP 连接器和 AJP 连接器,前者用于处理大多数 HTTP 流量,尤其是在将 Tomcat 作为独立服务器运行时;后者用于实现将 Tomcat 连接到 Apache HTTPD 服务器等网络服务器时使用的 AJP 协议。

2.6 Context

一个上下文代表一个网络应用程序。一个主机可能包含多个上下文,每个上下文都有唯一的路径。可以通过实现 Context 接口来创建自定义 Context。

三、结构图

这里我们需要明白一点,Tomcat为了更好的划分职责,将内部架构主要分为了两个连接器和容器,连接器只负责接收网络请求,通过指定的解析器然后将请求解析,转化为容器可以识别ServletRequest,而容器和连接器通信也是通过ServletResponse来进行实现。
在这里插入图片描述

3.1 容器层次

容器里面则是负责ServerResponse的具体处理,比如通过路径映射到对应的Servlet,执行过滤器链,执行具体的业务逻辑等都是在容器这里,下面我们在一起来观察下容器的结构图。
在这里插入图片描述
通过上面的两张图我们可以了解到在Tomcat的架构中,连接器是可以有多个的,通过Service绑定到一个具体的引擎上,这其中的关系可以是多对一的关系。而引擎里面也可以有多个Host,用于区分不同的站点。就相当于一个独立的web程序,通过虚拟的域名分隔开。再者就是Context,它是一个应用的上下文,保存着一些运行时的必要数据,一个应用可以有多个上下文信息,最后便是Wrapper包装的Servlet,在这里通过路径匹配,将URL资源路径名映射到对应的Servlet实现类,这便是Tomcat的一个基本的架构。

3.2 Jetty结构

相较于Tomcat的架构来说,Jetty的架构就显得比较小巧清晰,主要是由Connector,Handler和ThreadPool组成,在这里是不是有点熟悉,其实这个有点像Netty的架构,也有点像Redis的架构。
Redis的结构是单独的开了一个连接器用来接收连接,之后判断到来的请求是读请求还是写请求,然后通过分发给对应的任务处理器,处理后再进行返回。而Netty则是通过Selector,Channel,Buffer这几个组件实现,当连接到达时进行接受,然后绑定channel,将channel注册到Selector,之后的通信都通过channel进行处理,之后的任务处理内部也维护的有自己的处理线程池。如果出现瓶颈的话会考虑拓展多个Selector等等一系列的优化手段。

四、测试环境运行

我们之前只是搭建好了我们自己的Tomcat的测试环境,但是我们还没有进行编写我们自己的Servlet,下来的话我们就要来进行测试一下我们搭建的平台是否可用,然后来进行注册我们自己的Servlet。

4.1 编码

@WebServlet("/myservlet")
public class MyServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println(1111);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1338740.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python测试框架pytest核心库pluggy详解

代码案例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 import pluggy # HookspecMarker 和 HookimplMarker 实质上是一个装饰器带参数的装饰器类,作用是给函数增加额外的…

SCA在 得物 DevSecOps 平台上应用

SCA在 得物 DevSecOps 平台上应用。 ############################# 免责声明:工具本身并无好坏,希望大家以遵守《网络安全法》相关法律为前提来使用该工具,支持研究学习,切勿用于非法犯罪活动,对于恶意使用该工具造成的损失,和本人及开发者无关。 ###################…

CAD objectArx 在操作mfc时出现“不支持尝试执行的操作“

问题原因: ARX中对话框通常继承自CAcUiDialog,CAcUiDialog 构造函数有个参数 HINSTANCE hInstance,默认为 NULL,指定了对话框资源所在DLL进程。如果没有指定该参数,在创建对话框(DoModal或Create&#xff…

超维空间S2无人机使用说明书——42、使用3维雷达进行室内定位——实物篇

引言:为了提高无人机室内定位的稳定性和多种定位方案,S系列无人机推出了基于三维雷达激光点云数据的定位方案。该方案的提出是为了改善视觉定位容易受到光照等影响导致的位置漂移。 简介 定位采用fast-lio定位算法,通过修改源码直接发布定位…

MySQL数据库——多表查询

1. 概述 MySQL中的多表查询是指在一个查询中同时使用两个或多个表,通过某种关系将它们连接起来,以检索所需的数据。多表查询在数据库操作中非常常见,尤其是在处理复杂的数据关系时。 简单讲就是:多表查询是指从多个表中检索数据…

HPM6750开发笔记《第一个helloworld例程》

HPM_SDK的使用: HPM_SDK界面如下图 此处选择所支持的5款evk大家根据自己的板子选 此处选择想看的例程工程 此处可选择生成工程的类型 其中debug工程是在纯RAM中运行的,板子掉电后代码会被删除,用来测试比较合适 其中挂flash的工程有两种其中…

【Java基础系列】equals方法使用与总结

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

加速布局!美格智能获国内某自主大厂智能座舱项目模组定点

近日,销售前线又传来重大好消息,美格智能座舱模组正式获得国内某自主大厂前装智能座舱项目定点。此次项目由主机厂直接定点模组,基于美格智能座舱模组SLM925来打造平台化智能座舱解决方案,同时此方案也将会应用于该汽车品牌及旗下…

【JavaWeb学习笔记】15 - jQuery

项目代码 https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/jquery 目录 零、官方文档 一、jQuery基本介绍 1.基本介绍 2.原理图 二、JQuery入门使用 1.下载JQuery 2.jQuery快速入门 三、jQuery对象 1.什么是jQuery对象? 2.DOM对象转换成jQuery对象 …

数据结构与算法(C语言版)P11——查找

1、查找的基本概念 从着一章节开始学习查找, 查找时属于数据的运算里面的知识。 数据的元素包括:查找、排序、插入、删除、修改等。 问题一:那里查找? 首先要清楚,是在哪里进行查找操作?是在线性表中找…

【Redis】七、Redis主从复制(重点)

文章目录 1、概念1.1、主从复制的作用主要包括1.2、一般来说,要将Redis运用于工程项目中,只使用一台Redis是万万不能的(宕机),原因如下 2、环境配置2.1、复制拷贝3个配置文件,然后修改对应的信息拷贝文件改…

2024,智能汽车走出独立曲线

文|刘俊宏 新能源汽车正在带领中国车市走向新的高峰。 在2023年,新能源汽车的增速显著超越整体车市。据中汽协预测,2023年,汽车总销量有望突破3000万辆,同比增长11.7%。其中,乘用车预计达到2600万辆&…

《软件需求分析报告》

第1章 序言 第2章 引言 2.1 项目概述 2.2 编写目的 2.3 文档约定 2.4 预期读者及阅读建议 第3章 技术要求 3.1 软件开发要求 第4章 项目建设内容 第5章 系统安全需求 5.1 物理设计安全 5.2 系统安全设计 5.3 网络安全设计 5.4 应用安全设计 5.5 对用户安全管理 …

SpringBoot3 应用分析

SpringBoot3-快速入门 1、简介 1. 前置知识 Java17Spring、SpringMVC、MyBatisMaven、IDEA 2. 环境要求 环境&工具版本(or later)SpringBoot3.0.5IDEA2021.2.1Java17Maven3.5Tomcat10.0Servlet5.0GraalVM Community22.3Native Build Tools0.9.1…

免费IDEA插件,Apipost出品!

IDEA插件市场中的API调试插件不是收费(Fast Request )就是不好用(apidoc、apidocx等等)今天给大家介绍一款国产的API调试插件:Apipost-Helper,完全免费且好看好用! 这款插件由Apipost团队开发的…

12.26ARM作业

三个按键中断&#xff0c;控制对应灯亮灭 main.c #include "key_it.h"void delay(int ms){int i,j;for(i0;i<ms;i){for(j0;j<2000;j);}}int main(){all_led_init();key1_it_config();key2_it_config();key3_it_config();while(1){printf("do main...\n&…

【每日一题】LeetCode160.相交链表

个人主页&#xff1a;白日依山璟 专栏&#xff1a;Java|数据结构与算法|每日一题 文章目录 1. 题目描述示例1&#xff1a;示例2&#xff1a;提示&#xff1a; 2. 思路3. 代码 1. 题目描述 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的…

【PTA】L1-32 Left-pad (C++)

题目链接&#xff1a;L1-032 Left-pad 题目要求&#xff1a; 根据新浪微博上的消息&#xff0c;有一位开发者不满NPM&#xff08;Node Package Manager&#xff09;的做法&#xff0c;收回了自己的开源代码&#xff0c;其中包括一个叫left-pad的模块&#xff0c;就是这个模块…

Mysql实时数据同步工具Alibaba Canal 使用

目录 Mysql实时数据同步工具Alibaba Canal 使用Canal是什么&#xff1f;工作原理重要版本更新说明 环境准备安装Canalwindow Java : Canal Client 集成依赖编码 工作流程其他学习canal资料 个人主页: 【⭐️个人主页】 需要您的【&#x1f496; 点赞关注】支持 &#x1f4af; M…

7.7、kali linux环境下搭建DVWA

目录 一、资料下载准备工作 1.1、DVWA源代码下载 二、开启Apache、mysql服务 2.1、下载Apache2文件 2.2、开启Apache2服务 方法一&#xff1a;开启Apache2服务&#xff08;手动&#xff09; 方法二&#xff1a;开启Apache2服务&#xff08;系统自启动&#xff09; 2.3、…