Tomcat整体架构解析

news2024/12/23 22:57:11

一、Tomcat整体架构介绍

Tomcat是一个开源的轻量级web应用服务器。整体架构如下:

  1. Tomcat中最顶层的容器是Server,即代表一个Tomcat服务器,一个Server中可以有多个Service,对外提供不同的web服务。
  2. Service是对Connector和Container的封装,一个Service中有一个或多个连接器,和一个Container容器。
  3. 连接器Connector负责监听端口接收请求并按照设定的协议进行解析数据,将解析后的请求交给容器处理。连接器之所以设计为支持多个,主要是为了方便客户端可以通过不同的协议来发送请求,一个Connector可监听一个端口 设定一种IO模式(BIO、NIO、APR)和一种应用层协议(HTTP、HTTPS和AJP等)。
  4. 容器Container负责处理连接器传递过来的已经解析封装好的请求,通过层层处理最终调用请求路径匹配的filter / servlet实例来处理请求,处理完毕后将结果原路返回由Connector发出。
    在这里插入图片描述

在这里插入图片描述

二、连接器Connector详解

Connector中使用ProtocolHandler来封装不同的IO模式和应用协议组合,例如NIO模式和HTTP1.1协议对应的就是Http11NioProtocol类。在配置文件中配置Connector的protocol属性值为Http11NioProtocol即使其成为支持NIO和HTTP1.1的连接器。

<Connector port="8080" executor="tomcatThreadPool" protocol="org.apache.coyote.http11.Http11NioProtocol" 
         redirectPort="8443" enableLookups="false" URIEncoding="UTF-8" maxKeepAliveRequests="500" />

Tomcat8前默认为BIO模式,Tomcat8.0起默认为NIO模式,并在Tomcat8.5起移除了BIO模式

在ProtocolHandler中,EndPoint类负责Socket请求的收发,Processor类负责从Socket中解析出对应协议格式的数据并封装为Request 或者反向。然后通过适配器Adapter将Request转换为标准的ServletRequest传递给Servlet容器进行处理。这样每个模块只负责必要的部分,实现功能模块的高内聚和低耦合,
在这里插入图片描述

1. EndPoint

在BIO实现的Connector中,处理请求的主要实体是JIoEndpoint对象。JIoEndpoint维护了Acceptor和一个线程池:Acceptor负责接收socket,然后从线程池中找出空闲的线程处理socket,如果线程池没有空闲线程,则Acceptor将阻塞。

在NIO实现的Connector中,处理请求的主要实体是NIoEndpoint对象。在NIoEndpoint中Acceptor接收socket后,不是直接放到线程池中处理,而是先将socket封装为一个Channel放进Poller的通道队列中,而Poller是实现NIO的关键,在Poller中,维护了一个Selector选择器对象,Poller从通道队列中取出socket后注册到该Selector中,然后通过Selector轮询,找出其中可读的socket,并放到线程池中进行后续处理。

在这里插入图片描述
Acceptor和Poller默认都是单线程的,而线程池默认使用的Tomcat自己定制的线程池,在JDK的线程池ThreadPoolExecutor中只有当任务等待队列满了才会启动非核心线程,但是在TomcatThreadPool中当核心线程数满了之后就会启动非核心线程,以便请求能够快速得到响应。
在这里插入图片描述

二、容器Container详解

