Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >tomcat整体架构

tomcat整体架构

作者头像
东营浪人
发布于 2019-09-05 10:06:19
发布于 2019-09-05 10:06:19
66600
代码可运行
举报
文章被收录于专栏:浪人聊编程浪人聊编程
运行总次数:0
代码可运行

一 tomcat顶层架构

  • Server:服务器的意思,代表整个tomcat服务器,一个tomcat只有一个Server;
  • Service:Server中的一个逻辑功能层, 一个Server可以包含多个Service;
  • Connector:称作连接器,是Service的核心组件之一,一个Service可以有多个Connector,主要是连接客户端请求;
  • Container:Service的另一个核心组件,按照层级有Engine,Host,Context,Wrapper四种,一个Service只有一个Engine,其主要作用是执行业务逻辑;
  • Jasper:JSP引擎;
  • Session:会话管理;

上面简单列了tomcat的模块结构,下面结合配置文件更加具体一点来分析,当然更多是集中在Connector和Container两个组件上,毕竟这是两个核心组件,后续的内容也会更多集中在这两个组件上面

先将conf/server.xml配置文件内容贴出供参考(注释部分没有贴出):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>

 --><Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener"/>
  <!-- Security listener. Documentation at /docs/config/listeners.html
  <Listener className="org.apache.catalina.security.SecurityListener" />
  -->
  <!--APR library loader. Documentation at /docs/apr.html -->
  <Listener SSLEngine="on" className="org.apache.catalina.core.AprLifecycleListener"/>
  <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
  <Listener className="org.apache.catalina.core.JasperListener"/>
  <!-- Prevent memory leaks due to use of particular java/javax APIs-->
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>

  <!-- Global JNDI resources
       Documentation at /docs/jndi-resources-howto.html
  -->
  <GlobalNamingResources>
    <!-- Editable user database that can also be used by
         UserDatabaseRealm to authenticate users
    -->
    <Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/>
  </GlobalNamingResources>


  <Service name="Catalina">

    <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="utf-8"/>
   

    <!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>




    <!-- You should set jvmRoute to support load-balancing via AJP ie :
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
    -->
    <Engine defaultHost="localhost" name="Catalina">

      <Realm className="org.apache.catalina.realm.LockOutRealm">

        <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
      </Realm>

      <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">

        <!-- SingleSignOn valve, share authentication between web applications
             Documentation at: /docs/config/valve.html -->
        <!--
        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
        -->

        <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t &quot;%r&quot; %s %b" prefix="localhost_access_log." suffix=".txt"/>
<Context docBase="my-web" path="/my-web" reloadable="true" source="org.eclipse.jst.jee.server:my-web"/></Host>
    </Engine>
  </Service>
</Server>

二 server

Server是Tomcat最顶层的容器,代表着整个服务器,即一个Tomcat只有一个Server,Server中包含至少一个Service组件,用于提供具体服务。这个在配置文件中也得到很好的体现(port=“8005” shutdown="SHUTDOWN"是在8005端口监听到"SHUTDOWN"命令,服务器就会停止)。

Tomcat中其标准实现是:org.apache.catalina.core.StandardServer类,其继承结构类图如下:

StandardServer实现Server很好理解,tomcat为所有的组件都提供了生命周期管理,继承LifecycleMBeanBase则跟tomcat中的生命周期机制有关,后续文章会有介绍。

三 service

可以想象,一个Server服务器,它最基本的功能肯定是:

接收客户端的请求,然后解析请求,完成相应的业务逻辑,然后把处理后的结果返回给客户端,一般会提供两个节本方法,一个start打开服务Socket连接,监听服务端口,一个stop停止服务释放网络资源。

这时的服务器就是一个Server类:

