文章内容输出来源:拉勾教育Java高薪训练营
Tomcat 是一个开源的轻量级Web应用服务器,可实现JavaWeb程序的装载,它也具有传统的Web服务器的功能,也可以说Tomcat是一个Servlet容器。
Tomcat主要服务区B/S架构:浏览器客户端与服务器端交互。
浏览器访问服务器使用的是Http协议,Http是应用层协议,用于定义数据通信格式。数据传输使用的是TCP/IP协议
当用户请求某个URL资源时
Tomcat有两个非常重要的功能
因此Tomcat设计了两个核心组件连接器(Connector)
和容器(Container)
来完成Tomcat的两大核心功能
Request
和Response
对象的转化;Coyote是Tomcat中连接器组件,是对外的接口。客户端通过Coyote与服务器建立连接、发送请求、接受请求。
应用层 | 应用层协议 | 描述 |
---|---|---|
HTTP/1.1 | 这是大部分Web应用采用的访问协议 | |
AJP | 用于和WX集成(如Apache),以实现对静态资源的优化以及集群部署,当前支持AJP/1.3 | |
HTTP/2 | HTTP2.0大幅度的提升了Web性能。下一代HTTP协议,自8.5以及9.0版本之后开始支持 | |
传输层 | IO模型 | 描述 |
NIO | 非阻塞I/O,采用Java NIO类库实现 | |
NIO2 | 异步I/O,采用JDK7最新的NIO2类库实现 | |
APR | 采用Apache可移植运行库实现,是C/C++编写的本地库。如果选择该方案,需要单独安装APR库 |
在8.0之前,Tomcat默认采用的I/O的方式为BIO,之后改为NIO。无论NIO、NIO2还是APR,在性能方面均优于以往的BIO。如果采用APR,伸直可hi达到Apache HTTP Server的影响性能
组件 | 作用描述 |
---|---|
EndPoint | EndPoint是Coyote通信端点,即通信监听的接口,是具体Socket接收和发送处理器,是对象传输层的抽象,因此EndPoint是用来实现TCP/IP协议的 |
Processor | Processor是Coyote协议处理接口,如果说EndPoint是用来实现TCP/IP协议的,那么Processor用来实现HTTP协议,Processor接受来自EndPoint的Socket,读取字节流解析成Tomcat Request和Response对象,并通过Adapter将其提交到容器处理,Processor是对应用层协议的抽象 |
ProtocolHandler | Coyote协议几口,通过EndPoint和Processor实现针对具体协议的处理能力。Tomcat按照协议和I/O提供的实现类: AjpNioProtocol, AjpAprProtocol҅ ,AjpNio2Protocol ,Http11NioProtocol,Http11Nio2Protocol ,Http11AprProtocol |
Adapter | 由于协议不同,客户端发过来的请求信息也不尽相同,Tomcat定义了自己的Request类来封装这些请求信息。ProtocolHandler接口负责解析请求并生成Tomcat Request类。但是这个Request对象不是标准的ServletRequest,不能用Tomcat Request作为参数来调用容器。Tomcat设计者的解决方案是引入CoyoteAdapter,这是适配器模式的经典运用,连接器调用CoyoteAdapter的Service方法,传入的是Tomcat Request对象,CoyoteAdapter负责将Tomcat Request转换成ServletRequest对象,然后再调用容器 |
Tomcat是一个由一系列可配置(conf/server.xml
)的组件构成的Web容器,而Catalina是Tomcat的Servlet容器。
Catalina是Tomcat的核心,其他模块都是为Catalina提供支撑的
我们可以认为整个Tomcat就是一个Catalina实力,Tomcat启动的时候会初始化这个实力,Catalina实力通过加载server.xml来完成创建一个Server,Server创建并管理多个服务,每个服务又可以又多个Connector和一个Container
server.xml
)用于创建服务器Server组件并进行管理Cintainer组件下有集中具体的组件,分别是Engine、Host、Context和Wrapper。具体配置在conf/server.xml
中
Tomcat作为服务器的配置,主要是server.xml
文件的配置,server.xml
中包含了Servlet容器的相关配置,即Catalina的配置
主要标签如下
<Server>
<Listener />
<GlobalNamingResources />
<Service />
Server>
<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">
...
Service>
Server>
<Service name="Catalina">
...
Service>
<Executor name="commonThreadPool"
namePrefix="thread-exec-"
maxThreads="200"
minSpareThreads="100"
maxIdleTime="60000"
maxQueueSize="Integer.MAX_VALUE"
prestartminSpareThreads="false"
threadPriority="5"
className="org.apache.catalina.core.StandardThreadExecutor"/>
Connector标签用于创建链接器实例,默认有2个,一个支持HTTP协议,一个支持AJP协议
一般情况下我们不需要新增,只需要对已有的进行优化
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
还可以使用共享线程池
<Connector port="8080"
protocol="HTTP/1.1"
executor="commonThreadPool"
maxThreads="1000"
minSpareThreads="100"
acceptCount="1000"
maxConnections="1000"
connectionTimeout="20000"
compression="on"
compressionMinSize="2048"
disableUploadTimeout="true"
redirectPort="8443"
URIEncoding="UTF-8" />
Engine标签标识Servlet引擎
<Engine name="Catalina" defaultHost="localhost">
...
Engine>
Host标签用于配置一个虚拟主机
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
...
Host>
Context用于配置一个Web应用
<Host name="www.xxx.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Context docBase="/xxx/xxx/web_demo" path="/web3">Context>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
Host>