容器中有如下四个组件,并且这四个组件是具有层次关系的:一个Engine下可以有多个Host,一个Host下可以有多个Context,一个Context下可以有多个Wrapper,一个Wrapper下可以有多个Servlet实例对象。

  • Engine:一个容器Container中有一个Engine

  • Host:一个Host表示一个虚拟服务器,可以给每个Host配置一个域名

  • Context:一个Context就是一个应用,一个项目

  • Wrapper:一个Wrapper是对Servlet的包装,一个Wrapper下可以有多个Servlet实例对象。
    在这里插入图片描述
    在连接器生成请求的Request对象后,传递到容器执行处理的过程如下:

  1. Mapper组件根据请求行的URL值和请求头的Host值匹配由哪个Host容器、Context容器、Wrapper容器处理请求。
  2. CoyoteAdaptor组件负责将Connector组件和Engine容器关联起来,把生成的Request对象转换为标准的ServletRequest对象传递到Engine容器中,调用 Pipeline。
  3. Engine容器的管道开始处理,管道中包含若干个Valve、每个Valve负责部分处理逻辑。执行完Valve后会执行基础的 Valve–StandardEngineValve,负责调用Host容器的Pipeline。
  4. Host容器的管道开始处理,流程类似,最后执行 Context容器的Pipeline。
  5. Context容器的管道开始处理,流程类似,最后执行 Wrapper容器的Pipeline。
  6. Wrapper容器的管道开始处理,流程类似,最后在执行完过滤链FilterChain后执行对应Servlet实例的处理方法

三、配置文件server.xml和web.xml

1. server.xml

server.xml是Tomcat的核心配置文件,定义整个Tomcat服务器的架构。其默认的主要配置如下:

<Server port="8005" shutdown="SHUTDOWN">
   <Service name="Catalina">
     <Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"
               redirectPort="8443" />
       <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
          <Engine name="Catalina" defaultHost="localhost">
             <Host name="localhost"  appBase="webapps"unpackWARs="true" autoDeploy="true">
           <Context >
                <Context />
 </Host>
    </Engine>
  </Service>
</Server>

其中定义<Server port=“8005” shutdown=“SHUTDOWN”>这会让Tomcat启动一个server实例(即一个JVM),它监听在8005端口以接收“SHUTDOWN”命令,如果接收到了就会关闭Tomcat。各Server的定义不能使用同一个端口,这意味着如果在同一个机器上启动了多个Tomcat服务器,必须配置它们使用不同的端口。

2. web.xml

上述默认Host配置中appBase="webapps“表示默认应用,Tomcat目录下:d:\tomcat\webapps 这样的路径,实际可以指定多个自定义的Context应用:

<Host name="localhost" unpackWARs="true" autoDeploy="true">
	<Context path="/js" docBase="E:\eclipse\java_web\jspPrime\webapps" reloadable="true"/>
	<Context path="/word" docBase="D:\apache-tomcat-7.0.35\webapps"/>
</Host>

<Context>用于配置一个虚拟路径,这样我们开发项目就不用都拷到webapps下了,而是指定一个虚拟路径,这个虚拟路径的名字是path=“**” 而实际绝对路径是 docBase所指的。

在Context应用目录下,需要有一个web.xml文件,用于配置Filter、Servlet类等的路径及其匹配路径。一个样例如下

<web-app>
    <display-name>MyWebapp</display-name>

    <filter>
        <filter-name>global</filter-name>
        <filter-class>com.xxxx.MyFilter</filter-class>
        <init-param>
            <param-name>test</param-name>
            <param-value>1</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>global</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <servlet>
        <servlet-name>MyHttpServlet</servlet-name>
        <servlet-class>com.xxxx.MyHttpServlet</servlet-class>
        <init-param>
            <param-name>testP</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>MyHttpServlet</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>

</web-app>

参考:

  1. Tomcat服务部署及优化
  2. Tomcat处理请求流程
  3. Tomcat – 请求处理流程

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

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

相关文章

电话号码的字母组合

题目&#xff1a;17. 电话号码的字母组合 - 力扣&#xff08;Leetcode&#xff09; 思路&#xff1a; 给定一个电话号码字符串 digits&#xff0c;须输出它所能表示的所有字母组合。我们可以先定义一个数字字符到字母表的映射表 numToStr&#xff0c;然后再用 Combine 函数递归…

【Linux专区】 环境搭建 | 带你白嫖七个月阿里云服务器