如何实现这个简单的服务器,看过《深入剖析tomcat》的应都知道,这部分代码之前也敲过,在github上(https://github.com/w1992wishes/tomcat-work),其实就是在一个端口上监听Socket请求,然后解析请求,返回处理结果。

但如果将请求监听和请求处理放在一起,扩展性会变差,毕竟网络协议不止HTTP一种,如果想适配多种网络协议,请求处理又相同,这时就无能为力了,tomcat的设计大师不会采取这种做法,而是将请求监听和请求处理分开为两个模块,分别是Connector和Container,Connector负责处理请求监听,Container负责处理请求处理。

但显然tomcat可以有多个Connector,同时Container也可以有多个。那这就存在一个问题,哪个Connector对应哪个Container,提供复杂的映射吗?相信看过server.xml文件的人已经知道了tomcat是怎么处理的了。

没错,Service就是这样来的。在conf/server.xml文件中,可以看到Service组件包含了Connector组件和Engine组件(前面有提过,Engine就是一种容器),即Service相当于Connector和Engine组件的包装器,将一个或者多个Connector和一个Engine建立关联关系。在默认的配置文件中,定义了一个叫Catalina 的服务,它将HTTP/1.1和AJP/1.3这两个Connector与一个名为Catalina 的Engine关联起来。

一个Server可以包含多个Service(它们相互独立,只是公用一个JVM及类库),一个Service负责维护多个Connector和一个Container。

其标准实现是StandardService,UML类图如下:

这时tomcat就是这样了:

四 connector

前面介绍过Connector是连接器,用于接受请求并将请求封装成Request和Response,然后交给Container进行处理,Container处理完之后在交给Connector返回给客户端。

一个Connector会监听一个独立的端口来处理来自客户端的请求。server.xml默认配置了两个Connector:

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/>,它监听端口8080,这个端口值可以修改,connectionTimeout定义了连接超时时间,单位是毫秒,redirectPort 定义了ssl的重定向接口,根据上述配置,Connector会将ssl请求转发到8443端口。 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />, AJP表示Apache Jserv Protocol,它将处理Tomcat和Apache http服务器之间的交互,此连接器用于处理我们将Tomcat和Apache http服务器结合使用的情况,如在同一台物理Server上部署一个Apache http服务器和多台Tomcat服务器,通过Apache服务器来处理静态资源以及负载均衡时,针对不同的Tomcat实例需要AJP监听不同的端口。

Connector在tomcat中的设计比较复杂,先大致列上一个图:

这里先简单介绍Connector,后续会详细分析。

Connector使用ProtocolHandler来处理请求的,不同的ProtocolHandler代表不同的连接类型,比如:Http11Protocol使用的是普通Socket来连接的(tomcat9已经删除了这个类,不再采用BIO的方式),Http11NioProtocol使用的是NioSocket来连接的。

其中ProtocolHandler由包含了三个部件:Endpoint、Processor、Adapter。

Endpoint用来处理底层Socket的网络连接,Processor用于将Endpoint接收到的Socket封装成Request(这个Request和ServletRequest无关),Adapter充当适配器,用于将Request转换为ServletRequest交给Container进行具体的处理。 Endpoint由于是处理底层的Socket网络连接,因此Endpoint是用来实现TCP/IP协议的,而Processor用来实现HTTP协议的,Adapter将请求适配到Servlet容器进行具体的处理。 Endpoint的抽象实现AbstractEndpoint里面定义的Acceptor和AsyncTimeout两个内部类和一个Handler接口。Acceptor用于监听请求,AsyncTimeout用于检查异步Request的超时,Handler用于处理接收到的Socket,在内部调用Processor进行处理。

先不用太纠结,了解Connector是做什么的就可以,后续再深入。

五 container

tomcat的container层次如下:

5.1、Engine

一个Service中有多个Connector和一个Engine,Engine表示整个Servlet引擎,一个Engine下面可以包含一个或者多个Host,即一个Tomcat实例可以配置多个虚拟主机,默认的情况下 conf/server.xml 配置文件中<Engine name="Catalina" defaultHost="localhost"> 定义了一个名为Catalina的Engine。

ContainerBase和LifecycleBase都是抽象出来的公共层。

5.2、Host

Host,代表一个站点,也可以叫虚拟主机,一个Host可以配置多个Context,在server.xml文件中的默认配置为<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">, 其中appBase=webapps, 也就是<CATALINA_HOME>\webapps目录,unpackingWARS=true 属性指定在appBase指定的目录中的war包都自动的解压,autoDeploy=true 属性指定对加入到appBase目录的war包进行自动的部署。

一个Engine包含多个Host的设计,使得一个服务器实例可以承担多个域名的服务,是很灵活的设计。

其标准实现继承图如下:

5.3、Context

Context,代表一个应用程序,就是日常开发中的web程序,或者一个WEB-INF目录以及下面的web.xml文件,换句话说每一个运行的webapp最终都是以Context的形式存在,每个Context都有一个根路径和请求路径;与Host的区别是Context代表一个应用,如,默认配置下webapps下的每个目录都是一个应用,其中ROOT目录中存放主应用,其他目录存放别的子应用,而整个webapps是一个站点。

在Tomcat中通常采用如下方式创建一个Context:

在<CATALINA_HOME>\webapps 目录中创建一个目录dirname,此时将自动创建一个context,默认context的访问url为http://host:port/dirname,也可以通过在ContextRoot\META-INF 中创建一个context.xml文件,其中包含如下内容来指定应用的访问路径: 在server.xml文件中增加context 元素,如下:<Context path="/urlpath" docBase="/test/xxx" reloadable=true />

这样就可以通过http://host:port/urlpath访问上面配置的应用。

可以打开tomcat目录对照一下:

其标准实现类图如下:

5.4、Wrapper

一个Context可以包含多个Servlet处理不同请求,当然现在的SpringMVC,struts框架的出现导致程序中不再是大量的Servlet,但其实本质是没变的,都是由Servlet来处理或者当作入口。

在tomcat中Servlet被称为wrapper,其标准类图如下:

那么为什么要用Wrapper来表示Servlet?这和tomcat的处理机制有关,为了更加灵活,便于扩展,tomcat是用管道(pipeline)和阀(valve)的形式来处理请求,所以将Servlet丢给Wrapper。这个后续再分析。

那么现在tomcat就是这样的:

六、Tomncat启动流程

tomcat的启动流程很标准化,入口是BootStrap,统一按照生命周期管理接口Lifecycle的定义进行启动。首先,调用init()方法逐级初始化,接着调用start()方法进行启动,同时,每次调用伴随着生命周期状态变更事件的触发。

每一级组件除完成自身的处理外,还有负责调用子组件的相关调用,组件和组件之间是松耦合的,可以通过配置进行修改。

大致流程图如下:

七、总结

差不多就是这样,大概了解总体的结构,当然这里面没有过多提及除Connector和Container外的其他结构,如果感兴趣,可以自行学习。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Tomcat卷四----Tomcat 服务器配置
Tomcat 服务器的配置主要集中于 tomcat/conf 下的 catalina.policy、 catalina.properties、context.xml、server.xml、tomcat-users.xml、web.xml 文件。
大忽悠爱学习
2022/05/09
2.2K0
Tomcat卷四----Tomcat 服务器配置
Java面试——Tomcat
Tomcat 中最顶层的容器是 Server,代表着整个服务器,从上图中可以看出,一个 Server可以包含至少一个 Service,用于具体提供服务。Service 主要包含两个部分:Connector 和 Container。从上图中可以看出 Tomcat 的心脏就是这两个组件,他们的作用如下: 【1】Connector 用于处理连接相关的事情,并提供 Socket 与 Request 和 Response相关的转化; 【2】Container 用于封装和管理 Servlet,以及具体处理 Request请求;
Java架构师必看
2021/04/26
9380
详解Tomcat 配置文件server.xml
一、一个server.xml配置实例 server.xml位于$TOMCAT_HOME/conf目录下;下面是一个server.xml实例。后文中将结合该实例讲解server.xml中,各个元素的含义和作用;在阅读后续章节过程中,可以对照该xml文档便于理解。 <Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
Tanyboye
2018/07/02
1.9K0
走进JavaWeb技术世界5:初探Tomcat的HTTP请求过程
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
Java技术江湖
2019/10/21
7600
Tomcat架构解析之1 架构简介1 核心架构模块说明2 分层建模3 作用域
Tomcat除了能够支撑通常的web app外,其本身高度模块化的架构体系,也能带来最大限度的可扩展性。 目前tomcat版本已经衍生到tomcat9,但是主流的版本还是tomcat6。此系列架构体系介绍还是以tomcat6为蓝本。 Tomcat是有一系列逻辑模块组织而成,这些模块主要包括: 核心架构模块,例如Server,Service,engine,host和context及wrapper等 网络接口模块connector log模块 session管理模块 jasper模块 naming模块 JM
JavaEdge
2018/05/16
1.2K0
tomcat 配置虚拟主使用nginx 代理无法访问
同事公司要求,在一台服务器上的一个tomcat 实例下部署多个虚拟主机,然后在前端使用NG 反向代理,结果出现,使用两个域名去访问,都是将请求转发到默认的第一个虚拟主机上: 同事的配置为: [[ema
老七Linux
2018/05/31
9940
Tomcat入门安装及介绍
Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache,Sun和其他一些公司及个人共同开发而成 Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选. Tomcat和Nginx,Apache(httpd),lighttpd等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Server和JSP容器,独立的Server容器是Tomcat的默认模式,.不过,Tomcat处理静态HTML的能力不如Nginx/Apache服务器. 其他JAVA容器还有resin,weblogic等
王先森sec
2023/04/24
4170
Tomcat入门安装及介绍
Linux下Tomcat使用详解
版权声明:本文为木偶人shaon原创文章,转载请注明原文地址,非常感谢。 https://blog.csdn.net/wh211212/article/details/53198350
shaonbean
2019/05/26
2.1K0
腾讯云服务器上tomcat配置文件参数详解
<Connector port="8080" protocol="HTTP/1.1"
用户8639654
2021/08/04
6.3K0
Tomcat 配置支持不同的域名访问各自不同程序的配置方法
在tomcat 目录下面增加个文件夹 appBase="webapps"  appBase="webapps2"
FHAdmin
2022/03/18
1.7K0
windows服务器使用Tomcat发布Springboot的war包项目
(1)Tomcat 8.x 下载地址:https://tomcat.apache.org/download-80.cgi
Mr.Vv
2022/05/11
1.6K0
windows服务器使用Tomcat发布Springboot的war包项目
Tomcat环境部署
环境说明 系统版本:CentOS 7.2 x86_64 软件版本:jdk-8u171、tomcat-8.0.27 Jdk的下载地址 Tomcat的下载地址
仙人技术
2020/04/29
7250
Springboot部署war项目文件到Tomcat静态文件(css、js和图片等)加载不出来的解决方法
(2)/elec/WEB-INF/classes/static/:项目实际war包解决后,静态文件地址
Mr.Vv
2022/05/11
2.7K0
Springboot部署war项目文件到Tomcat静态文件(css、js和图片等)加载不出来的解决方法
Tomcat 配置局域网内的Https
Tomcat 配置局域网内的Https 1、生成证书 可以使用jdk自带的keytool生成证书 keytool -genkeypair -alias "tomcat" -keyalg "RSA"
季鸟猴
2022/11/14
1.2K0
Tomcat 配置局域网内的Https
框架源码私享笔记(01)Tomcat核心架构功能 | 配置详解
Tomcat是Apache基金会基于Java开发开源的web容器。Tomcat应用服务器,又称“汤姆猫”,它开源、轻量、易于集成、社区背书支持的特性,深受Java开发者偏爱。尤其是Tomcat专注于处理servlet和jsp的出色能力深得研发者信赖(当然目前jsp用的企业已经很少,瓶颈在于互联网高并发时代背景下,jsp的响应和吞吐量很难满足需求)。
拉丁解牛说技术
2025/03/03
2802
框架源码私享笔记(01)Tomcat核心架构功能 | 配置详解
Tomcat配置通过域名直接访问项目首页的完整步骤
我们以tomcat为例通过输入域名直接访问项目首页的配置方法。我的域名为:www.nnjskz.cn,也欢迎大家访问。
Jensen_97
2023/07/20
2.4K0
面试官:tomcat是如何处理http请求的?
因为tomcat实现了Servlet规范,所以我们得掌握什么是Servlet?什么是Servlet规范? 什么是Servlet呢? Servlet是JavaEE规范的一种,主要是为了扩展Java作为W
田维常
2021/01/28
9380
Tomcat搭建文件服务器
①. 进入tomcat下的conf目录,找到server.xml文件,在Host标签下加入如下标签     path:表示对外映射的路径,     docBase:物理磁盘路径,可以是绝对路径,也可以是相对路径,甚至是共享磁盘目录     debug参数不用管     reloadable表示是否重新加载 <Context path="/files" docBase="D://files" debug="0" reloadable="true"/> 访问http://localhost/files/a.t
用户1215919
2018/02/27
3.3K0
Tomcat最佳优化方案总结 原
1. BIO由于每个请求都要创建一个线程来处理,线程开销比较大,不能再高并发的场景,性能也是最低的。 2. NIO是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,比传统的bio更好的并发性能。 3. APR(Apache Portable Run-time libraries)简单理解,就是从操作系统级别解决异步IO问题,大幅度的提高服务器的处理和响应性能, 也是Tomcat运行高并发应用的首选模式。 
wuweixiang
2018/08/14
3.5K0
Tomcat最佳优化方案总结
                                                                            原
Tomcat企业级应用
简介 Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服
用户1173509
2018/03/28
2.2K0
Tomcat企业级应用
推荐阅读
相关推荐
Tomcat卷四----Tomcat 服务器配置
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验