Tomcat架构设计及组件详解

2023-09-15 00:48:43

Tomcat配置详解(Tomcat配置server.xml详解)Tomcat配置详解(Tomcat配置server.xml详解)_tomcat xml配置https://blog.csdn.net/imwucx/article/details/132166738文章之后,深入的学习tomcat相关知识,对Tomcat的组件进进补充和记录。

目录

一、Tomcat整体架构图

二、Tomcat整体树形结构

三、组件说明

四、配置文件

五、源码结构

5.1 java 目录的子目录

5.2 jakarta

5.3 org.apache


一、Tomcat整体架构图

55f5edfbfa05468a91232a727f3cbc26.png

二、Tomcat整体树形结构

1cd06a70b8964f92a0f0c85f0f0fdd27.png

如上图所示,为何是这样的组合?

  • Tomcat需要一个对象来代表整个Servlet容器,引入了Server组件。
  • Tomcat需要一个组件来包含一个或者多个连接器,引入了Service组件。
  • Tomcat需要一个用于接收客户端并处理协议相关的功能,引入了Connector连接器。
  • Tomcat需要一个用于实现HTTP中指定服务主机的功能,引入了Host组件。
  • Tomcat需要一个用于表示Web应用的功能,引入了Context。
  • Tomcat需要一个用于表示Servlet的功能,引入了Wrapper。

三、组件说明

  1. Server组件: 代表整个Tomcat Servlet容器,一个Server可以包含一个或者多个Service,包括一组全局的命名资源,即naming resource。
  2. Listener组件:也称LifecycleListener,用于监听组件在整个生命周期过程中产生的事件,从而完成响应相应的动作。
  3. Global Naming Resources:包含公用的全局命名资源。
  4. Service组件:用于管理连接器和引擎,其中包含了一个或者多个连接器和一个引擎组件。
  5. Connector组件:包含协议处理器,用于实现Tomcat中定义的Coyote连接器,HTTP协议也是在连接器这一层实现的。
  6. 线程池:Connector中包含的线程池为Tomcat的业务线程池,通过这个线程池可以将耗时的操作放到线程池中执行,连接器只需要处理连接、读写数据即可,极大地增强了Tomcat的性能。 
  7. Engine组件:是一个容器,表示整个Tomcat的Servlet容器的引擎,其中包含一组Host组件。可以从上图中看到它是包含的容器的最顶层容器。
  8. Value组件:一般为多个,它们之间形成一个链表一起处理组件内部的动作。通常将一系列的Value组件放进Pipeline(流水线)组件中,让它们组成一条Value流水线,处理当前传入包含组件的请求。
  9. Cluster组件:表示当前多个Tomcat服务器组成了一个集群,集群之间可以互相传输共享信息。如,可以使用Cluster组件实现Session共享,不过这种方式效率较低,一般不建议使用这种方式。通常使用Redis共享会话信息。
  10. Realm组件:表示一个只读的安全域门面,通常使用Realm验证不同的用户,并且授予这些用户相应的访问规则。Realm组件通常和容器等级的组件联合使用。
  11. Host组件:表示一个包含在Engine组件听虚拟主机容器。内部包含一个或者多个Context容器,可以通过Host组件隔离不同的Context,将它们放到不同的虚拟主机中。
  12. Context组件:表示一个Servlet上下文,通常包含在Host容器中,顶层容器必须是引擎组件。Context组件代表Web应用程序。
  13. Filter组件:属于J2EE定义表示一个请求的过滤器,也称为拦截器链,当请求在访问到最终的Servlet组件前,必须经过所有的拦截器链才能访问。
  14. Manager组件:用于管理与Context组件绑定的Session池,不同的Manager组件可以自定义添加自己的处理Pipeline(由Value组件组成)将Session进行持久化。
  15. Resource Like组件:代表了一个Web应用程序的资源链表,即在配置文件中定义的Resource标签的信息。这些资源链访问Global Naming Resources中的资源。
  16. Resource组件:代表一个命名资源对象。
  17. Loader组件:代表了一个Java类加载器,用于在容器中加载必要的类文件,通常用于热部署时应用上下文类文件。

