0


Tomcat架构设计及组件详解

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

目录


一、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实例化管理器等组件。
标签: tomcat servlet xml

本文转载自: https://blog.csdn.net/imwucx/article/details/132892329
版权归原作者 小贤java 所有, 如有侵权,请联系我们删除。

“Tomcat架构设计及组件详解”的评论:

还没有评论