【Tomcat】从server.xml来解析Tomcat各组件之间的关系

  • 概述
  • server
  • connector
  • service
  • engine
  • host
  • context
  • 总结

概述

  • Tomcat是一个基于JAVA的WEB容器,其实现了JAVA EE中的 Servlet 与 JSP 规范,与Nginx apache服务器不同之处在于Tomcat一般用于动态请求处理。在架构设计上采用面向组件的方式设计,即整体功能是通过组件的方式拼装完成。另外每个组件都可以被替换以保证灵活性;
  • Tomcat在底层封装了HTTP协议,因此可以认为Tomcat这个Web容器就是一个HTTP 服务器 + Servlet容器
  • Tomcat在使用的时候我们都会去配置它的主要配置文件:server.xml,而这个配置文件里对应的各个部分也正是对应着Tomcat的各个组件;
<?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"/>

    <Service name="Catalina">
        <Connector port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443"/>
        <Engine name="Catalina" defaultHost="localhost">

            <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>
  • Tomcat主要的组件包括:Server、Service、Connector、Container(包括Engine、Host、Context)、Component(包括Manager、logger、loader、pipeline、valve);
  • 各个组件间关系如图所示:

2020-08-02_18-44-17.png

server

  • server是xml配置的根节点,即所有的配置信息都在此节点下面的子节点,在此节点上可以配置关闭Tomcat服务器的端口号与命令;
  • 默认配置的关闭Tomcat的端口号为8005,命令为"SHUTDOWN"(大小写敏感,使用telnet访问端口并输入命令即可);
<Server port="8005" shutdown="SHUTDOWN">
    <Listener className="org.apache.catalina.startup.VersionLoggerListener"/>
    ......

connector

  • Connector即连接器,用于接收指定协议下的网络请求,我们可以在Connector连接器中指定使用的协议实现类,指定端口号,最大线程数等;
  • 一个service下可以配置多个connector连接器,即同一个服务可以通过多个端口访问到;
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/>
<Connector port="80" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8862" URIEncoding="UTF‐8" useBodyEncodingForURI="true" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/plain,text/javascript,text/css,application/x‐json,application/json,application/x‐javascript" maxThreads="1024" minSpareThreads="200" acceptCount="800" enableLookups="false"/>
参数含义
protocol监听的协议,默认是http/1.1,也可以指定IO模型对应的实现类全类名
port服务端访问的端口号
minSpareThreads最小空闲线程数,即服务器启动时就需要创建并且最低维持存活的线程数
maxThreads最大的线程数
enableLookups 如果为true,则可以通过调用 request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名, 若为false则不进行DNS查询,而是返回其ip地址,一般都关闭
redirectPort指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号
acceptCount指定当所有可以使用的处理请求的线程数都被使用时, 可以放到处理队列中的请求数,超过这个数的请求将不予处理
connectionTimeout指定超时的时间数(单位:毫秒)
SSLEnabled是否开启 sll 验证,若访问使用Https协议则必须开启

service

  • 在server.xml配置文件中,service节点在根节点server底下,由多个connector与一个engine组成;一个server底下可以配置多个service;
  • 在server.xml中,有那么一串注释,其意思为service底下也可以配置一个线程池,它可以被多个connector所共享,不过我们一般都是单独配置在connector中的;
<!--The connectors can use a shared executor, you can define one or more named thread pools-->

engine

  • engine是用于处理连接的执行器,默认的引擎是catalina(在很早期时Tomcat曾经就叫做catalina);一个service中只能配置一个engine;
  • 一个engine中可以配置多个host;
<Engine name="Catalina" defaultHost="localhost">
     <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>

host

  • host是我们配置最多的属性了,即访问的虚拟主机;我们可以配置多个host,并且给每个host指定访问的域名,主机名;默认为localhost;配置完后就可以使用这个域名或者主机名访问host下指定的应用程序了;

context

  • context就是我们部署的具体的应用程序了,一个host底下可以有多个context,每个context通过固定的路由前缀来访问,如果不加任何前缀,默认访问的是ROOT目录下的应用程序;
  • 例如,如下配置,如果我们的host的name属性配置的是localhost,connector配置的端口号属性是8080的话,我们就可以在地址栏访问"localhost:8080/test"来访问我们的应用程序(test.war包中的程序);
<Context path="/test" docBase="test.war" reloadbale="true"/>

总结

  • 这些都是Tomcat的最主要的组件,我们如果直接使用Tomcat配置我们的应用程序的话,对各个组件的了解就非常重要,可以帮助我们更好地配置程序;如果我们使用的是框架内嵌Tomcat,了解Tomcat各个组件的工作流程,也有助于我们对程序执行细节的掌控,并且其设计思想也值得我们学习借鉴,不至于让Tomcat一款与我们朝夕相处的Web容器变成“最熟悉的陌生人”了。

注意:本文归作者所有,未经作者允许,不得转载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Maoway稻草人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值