瞅瞅,这还是你熟悉的Tomcat吗?

一、Tomcat 架构概览

image-20220626233203077

1、Tomcat是什么?

Apache Tomcat软件是Jakarta ServletJakarta Server PagesJakarta Expression LanguageJakarta WebSocketJakarta AnnotationsJakarta Authentication 规范的开源实现 。这些规范是 Jakarta EE 平台的一部分。

官网地址:tomcat.apache.org/

tomcat是一个容器,用于承载Servlet,Tomcat就是实现了部分J2EE规范的服务器。

Jakarta EE是J2 EE的延续,其中Tomcat10以后都是Jakarta EE,Tomcat9以前都是都是J2EE。

2、Tomcat文件结构

2.1、目录和文件

  • bin:二进制执行文件,脚本
  • conf:配置文件
  • logs: 日志文件
  • webapps:web应用存放位置
  • lib:共享文件
  • CATALINA_HOME:安装根目录,CATALINA是tomcat核心所在。存放不可变文件,只读文件,属于tomcat的共用基础配置。
  • CATALINA_BASE:配置文件的目录,可以通过改变配置来解决单机运行多个tomcat而不需要解压。

2.2、启动类

  1. 找到tomcat下面bin目录

  2. 查看启动脚本,windows为startup.bat,mac系统为startup.sh,内容不需要过多关注,直接查看最后一句

    1.exec "$PRGDIR"/"$EXECUTABLE" start "$@"
    ​
    2.EXECUTABLE=catalina.sh
    

    上述为脚本内容,第一行执行了变量EXECUTABLE中的start,第二行为EXECUTABLE变量具体内容,可以看到具体执行的还是catalina.sh中的start方法。

  3. 找到catalina.sh脚本中的start

    if [ "$1" = "debug" ] ; then
      if $os400; then
        echo "Debug command not available on OS400"
        exit 1
      else
        shift
        if [ "$1" = "-security" ] ; then
          if [ $have_tty -eq 1 ]; then
            echo "Using Security Manager"
          fi
          shift
          eval exec ""$_RUNJDB"" ""$CATALINA_LOGGING_CONFIG"" $LOGGING_MANAGER "$JAVA_OPTS" "$CATALINA_OPTS" \
            -D$ENDORSED_PROP="$JAVA_ENDORSED_DIRS" \
            -classpath "$CLASSPATH" \
            -sourcepath "$CATALINA_HOME"/../../java \
            -Djava.security.manager \
            -Djava.security.policy=="$CATALINA_BASE"/conf/catalina.policy \
            -Dcatalina.base="$CATALINA_BASE" \
            -Dcatalina.home="$CATALINA_HOME" \
            -Djava.io.tmpdir="$CATALINA_TMPDIR" \
            org.apache.catalina.startup.Bootstrap "$@" start
        else
          eval exec ""$_RUNJDB"" ""$CATALINA_LOGGING_CONFIG"" $LOGGING_MANAGER "$JAVA_OPTS" "$CATALINA_OPTS" \
            -D$ENDORSED_PROP="$JAVA_ENDORSED_DIRS" \
            -classpath "$CLASSPATH" \
            -sourcepath "$CATALINA_HOME"/../../java \
            -Dcatalina.base="$CATALINA_BASE" \
            -Dcatalina.home="$CATALINA_HOME" \
            -Djava.io.tmpdir="$CATALINA_TMPDIR" \
            org.apache.catalina.startup.Bootstrap "$@" start
        fi
      fi
    

    这个脚本内容比较多,不必逐行去看,直接找到start相关内容,也就是如上内容,可以看到最终找到了

    org.apache.catalina.startup.Bootstrap

2.3、xml文件

  • web.xml:tomcat的web.xml是所有web应用的默认值都取自conf/web.xml,自定义的web.xml是可以覆盖该默认值。

  • context.xml:每个web应用都会加载conf/context.xml

    <Context>
        <WatchedResource>WEB-INF/web.xml</WatchedResource>
        <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
    </Context>
    

    一个context代表了一个web应用,web应用的目录:

    • WEB-INF:web的元数据目录
    • META-INF:元数据目录
    • WatchedResource:监听资源,监听了WEB-INF/web.xml和${catalina.base}/conf/web.xml,发现改动后,随即马上重新加载应用。

2.4、work目录

jsp最终是要转变为Servlet,而Servlet是一个java类,类是需要编译处理的,work目录就是用来保存jsp生成的Servlet文件

这个目录就是工作目录。

2.5、其他目录

  • java:源码文件目录

  • logs:运行时产生的日志文件

  • modules第三方模块化依赖

  • res:资源目录文件,如:欢迎页,图片等

  • test:测试包

  • webapp:存放项目文件

    以下文件为tomcat默认自带的

    • docs:文档页
    • Host-manager:主机管理也
    • Manager:总管理页
    • ROOT:root跟页

3、Tomcat组件

3.1、server组件

server组件定义的是一个tomcat实例

<Server port="8005" shutdown="SHUTDOWN"></Server>

默认监听在8005端口以接收shutdown命令。

要启用多个tomcat实例,将它们监听在不同的端口即可。

这个端口的定义为管理员提供一个关闭实例的便捷途径,可以直接telnet至此端口使用SHUTDOWN命令关闭此实例。不过基于安全角度的考虑,通常不允许远程进行。

3.2、service组件

service组件中封装connector和container由它们组成一个service向外提供服务

<Service name="Catalina"></Service>

3.3、Connection组件

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />

连接器用于接收客户端发送的请求并返回响应给客户端。

一个service中可以有多个connector。有多种connector,常见的为http/1.1,http/2和ajp(apache jserv protocol)。在tomcat中,ajp连接协议类型专用于tomcat前端是apache反向代理的情况下。 因此tomcat可以扮演两种角色:

  • Tomcat仅作为应用程序服务器(等价servlet容器,动态jsp;包括servlet和ejb):请求来自于前端的web服务器,这可能是Apache, IIS, Nginx等;
  • Tomcat既作为web服务器(解析http协议,响应客户端,静态;非处理动态(委托)),也作为应用程序服务器:请求来自于浏览器。

3.4、Engline组件

<Engine name="Catalina" defaultHost="localhost">
</Engine>
​
<Engine name="Standalone" defaultHost="localhost" jvmRoute="TomcatA">
</Engine>

engine是service组件中用来分析协议的引擎机器,它从一个或多个connector上接收请求,并将请求交给对应的虚拟主机进行处理,最后返回完整的响应数据给connector,通过connector将响应数据返回给客户端。

只有一个engine元素必须嵌套在每个service中,且engine必须在其所需要关联的connector之后

一个service中只允许有一个engine。

3.5、Host组件

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

host容器用来定义虚拟主机。

engine从connector接收到请求进行分析后,会将相关的属性参数传递给对应的(筛选方式是从请求首部的host字段和虚拟主机名称进行匹配)虚拟host进行处理。

如果没有合适的虚拟主机,则传递给默认虚拟主机。

因此每个容器中必须至少定义一个虚拟主机,且必须有一个虚拟主机和engine容器中定义的默认虚拟主机名称相同。

后续内容,且看后续文章

猜你喜欢

转载自juejin.im/post/7113574451991543838