tomcat核心组件及原理概述

目录

[1. tomcat概述](#1. tomcat概述)

[1.1 概念](#1.1 概念)

[1.2 官网地址](#1.2 官网地址)

[2. 基本使用](#2. 基本使用)

2.1下载

[3. 整体架构](#3. 整体架构)

[3.1 核心组件](#3.1 核心组件)

[3.2 从web.xml配置和模块对应角度](#3.2 从web.xml配置和模块对应角度)

[3.3 如何处理请求](#3.3 如何处理请求)

[4. 配置JVM参数](#4. 配置JVM参数)

[5. 附录](#5. 附录)


1. tomcat概述

1.1 概念

什么是tomcat

Tomcat是一个开源、免费、轻量级的Web服务器。

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为比较流行的Web 应用服务器。

什么是Web服务器

Web服务器是安装在服务端的一款软件,它对HTTP协议的操作进行了封装使得程序员不必直接对协议进行相关操作,让Web开发变得更加便捷。Web服务器的主要功能就是提供网上信息浏览服务,当我们将自己写的Web项目部署道Web服务器上,只要启动Web服务器,就能直接通过浏览器访问我们的Web项目了。

目前比较有名的Web服务器有:Apache、Nginx、ISS。

拓展

  • Tomcat和Apache的联系:Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行
  • Tomcat仅支持JDBC、JSP、Servlet等少量JavaEE规范1
  • 因为Tomcat支持Servlet/JSP规范,所以Tomcat也被称为Web容器、Servlet容器。Servlet需要依赖Tomcat才能运行。
  • Web服务器、服务端、服务器的区别和联系
    • 服务器是一种特殊的计算机,它比普通计算机运行更快、负载更高、价格更贵,属于硬件范畴;
    • 服务端是是指为客户端提供服务的计算机,服务的内容诸如:提供数据的保存、数据的访问......属于硬件范畴;
    • Web服务器是指安装再服务端的一款软件,主要功能是提供网上信息浏览服务,但是只能响应HTTP的请求数据,属于软件范畴。
  • 能让你写的网站被所有人访问的三要素:服务器+域名+网站

1.2 官网地址

Apache Tomcat® - Welcome!

文件目录

|---------|----------------------------|-------------------------------------------------------------------|
| 目录 | 文件 | 说明 |
| bin | / | 可执行文件目录 |
| | startup.bat , startup.sh | 存放Tomcat的启动、停止等批处理脚本文件 启动: startup.bat ./startup.sh |
| | shutdown.bat , shutdown.sh | 用于在windows和linux下的停止脚本 终止: shutdown.bat ./shutdown.sh |
| conf | / | 用于存放Tomcat的相关配置文件 |
| | Catalina | 用于存储针对每个虚拟机的Context配置 |
| | context.xml | 用于定义所有web应用均需加载的Context配 置,如果web应用指定了自己的context.xml ,该文件将被覆盖 |
| | catalina.properties | Tomcat 的环境变量配置 |
| | catalina.policy | Tomcat 运行的安全策略配置 |
| | logging.properties | Tomcat 的日志配置文件, 可以通过该文件修 改Tomcat 的日志级别及日志路径等 |
| | server.xml | Tomcat 服务器的核心配置文件 |
| | tomcat-users.xml | 定义Tomcat默认的用户及角色映射信息配置 |
| | web.xml | Tomcat 中所有应用默认的部署描述文件, 主 要定义了基础Servlet和MIME映射。 |
| lib | / | Tomcat 服务器的依赖包 |
| logs | / | Tomcat 默认的日志存放目录 |
| webapps | / | Tomcat 默认的Web应用部署目录 |
| work | / | Web 应用JSP代码生成和编译的临时 |

2. 基本使用

2.1下载

Apache Tomcat® - Welcome!

关于zip、tar.gz详解

tomcat下载以及各个版本(zip,tar.gz,32-bit Windows zip,64-bit Windows zip,32-bit/64-bit Windows Service Instal_tomcat的tar.gz与zip-CSDN博客

3. 整体架构

3.1 核心组件

Catalina的各个组件的作用如下:

  • Server: 表示服务器,它提供了一种优雅的方式来启动和停止整个系统,不必单独启停连接器和容器;它是Tomcat构成的顶级构成元素,所有一切均包含在Server中;

  • Service: 表示服务,Server可以运行多个服务。比如一个Tomcat里面可运行订单服务、支付服务、用户服务等等;Server的实现类StandardServer可以包含一个到多个Services, Service的实现类为StandardService调用了容器(Container)接口,其实是调用了Servlet Engine(引擎),而且StandardService类中也指明了该Service归属的Server;

  • Connector : 表示连接器, 它将Service和Container连接起来,首先它需要注册到一个Service,它的作用就是把来自客户端的请求转发到Container(容器),这就是它为什么称作连接器, 它支持的协议如下:

    • 支持AJP协议
    • 支持Http协议
    • 支持Https协议
  • Service内部还有各种支撑组件,下面简单罗列一下这些组件

    • Manager -- 管理器,用于管理会话Session
    • Logger -- 日志器,用于管理日志
    • Loader -- 加载器,和类加载有关,只会开放给Context所使用
    • Pipeline -- 管道组件,配合Valve实现过滤器功能
    • Valve -- 阀门组件,配合Pipeline实现过滤器功能
    • Realm -- 认证授权组件
  • Container: 表示容器,可以看做Servlet容器;引擎(Engine)、主机(Host)、上下文(Context)和Wraper均继承自Container接口,所以它们都是容器。

    • Engine -- 表示整个Catalina的Servlet引擎,用来管理多个虚拟站点,一个Service最多只能有一个Engine,但是一个引擎可包含多个Host。
    • Host -- 代表一个虚拟主机或者说一个站点,可以给Tomcat配置多个虚拟主机地址,而一个虚拟主机下可包含多个Context。
    • Context -- 表示一个Web应用程序, 一个Web应用可包含多个Wrapper。
    • Wrapper -- 表示一个Servlet,Wrapper 作为容器中的最底层,不能包含子容器。

3.2 从web.xml配置和模块对应角度

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
 
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
 
  <GlobalNamingResources>
    <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" />
  </GlobalNamingResources>
 
  <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">
 
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>
 
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
 
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
 
      </Host>
    </Engine>
  </Service>
</Server>

3.3 如何处理请求

启动流程

启动流程主要分为两块内容:

1)初始化:解析Server.xml文件,生成Server等实例,并对Connector和Container等进行初始化操作。

2)启动:调用start()方法启动Connector和Container等。其中Container部分,context启动的时候会解析web.xml,并触发contextConfig这个监听器,从而创建wrapper容器,初始化Servlet实例,如果该Servlet标识了loadOnStartup那么在start()过程中将会调用其init()方法进行Servlet初始化。

从tomcat的启动流程图,我们可以看到它和我们日常编写webapp应用接入点就在于创建Servlet的容器,所以我们的业务代码就是基于Servlet编写,使用tomcat则无需关心Servlet如何对外提供服务,简化了开发流程。

通过一个完整的HTTP请求,我们还需要把它贯穿起来

假设来自客户的请求为:http://localhost:8080/test/index.jsp 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector,然后

  • Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应
  • Engine获得请求localhost:8080/test/index.jsp,匹配它所有虚拟主机Host
  • Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机)
  • localhost Host获得请求/test/index.jsp,匹配它所拥有的所有Context
  • Host匹配到路径为/test的Context(如果匹配不到就把该请求交给路径名为""的Context去处理)
  • path="/test"的Context获得请求/index.jsp,在它的mapping table中寻找对应的servlet
  • Context匹配到URL PATTERN为*.jsp的servlet,对应于JspServlet类,构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法
  • Context把执行完了之后的HttpServletResponse对象返回给Host
  • Host把HttpServletResponse对象返回给Engine
  • Engine把HttpServletResponse对象返回给Connector
  • Connector把HttpServletResponse对象返回给客户browser

处理请求流程

4. 配置JVM参数

方法一 直接修改catalina文件

打开 catalina.sh 文件

vim $CATALINA_HOME/bin/catalina.sh

找到或添加 JAVA_OPTS 变量设置

在 cygwin=false 之前添加以下内容

JAVA_OPTS="$JAVA_OPTS -Xms512m -Xmx1024m -XX:+UseG1GC"

保存并关闭文件

重启 Tomcat

$CATALINA_HOME/bin/shutdown.sh

$CATALINA_HOME/bin/startup.sh

方法二 使用CATALINA_OPTS环境变量

在Tomcat的启动脚本中,你可以通过设置CATALINA_OPTS环境变量来添加JVM参数。

对于Linux/Unix:

  1. 使用CATALINA_OPTS环境变量

在Tomcat的启动脚本中,可以通过设置CATALINA_OPTS环境变量来添加JVM参数。

找到Tomcat安装目录下的bin目录。

打开setenv.sh文件(如果不存在,可以自己创建一个)

在文件中添加或修改CATALINA_OPTS变量,例如:

XML 复制代码
export CATALINA_OPTS="-Xms512M -Xmx1024M -XX:MaxPermSize=256m"

保存文件并重新启动Tomcat。

对于Windows:

找到Tomcat安装目录下的bin目录。

打开setenv.bat文件(如果不存在,你可以自己创建一个)。

在文件中添加或修改CATALINA_OPTS变量,例如:

XML 复制代码
set CATALINA_OPTS=-Xms512M -Xmx1024M -XX:MaxPermSize=256m

保存文件并重新启动Tomcat。

5. 附录

Spring MVC是如何和Tomcat关联到一块的

相关推荐
小林学习编程2 小时前
SpringBoot校园失物招领信息平台
java·spring boot·后端
撸码到无法自拔2 小时前
docker常见命令
java·spring cloud·docker·容器·eureka
heart000_12 小时前
IDEA 插件推荐:提升编程效率
java·ide·intellij-idea
ŧ榕树先生3 小时前
查看jdk是否安装并且配置成功?(Android studio安装前的准备)
java·jdk
未来的JAVA高级开发工程师3 小时前
适配器模式
java
LUCIAZZZ3 小时前
JVM之内存管理(一)
java·jvm·spring·操作系统·springboot
D_aniel_3 小时前
排序算法-计数排序
java·排序算法·计数排序
极小狐3 小时前
极狐GitLab 通用软件包存储库功能介绍
java·数据库·c#·gitlab·maven
旧故新长3 小时前
Browserless 快速上手
java
java1234_小锋3 小时前
Spring Bean有哪几种配置方式?
java·后端·spring