四、配置文件

// 配置服务器,关闭服务器的端口号为8005
<Server port="8005" shutdown="SHUTDOWN">
    // 配置版本日志监听器
    <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
    // 配置Apr本地库加载监听器
    <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
    // 配置Jre内存泄漏监听器
    <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
    // 配置全局资源JNDI与JMX监听器
    <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
    // 配置预防ThreadLocal发生内存泄漏监听器
    <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
    <GlobalNamingResource >
        // 配置用户数据库资源,默认为内存数据库,用于保存访问Tomcat的管理页的用户密码
        <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml"/>
    </GlobalNamingResource>
    
    // 定义服务对象
    <Service name="Catalina">
        // 定义HTTP连接器,指定端口,协议,连接超时时间和重定向端口
        <Connector port="8080" protocol="HTTP/1.1" connectionTimout="20000" redirectPort="8443"/>
        // 定义引擎对象,并指定默认的虚拟主机为localhost
        <Engine name="Catalina" defaultHOst="localhost">
            // 定义锁定对象的Realm,当用户尝试登录次数太多后,将会锁定用户
            <Realm className="org.apache.catalina.realm.LockOutRealm">
                // 定义组合在LockOutRealm内部的,使用JNDI定义的用户数据库对用户进行较难的Realm对象
                <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDataBase" />
            </Realm>
            // 宝义虚拟主机对象,并指定名称,Web上下文目录,是否自动解压war包,是否自动部署
            <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
                <Valve className="org.apache.catalina.values.AccessLogValue" directory="logs" prefix="local_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" />/>
            </Host>
        </Engine>
    </Service>
</Server>
  • Server: 服务器对象
  • Service: 服务对象
  • Global Naming Resources: 全局命名资源
  • Connector: HTTP连接器
  • Engine: 引擎对象
  • Realm: 用户身份信息校验
  • Host: 虚拟主机
  • Valve: 阀门

五、源码结构

1. /bin目录

        存放启动、关闭Tomcat和其它脚本文件。.sh结尾的文件为UNIX系统使用,.bat结尾的文件为Windows系统使用。

2. /conf目录

        存放Tomcat配置文件和相关DTD定义,其中最重要的文件是server.xml,它是tomcat容器和组件的主要配置文件。

3. /logs目录

        存放Tomcat运行时产生的日志文件,是默认的日志文件日录。

4. /webapps目录

        存放Web应用,Tomcat会自带几个默认项目存放在该目录中。

5. /res目录

        存放Tomcat的资源文件,如icon图标,欢迎页HTML文件。

6. /modules目录

        存放Tomcat依赖的模块组件源码。

7. /java目录

        存放Tomcat的主要源码文件,即主要研究对象。

5.1 java 目录的子目录

详细介绍如下:

bc6146c1da6d47e88961b93ffebef4ba.png

5.2 jakarta

该目录存放jakarta扩展的接口表述,即J2EE的接口文件。(如上图)

旧版的包名不是java.jakarta,为什么取包名为java.jakarta?原因是Oracle公司收购sun公司之后,Oracle将Java EE 移交给了 Eclipse 基金会,但不允许使用Java这个前缀,Eclipse基金会强烈争取不改名,没谈拢,最后将Java EE改名为Jakarta EE。

5.3 org.apache

用于存放Tomcat的源代码,其中每个目录的存放内容如下。(如上图)

  • catalina:该目录存放Tomcat的核心文件,包括容器、组件。
  • coyote:该目录存放协议相关的内容,如HTTP1.1、HTTP1.2、AJP待协议处理器。
  • el:该目录用于存放el表达式解析的相关内容。
  • jasper:该目录存放JSP引擎的相关内容。
  • juli:该目录存放JULI日志框架的源码。
  • naming:该目录存放JDNI的相关内容。
  • tomcat:该目录存放tomcat工具类,如jar包扫描组件、DBCP连接池源码、InstanceManager实例化管理器等组件。

更多推荐

