老朋友,好久不见,tomcat!
可能我们已经很久没有注意过tomcat了,它就像是生活中的锅碗瓢盆,
我们经常用到,却又总是忽略它的存在,不妨花些时间,去了解一下。
简介
tomcat是一个servlet容器,接收请求、发送响应。
tomcat负责载入我们的servlet,调用init方法来初始化servlet;
对于一个request请求,创建一个ServletRequest实例和一个ServletResponse实例,
调用service方法时,将这两个实例作为参数传入;
关闭servlet时,调用servlet的destroy方法并将其卸载。
tomcat支持的应用层协议和IO模型
支持的应用层协议:
http/1.1:绝大多数web应用采用的访问协议;
ajp:用于和其它web服务器集成,例如Apache http server;
http/2.0:下一代http协议,自tomcat8.5开始支持。
支持的IO模型:
IO:标准IO,jdk1.4之前的api;
nio:non-blocking IO是jdk1.4之后提供的一套API,可以替代原来的标准IO,
支持面向缓冲区的、基于通道的IO操作,
可以更高效地进行IO操作;
具体可以看:Java NIO详解。
aio/nio2:异步IO,作为nio的增强出现在jdk1.7中;
APR:Apache服务器的支持库。
tomcat6之前默认使用标准IO,tomcat7之后默认使用nio。
对协议和IO模型的支持由connector实现。
文件目录
tomcat的主要目录,以apache-tomcat-8.5.73为例。
目录 | 内容 |
---|---|
bin | tomcat的命令。 |
conf | tomcat的配置文件。 |
lib | tomcat运行依赖的jar。 |
logs | 运行过程产生的日志文件。 |
temp | 运行过程产生的日志文件。 |
webapps | 需要部署的应用。 |
work | 运行时产生的编译文件。 |
功能组件
tomcat有两个心脏,分别是负责接收和响应外部请求的connector和负责处理请求的container。
一个或多个connector和一个container组成一个service,一个tomcat可以包含多个service,
server服务器就是tomcat。
connector
任务是监听网络端口,接收浏览器发过来的tcp连接请求,
创建一个Request和Response对象分别用于和请求端交换数据,
然后会产生一个线程来处理这个请求并把产生的Request和Response对象作为参数传给处理这个请求的线程,处理这个请求是Container要做的事了。
connector最重要的功能就是接收请求然后分配线程让container处理,多线程处理是connector设计的核心。
connector框架是coyote,主要包含以下几个组件。
ProtocolHandler
协议处理器,
封装了对不同协议和请求方式的处理。
endpoint
处理接收和响应的逻辑,
内部由acceptor监听请求,handler调用processor处理获得的socket,
asyncTimeout检查请求超时。
processor
processor将socket字节流转换为TomcatRequest交给adapter处理。
adapter
adapter将TomcatRequest转换为ServletRequest传递给container。
container
container的框架是Catalina卡特琳娜,主要包含以下几个组件。
一个container对应一个engine;
engine:引擎,一个engine可以管理多个host;
host:站点,一个host可以部署多个context;
context:web应用,包含多个wrapper;
wrapper:servlet封装器,容器的最底层。