vlambda博客
学习文章列表

Java进阶:Tomcat干货笔记

什么是Tomcat

Tomcat是一个轻量级Web应用服务器(Web容器),可以接收客户端发来的http、https请求,并返回给客户端相应的资源信息。

用Java编写的Servlet、jsp程序需要部署在Web容器上,才能实现功能。


Tomcat体系结构

一、Connector和Container

1.Tomcat有两个功能:

●和客户端浏览器进行交互,进行socket通信,将字节流和Request/Response等对象进行转换

●使用Servlet容器处理业务逻辑


2.这两个功能分别使用Connector与Container完成:

●连接器Connector,负责对外交流:处理Socket连接,负责网络字节流与Request和Response对象的转化。

(主要是将外部请求转为可以Container处理的形式,将Container返回的结果转为客户端可以接收的形式。)

●容器Container,负责内部处理:加载和管理Servlet,以及具体处理Request请求。

(收到请求后,主要是确定具体处理的Servlet并处理请求,返回信息;或者找到对应的静态资源,返回信息。)


3.如图:



二、Connector(Coyote)

1.在Tomcat中,Connector组件的名字叫Coyote。它可以分为两部分:

●ProtocolHandler:负责处理具体协议,将客户端请求封装成Tomcat原生Request对象。

(返回信息时同理)

●Adapter:由于协议不同,客户端发来的请求信息不同,Tomcat的ProtocolHandler将请求封装成的Request对象不是标准的ServletRequest对象;所以使用Adapter将Tomcat Request对象转为ServletRequest对象,再调用容器处理。

(返回信息时同理)


2.而ProtocolHandler又可以分为两部分:

●EndPoint:是通信监听的接口,是具体接收Socket和发送Socket的处理器。是对传输层的抽象,是用来实现TCP/IP协议的。

(返回信息时同理)

●Processor:是协议处理的接口,用来实现HTTP协议。负责接收来自EndPoint的Socket,读取字节流解析成Tomcat Request和Tomcat Response对象,并通过Adapter将其提交到容器处理。是对应用层协议的抽象。

(返回信息时同理)


3.如图:


Java进阶:Tomcat干货笔记

*浏览器发起的是HTTP请求,HTTP(应用层)是基于TCP/IP(传输层)的,TCP/IP是用Socket实现的。


三、Container

Container接收Connector传来的ServletRequest对象,进行处理,返回ServletResponse对象。

Container组件下有几种具体的组件,分别是Engine、Host、Context和Wrapper。这4种组件(容器)是父子关系。

●Engine:表示整个Catalina的Servlet引擎,用来管理多个虚拟站点,一个Service最多只能有一个Engine,但是一个引擎可包含多个Host

●Context:表示一个Web应用程序,一个Web应用可包含多个Wrapper

●Wrapper:表示一个Servlet,Wrapper作为容器中的最底层,不能包含子容器(一个Wrapper中包含一个Servlet相关的信息)

*上述组件的配置其实就体现在conf/server.xml中。


如图:



四、Servlet容器Catalina

Tomcat是由一系列可配置(conf/server.xml)的组件构成的Web容器,而Catalina是Tomcat的Servlet容器。

Tomcat本质上是一款Servlet容器,Catalina是Tomcat的核心,其它模块都是为Catalina提供支撑的。

(也就是说,Tomcat有一个Servlet,名字叫Catalina,它实现主要功能。)

Tomcat启动时,初始化Catalina实例,Catalina实例通过加载server.xml完成其他实例的创建,创建并管理一个server,server创建并管理多个服务(Service),每个服务可以有多个Connector和一个Container。

●Catalina:负责解析Tomcat的配置文件(server.xml),以此来创建服务器Server组件并进行管理。

●Server:服务器,表示整个Catalina Servlet容器以及其它组件,负责组装并启动Servlet引擎,Tomcat连接器。Server通过实现Lifecycle接⼝,提供了一种优雅的启动和关闭整个系统的方式

●Service:服务是Server内部的组件,一个Server包含多个Service。它将若干个Connector组件绑定到一个Container

●Container:容器,负责处理用户的servlet请求,并返回对象给web用户的模块。


如图:



Tomcat调优

参数指标:
1.响应时间:执行某个操作的耗时
2.吞吐量:系统在给定时间内能够支持的事务数量,单位为TPS(事务数/秒),一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。


Tomcat优化从两个方面进行:
1.JVM虚拟机优化(优化内存模型)
2.Tomcat自身配置的优化(比如是否使用了共享线程池?IO模型?)


虚拟机运行优化方法:
1.参数调整。
必须根据自己的真实环境进行调整,调优是一个过程。
(1)Xms与Xmx,最小堆内存与最大堆内存,建议相同。(否则后期动态调整内存也会耗费资源)
...


2.选择使用的垃圾回收(GC)策略
(1)吞吐量:工作时间(排除GC时间)占总时间的百分比。
(2)暂停时间:由垃圾回收导致的应用程序停止响应次数/时间。

使用Jconsole查看tomcat进程使用的gc类型,在VM概要里。


3.Tomcat自身相关的调优:
(1)调整tomcat线程池
(2)调整tomcat连接器
(3)禁用AJP连接器
(4)调整IO模式(可以尝试APR模式)
(5)动静分离,动态资源与静态资源分离,nginx(静态)+tomcat(动态)
(Tomcat不擅长处理静态资源)

其它Tomcat相关

1.conf/server.xml配置文件中的标签:
<Engine name="Catalina" defaultHost="localhost">
  <Host name="localhost" appBase="webapps"
   unpackWARS="true" autoDeploy="true">
   </Host>
   <Host name="www.def.com" appBase="webapps2"
   unpackWARS="true" autoDeploy="true">   
   </Host>
</Engine>   

一个Host标签用于部署一个虚拟主机,可以配置多个Host标签。
【然后访问时,可以多个域名访问同一个ip(服务器),对应服务器上的tomcat会根据域名不同选择不同的Host标签与资源文件。】


2.conf/server.xml配置文件中的标签:
<context docBase="E:\apache-tomcat-7.0.62\webapps\ROOT" path="/root" />
可以配置到Host标签中,指明资源对应的路径;
docBase是项目的路径;
path是url中的访问路径;
配置后,访问host+path的url路径,就可以访问项目中的资源。


3.如何手写tomcat与servlet:
(1)使用socket
(2)自己封装request,response对象
(3)手写servlet,手写get与post方法,处理request与response对象
(4)使用SaxReader解析xml,将servlet实例化(当做value),找到对应的访问路径(当做key),装入map。
(5)使用多线程或线程池处理socket请求
(6)收到请求,获取url,如果能找到servlet,则调用get或post方法处理(动态资源)
(7)收到请求,获取url,如果找不到servlet,则将url转为服务器本地的绝对路径,读取文件(例如html),返回文件内容(静态资源)


4.Tomcat启动过程:
先逐级初始化(init),然后逐级启动(start)。
(1)startup.sh或startup.bat
(2)BootStrap
(3)Catalina
(4)Server
(5)Service
 (5.1) Engine->Host->Context
 (5.2) Executor
 (5.3) Connector->ProtocolHandler


5.Tomcat请求处理流程:
Connector->Engine->Host->Context->Wrapper(Servlet)


6.Tomcat开始监听socket的方法:
在NoEndpoint.java中,socket = serverSock.accept();