tomcat组件:

<Server>
    <Listener /><!-- 监听器 -->
    <GlobaNamingResources> <!-- 全局资源 -->
    </GlobaNamingResources
    <Service>          <!-- 服务 用于 绑定 连接器与 Engine -->
        <Connector 8080/> <!-- 连接器-->
        <Connector 8010 /> <!-- 连接器-->
        <Connector 8030/> <!-- 连接器-->
        
        <Engine>      <!-- 执行引擎-->
            <Logger />
            <Realm />
               <host "www.tl.com" appBase="">  <!-- 虚拟主机-->
                   <Logger /> <!-- 日志配置-->
                   <Context "/luban" path=""/> <!-- 上下文配置-->
               </host>
        </Engine>
    </Service>
</Server>

 Server 

shutdown :关闭命令。基于telent 执行SHUTDOWN 命令即可关闭(必须大写) telnet 127.0.0.1 8005 SHUTDOWN

Service

Connector

接受客户端链接并接受消息报文,消息报文经由它解析后送往容器中处理

关于Connector的几个重要点:

  • 监听的IP和Port;
  • 处理请求的最大线程数;如果所有线程都忙,则会丢弃新的请求;
  • 所有的Connector接收到请求后,转换成统一的模式,再交给唯一的Engine处理;Engine负责处理请求并产生响应;
  • Connector将Engine产生的响应按合适的协议发送到客户端;
主要属性:
  • protocol 监听的协议,默认是http/1.1
  • port 指定服务器端要创建的端口号
  • minSpareThreads服务器启动时创建的处理请求的线程数
  • maxThreads 最大可以创建的处理请求的线程数
  • enableLookups 如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址
  • redirectPort 指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号
  • acceptCount 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理
  • connectionTimeout 指定超时的时间数(以毫秒为单位)
  • SSLEnabled 是否开启 sll 验证,在Https 访问时需要开启。
  • 生成证书: keytool ­genkey ­v ­alias testKey ­keyalg RSA ­validity 3650 ­keystore D:\test.keystore
<Connector port="8860" protocol="org.apache.coyote.http11.Http11NioProtoc ol" 
	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"/>

Tomcat内部有4个级别的容器,分别是Engine、Host、Context和Wrapper。

Engine

引擎:用于处理连接的执行器,默认的引擎是catalina。全局Servlet引擎。每个Service组件只能包含一个Engine容器组件,但Engine组件可以包含若干Host容器组件。 主要属性:name 引擎名称 defaultHost 默认host

Host

虚拟机:基于域名匹配至指定虚拟机。类似于nginx 当中的server,默认的虚拟机是localhost。演示配置多个Host :
 
<Host name="www.wukong.com" appBase="/usr/www/wukong" unpackWARs="true" autoDeploy="true"> 
 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="www.wukong.com.access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> 
</Host>

当Host获得一个针对特定Host请求时,将会在该Host环境下把请求匹配到对应的Context上;然后把请求交给这个Context来处理。

Context

应用上下文:一个host 下可以配置多个Context ,每个Context 都有其独立的classPath。相互隔离,以免造成ClassPath 冲突。 主要属性:
 
<Context path="/testweb" docBase="testweb.war" reloadbale="true"/>

一个 Context对应一个Web Application;它由多个Servlet组成;在创建Context时,将根据conf/web.xml和webapps/${context path}/WEB-INF/web.xml加载Servlet并创建映射表;

Wrapper

Wrapper是Context的子元素,代表了一个Servlet(或一个JSP被编译后的Servlet);它负责加载Servlet、实例化Servlet、以及触发生命周期方法的调用,如init(), service(), destory()方法;另外,Wrapper也负责调用与Servlet相关的Filter。

Valve

阀门:可以理解成的过滤器,具体配置要基于具体的 Valve 接口的子类。以下即为一个访问日志的Valve
 
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" 
   prefix="www.wukong.com.access_log" suffix=".txt" 
   pattern="%h %l %u %t "%r" %s %b" />

Tomcat处理一个HTTP请求的过程

假设来自客户的请求为: http://localhost:8080/wsota/wsota_index.jsp 
1) 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得 
2) Connector把该请求交给它所在的Service的Engine来处理,并等待来自Engine的回应 
3) Engine获得请求localhost/wsota/wsota_index.jsp,匹配它所拥有的所有虚拟主机Host 
4) Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机) 
5) localhost Host获得请求/wsota/wsota_index.jsp,匹配它所拥有的所有Context 
6) Host匹配到路径为/wsota的Context(如果匹配不到就把该请求交给路径名为""的Context去处理) 
7) path="/wsota"的Context获得请求/wsota_index.jsp,在它的mapping table中寻找对应的servlet 
8) Context匹配到URL PATTERN为*.jsp的servlet,对应于JspServlet类 
9) 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法 
10)Context把执行完了之后的HttpServletResponse对象返回给Host 
11)Host把HttpServletResponse对象返回给Engine 
12)Engine把HttpServletResponse对象返回给Connector 
13)Connector把HttpServletResponse对象返回给客户browser

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