&#x1f49e;&#x1f49e;欢迎来到 Claffic 的博客&#x1f49e;&#x1f49e; &#x1f449; 专栏&#xff1a;《Linux专区》&#x1f448; 前言&#xff1a; 工欲善其事必先利其器&#xff0c;没个Linux环境怎么愉快地学Linux&#xff1f;这期就先带大家把环境搞好&#xf…

物联网系统中常见的通信协议分析

物联网&#xff08;Internet of Things, 简称IoT&#xff09;是指将各种传感器、设备等通过互联网连接起来&#xff0c;形成一个庞大的网络&#xff0c;实现物与物之间的互联互通。在实现这个过程中&#xff0c;各种不同的通信协议被广泛应用。本文将为大家介绍物联网中常见的通…

[架构之路-185]-《软考-系统分析师》-3-操作系统基本原理 - 文件索引表

目录 一、文件的索引块。 二、索引分配表 三、索引表的链接方案 四、多层索引 五、混合索引分配 一、文件的索引块。 存放在目录中的文件&#xff0c;并非是文件的真实内容。 目录中记录了文件的索引块是几号磁盘块。 文件对应的索引表是存放在指定的磁盘块中的&#x…

CSI指纹预处理(中值、均值、Hampel、小波滤波)

目录 1、前言 2、中值滤波器 3、均值滤波器 4、Hampel滤波器 5、小波变换滤波器 1、前言 因为设备、温度和实验室物品摆设等因素的影响&#xff0c;未经处理的CSI数据不能直接使用&#xff0c;需要对数据进行异常值处理以保证数据的稳定性&#xff0c;同时减少环境中人的…

云原生Istio架构和组件介绍

目录 1 Istio 架构2 Istio组件介绍2.1 Pilot2.2 Mixer2.3 Citadel2.4 Galley2.5 Sidecar-injector2.6 Proxy(Envoy)2.7 Ingressgateway2.8 其他组件 1 Istio 架构 Istio的架构&#xff0c;分为控制平面和数据面平两部分。 - 数据平面&#xff1a;由一组智能代理&#xff08;[En…

Eclipse改SSH项目,修改java代码无效

遇到了一个大坑&#xff0c;记录一下… 坑1&#xff1a;修改后台代码总是没用… 1.背景&#xff1a; Eclipse运行SSH项目&#xff08;StrutsSpringHibernate&#xff09;&#xff0c;修改SQL语句&#xff0c;但是前端查询的结果没变化…(例如&#xff0c;在sql里加上 where …

LeetCode279之完全平方数(相关话题:动态规划,四平方和定理)

题目描述 给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。 示例 1: 输入:n = 12 输出:3 解释:12 = 4 + 4 +…

【Android构建篇】MakeFile语法

前言 对于一个看不懂Makefile构建文件规则的人来说&#xff0c;这个Makefile语法和shell语法是真不一样&#xff0c;但是又引用了部分shell语法&#xff0c;可以说是shell语法的子类&#xff0c;Makefile语法继承了它。 和shell语法不一样&#xff0c;这个更难一点&#xff0…

Vue3基本知识点

为什么要学vue3 1、Vue是国内 最火的前端框架 2、Vue3是2020年09月18日正式发布的 目前以支持Vue3的UI组件库 库名称简介ant-design-vuePC 端组件库&#xff1a;Ant Design 的 Vue 实现&#xff0c;开发和服务于企业级后台产品arco-design-vuePC 端组件库&#xff1a;字节跳…

DataX3同步Mysql数据库数据到Mysql数据库和DataX3同步mysql数据库数据到Starrocks数据库

DataX3同步Mysql数据库数据到Mysql数据库和DataX3同步mysql数据库数据到Starrocks 一、认识DataX二、DataX3概览三、DataX3框架设计四、DataX3插件体系五、DataX3核心架构六、DataX 3六大核心优势1.可靠的数据质量监控2.丰富的数据转换功能3.精准的速度控制4.强劲的同步性能5.健…

