认识Tomcat之结构体系与核心配置

Posted 木兮君

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了认识Tomcat之结构体系与核心配置相关的知识,希望对你有一定的参考价值。

前言

今天小编新开一个tomcat的分享章节,主要是最近需要布置一下环境,然后项目基本都是tomcat作为web容器,还记得小编刚刚开始接触tomcat的时候版本还是7现在都到10了,官网都不推荐7了,其线程模型也从bio到nio了。
当然tomcat小编不会深入讲解,大致会讲解tomcate的架构体系,生产环境如何搭建使用,http请求处理流程(一个请求如何到达咱们的项目中的servlet),还有就是io的网络通信模型。
好了介绍完大致要分享的内容,咱们进入正题。

Tomcat架构体系

架构说明

Tomcat是⼀个基于JAVA的WEB容器,其实现了JAVA EE中的 Servlet 与 jsp 规范,与nginx apache 服务器不同在于⼀般⽤于动态请求处理(这边说明其支持html,以及动态请求和页面渲染,早期服务器一般是不支持动态请求的,只支持html,这在早期是比较牛的)。在架构设计上采⽤⾯向组件的⽅式设计。即整体功能是通过组件的⽅式拼装完成。另外每个组件都可以被替换以保证灵活性。
上面说了tomcat是面向组件设计的,也就是可以像积木一样拼接,那小编带大家看下tomcat的架构图。

架构图


看来上面的架构图,是不是不太明白,那下面小编讲一下各个组件的作用

各个组件以及关系

  1. Server:顶级模块,一个tomcat进程只有一个Server,有个端口用于关闭。理解为服务器
  2. Service:一个Server可以有多个Service,可以理解为服务,有多个,但是请求无法直接到达服务,就需要下面的Connector组件了。
  3. Connector:通过连接器我们就可以请求到我们的服务,连接器的话有不同的协议,如http,jk2等,连接器有两个属性一个是协议,一个是端口号。
  4. Engine:引擎组件,当连接进来后到达服务,那有引擎来处理请求
  5. Host:引擎里面包含多个站点。他主要是基于域名来分发请求。
  6. Context:站点又可包含多个Context,context对应到多个servlet。这里Context可以理解为应用,这里主要为隔离各个WEB应用,然后每个Context的ClassLoader都是独立。

到这儿各个组件的作用和关系就差不多了,希望大家能够理解。当然还可以划分为顶层组件(Server和Service),连接器组件(Connector),容器组件(Engine,Host,Context),其他组件(日志等,这里不表)。小编画了一张简易图希望加深大家印象:

接下来根据上面组件的理解,继续看下server.xml的配置:

详解sever.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>
     <!-- 用户名密码,配置中tomcat-user.xml-->
    <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">
  	<!-- 可以有多个连接,一般情况下不会配置多个连接器,现在都用ngnix了-->
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
     <!-- 协议处理器,7.0版本默认bio,8.0默认nio,9.0没有bio了 -->
     <Connector port="8082" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
     <!-- 引擎,默认host 为localhost ,如果域名你写为127.0.0.1则匹配到默认的,因为Host 中的name都匹配不到-->
    <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">
         <!-- 阀门 这里陪着了log日志打印-->
        <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>
		 <!-- 站点的根路径以及name,默认是webapps下面的,unpackWARS为默认是否解压war包,autoDeploy为自动发布 -->
		  <!-- 这里要访问www.lecture.com则需要配置host文件 -->
       <Host name="www.lecture.com"  appBase="/Users/lectrue/data/www"
            unpackWARs="true" autoDeploy="true">
             <!-- 直接配置他的项目docBase,这样就可以访问其所有的内容,path不需要斜杆 -->
             <!-- 这个配置可以做engine的host下面配置xxx.xml,xxx可以作为名字路径 ,大家记住这个后续很有用-->
            <Context path="tomcat" docBase="/Users/lectrue/temp/tomcat-10.0.8">
 
            </Context>
      </Host>

      
    </Engine>
  </Service>

  <Service name="Catalina2">
    <Connector port="8083" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    
               
    <Engine name="Catalina2" 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>

上面文字比较多,那希望看到博客的小伙伴可以耐心看完。接下来我们聚焦一下connector的配置;

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               maxThreads="5"
               minSpareThreads="2" 
               maxConnectors = "10"
               acceptCount = "5"
               />

小编重点解释一下这些配置,一般情况下我们不需要去修改他:

  • port: 指定服务器端要创建的端口号
  • protocol: 监听的协议,默认是http/1.1
  • connectionTimeout:这里的超时时间是网络读写的时间
  • maxThreads:最大线程数量
  • minSpareThreads:启动的时候请求业务的线程
  • maxConnectors :当请求大于线程数量的时候,会放入队列,连接依然可以进来,但是连接最大连接数为10
  • acceptCount :当到达最大连接数的时候可以接受等待的数量

当然还可以把线程池配置单独拿出来,connector里面进行引用

<Executor name="myExecutor" maxThreads="5" minSpareThreads="2" />
<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               executor ="myExecutor"
               maxConnectors = "10"
               acceptCount = "5"
               />

当然要理解全部最好去看官网或者看配置的注释。

总结

今天主要是分享了tomcat的整体的结构体系已经核心配置。还是比较简单的,大家可以在自己的环境上操作配置,来一一证明上述的理论。或许小编讲错了呢!

以上是关于认识Tomcat之结构体系与核心配置的主要内容,如果未能解决你的问题,请参考以下文章

认识Tomcat之结构体系与核心配置

大数据技术之_30_JVM学习_01_JVM 位置+JVM 体系结构概览+堆体系结构概述+堆参数调优入门+JVM 的配置和优化+Tomcat 的配置和优化

37 java技术体系基础tomcat核心概念及使用初步tomcat配置与应用

04-Tomcat体系结构与插件配置

servlet之初见

spring5源码分析系列——spring核心容器体系结构