webpack打包速度优化

优化WebPack打包速度在开发过程中,WebPack的打包速度是一个非常重要的考虑因素。随着项目规模的增长,打包时间也会越来越长,影响开发效率和用户体验。本文将循序渐进地介绍一些优化WebPack打包速度的方法,先分析打包瓶颈,然后逐步优化。分析打包瓶颈在开始优化之前,我们需要了解当前项目的打包瓶颈在哪里。为了帮助我

Java集成支付宝沙箱支付,详细教程(SpringBoot完整版)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、开发前准备?二、使用步骤1、引入库2、配置在application.yml里面进行配置:3、alipay的java配置:AplipayConfig.java4、支付接口4、回调接口一、开发前准备?easy支付官方文档:https://opend

Ubuntu下 Docker、Docker Compose 的安装教程

Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。DockerCompose是用于定义和运行多容器docker应用程序的工具,compose通过一个配置文件来管理多个do

微信小程序python+nodejs+php+springboot+vue 健身教练私教预约系统

管理员的主要功能有:1.管理员输入账户登陆后台2.个人中心:管理员修改密码和账户信息3.用户管理:对注册的用户信息进行删除,查询4.教练管理:对教练信息进行添加,修改,删除,查询5.教练简介管理:对教练的简介信息进行查询,删除6.在线预约信息:用户对教练的预约信息进行查询,删除7.健身指南管理:对用户查看的健身指南信息

Nginx之防盗链及高可用解读

目录防盗链解读盗链是什么?Nginx中配置防盗链高可用解读KeepalivedNginx中配置高可用防盗链解读盗链是什么?网页的加载顺序是先加载HTML相关的内容,然后解析HTML的内容,那些需要加载图片,那些需要加载文件,是逐步加载的,对于我们线上的图片等静态资源,经常会被其他网站盗用,外面可以我们请求到一个页面后,

LeetCode:2603. 收集树中金币 详解(2023.9.21 C++)

目录2603.收集树中金币题目描述:实现代码与解析:拓扑+bfs原理思路:2603.收集树中金币题目描述:给你一个n个节点的无向无根树,节点编号从0到n-1。给你整数n和一个长度为n-1的二维整数数组edges,其中edges[i]=[ai,bi]表示树中节点ai和bi之间有一条边。再给你一个长度为n的数组coins,

SpringBoot

SpringBoot技术简介SpringBoot是一种用于构建现代化、可扩展的Java应用程序的框架,它的出现极大地简化了Java应用程序的开发流程。本文将介绍SpringBoot的关键特性以及为什么它成为Java开发者的首选工具。什么是SpringBoot?SpringBoot是SpringFramework的一个扩

Spring系列文章:Bean的作⽤域

1、singleton默认情况下,Spring的IoC容器创建的Bean对象是单例的<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.

Linux内核顶层Makefile前期工作分析二

一.Linux内核顶层Makefile前期工作本文继续分析Linux内核源码的顶层Makefile所做的准备工作。本文续上一篇文章,地址如下:Linux内核顶层Makefile前期工作分析一_凌肖战的博客-CSDN博客二.内核顶层Makefile前期工作7.模块编译Linux允许单独编译某个模块,使用命令“makeM=

【C++】STL简介 | string类的常用接口

目录STL简介学string类前的铺垫概念为什么要学string类string类的底层(了解)编码表的故事string类的常用接口与应用3个必掌握的构造赋值访问字符operator[]初识迭代器(iterator)反向迭代器用范围for遍历string类对象的修改操作插字符push_back()插字符串append()

【NCRE 二级Java语言程序设计03】考试环境及考试过程概览

目录前言一、考试环境介绍1.硬件环境2.软件环境二、考试特别说明1.考试时间说明2.考试题型及分值三、考试流程介绍1.登录考试系统2.考试答题界面3.答题交卷操作总结前言📜本专栏主要是分享自己备考全国计算机二级Java语言程序设计所学心得体会、所搜集的资料信息。虽然有Java语言相关基础,但是Java桌面编程、App

热文推荐