【AI面试】目标检测中one-stage、two-stage算法的内容和优缺点对比汇总

在深度学习领域中&#xff0c;图像分类&#xff0c;目标检测和目标分割是三个相对来说较为基础的任务了。再加上图像生成&#xff08;GAN&#xff0c;VAE&#xff0c;扩散模型&#xff09;&#xff0c;keypoints关键点检测等等&#xff0c;基本上涵盖了图像领域大部分场景了。 …

【解决办法】adobe photoshop :Assertion failed!

问题 PS启动时出现如下图错误&#xff08;实际行数可能不一样&#xff0c;program和file一样&#xff09;&#xff1a; ASSERTION FAILED Program…\node-vulcanjs\build\Release\VulcanMessagerLib.node File: C:\bid\workspace\CCX-Process\release…\vulcanadapter.cc Lin…

深度学习实战27-Pytorch框架+BERT实现中文文本的关系抽取

大家好,我是微学AI,今天给大家介绍一下深度学习实战27-Pytorch框架+BERT实现中文文本的关系抽取,关系抽取任务是一项重要的任务,其核心是从一段自然语言文本中抽取实体之间具有的关系。随着深度学习的发展,很多预训练模型在关系抽取任务上取得了显著的成果,其中BERT模型是…

Matlab实现多个窗口间的数据传递(不用GUIDE)

在用多个matlab的figure进行数据交互时&#xff0c;数据传入是较为简单的&#xff0c;可以直接用function的形参实现&#xff0c;但如何把数据传回&#xff0c;是个比较麻烦的问题。 在GUIDE下&#xff0c;系统自动生成了output_fcn函数&#xff0c;可以用它来实现从子窗口到主…

【P4】JMeter 原生录制方式——HTTP代理服务器

文章目录 一、准备工作二、原生录制方式——HTTP2.1、设计说明2.2、测试计划设计 三、原生录制方式——HTTPS3.1、设计说明3.2、测试计划设计 四、HTTP代理服务器主要参数说明4.1、目标控制器4.2、分组&#xff1a;在组间添加分割4.3、分组&#xff1a;每个组放入一个新的控制器…

2023年清华大学五道口金融学院招收公开招考博士研究生(普博)拟录取名单公示

公示期&#xff1a;十个工作日&#xff08; 2023年4月24日至5月9日 &#xff09; 经综合考核和研究生招生工作领导小组讨论&#xff0c;报学校研究生招生工作领导小组批准&#xff0c;清华大学五道口金融学院2023年公开招考博士研究生拟录取名单&#xff0c;现已确定&#xff…

Python 扩展教程(1): 调用百度AI

关于AI 自有计算机以来&#xff0c;人们就想让计算机具有人的感知、意识、概念、思维、行为&#xff0c;代替人的工作。AI (Artificial Interligence)是计算机科学的一个分支&#xff0c;专注研究、开发、模拟、扩展人的智能的理论、方法、技术及应用。 从研究领域和方法上&…

【Linux】6. 实现进度条和git基本认识和使用

编写小程序 – 进度条 1. 理解缓冲区概念 2. 理解\n 和 \r的区别 在操作系统层面&#xff1a;\n 表示换行 \r表示回车 在语言层面&#xff1a; \n就是回车换行 3. 进度条的需求分析 4. 代码编译 5. 代码优化 到这里进度条的编写也就完成了&#xff0c;✿✿ヽ(▽)ノ✿&#…

C语言基础应用(六)数组

引言 现程序要求&#xff0c;录入班里60名同学的所有成绩&#xff0c;我们应该怎么录入呢&#xff1f;按照我们之前所学习的难道要声明60个变量来录入成绩嘛&#xff1f; 就像&#xff1a; int main() {int a1,a2,a3,...,a60;scanf("%d%d%d...%d",&a1,&a2,…