从架构图可以看出,顶层组件Server
代表一个Tomcat Server实例,一个Server
中有一个或者多个Service
,每个Service
有多个Connector
,以及一个Engine
。
Connector
和Engine
是Tomcat最核心的两个组件。
Connector
负责处理网络通信,以及应用层协议(HTTP,AJP)的解析,生成标准的ServletRequest
和ServletResponse
对象,然后传递给Engine
处理。每个Connector
监听不同的网络端口。
Engine
代表整个Servlet
引擎,可以包含多个Host
,表示它可以管理多个虚拟站点。Host
代表的是一个虚拟主机,而一个虚拟主机下可以部署多个Web应用程序,Context
表示一个Web应用程序。Wrapper
表示一个Servlet
,一个Web应用程序中可能会有多个Servlet
。
从Tomcat的配置文件server.xml
也能看出Tomcat的系统架构设计。
<Server>
<Service>
<Connector />
<Connector />
<Engine>
<Host>
</Host>
</Engine>
</Service>
</Server>
我们再仔细看一下Connector
的内部实现。
Endpoint
负责网络通信Processor
实现应用层协议(HTTP,AJP)解析Adapter
将Tomcat的Request
/Response
转换为标准的ServletRequest
/ServletResponse
Tomcat的网络通信层支持多种 I/O 模型:
- NIO:使用
Java NIO
实现 - NIO.2:异步I/O,使用
JDK NIO.2
实现 - APR:使用了Apache Portable Runtime (APR)实现
Tomcat实现支持了多种应用层协议:
- HTTP/1.1
- HTTP/2
- AJP:二进制协议,Web Server和Tomcat之间的通信协议
Processor
解析网络字节流生成Tomcat的Request
对象后,会调用Adapter.service(request, response)
方法。Adapter
是Servlet
引擎的入口,Adapter
负责将Tomcat的Request
对象转换为标准的ServletRequest
,然后再调用Servlet
引擎的service
方法。
Tomcat允许一个Engine
对接多个Connector
,每个Connector
可以使用不同的 I/O 模型,实现不同的应用层协议解析。Connector
屏蔽了 I/O 模型和协议的区别,传递给Engine
的是标准的ServletRequest
/ServletResponse
对象。
由于 I/O 模型和应用层协议解析可以自由组合,Tomcat使用ProtocolHandler
实现这种组合。各种组合都有相应的具体实现类。比如:Http11NioProtocol 和 AjpNio2Protocol。
关于NioEndpoint
和Nio2Endpoint
组件的内部实现,会在后续文章进行分析。