Tomcat主要功能可分为如下两种:
1、处理Socket连接,负责网络字节流与Request 和 Response 对象的转化
2、加载和管理Servlet ,以及具体处理Request请求
因此,Tomcat设计了两个核心组件,Connector 连接器和 Container 容器,来分别做这两件事情,连接器负责对外交流,容器负责内部处理请求。
下面我们详细来学习这两个组件:
一、连接器 —— Coyote
Coyote 是Tomcat连接器的名称,客户端通过Coyote与服务器建立连接、发送请求并接受响应。
Coyote封装了底层的网络通信(Socket请求及响应处理),为Catalina容器提供了统一的接口,使得Catalina容器与具体的请求协议及IO操作方式完全解耦。Coyote将Socket输入装换封装为Request对象,交由Catalina容器进行处理,处理请求完成后,Catalina通过Coyote提供的Response对象将结果写入输出流。
Coyote作为独立的模块,只负责具体协议的解析和IO的相关操作,与Servlet规范实现没有直接关系,因此即便是Request和Response对象也并未实现Servlet规范对应的接口,而是在Catalina中将他们进一步封装为ServletRequest和ServletResponse对象。
Tomcat为了实现支持多种IO模型和应用层协议,一个容器可以对接多个连接器。但是单独的连接器或者容器都不能对外提供服务,需要把他们组装起来才能工作,组装后这个整体叫做Service组件,一个Service就可以单独的对外提供服务。Tomcat内可能有多个Service,就可以实现通过不同的端口号来访问同一台机器上部署的不同应用。
连接器组件
1、EndPoint 通信端点
通信监听的接口,是具体Socket接收和发送处理器,是对传输层的抽象,因此EndPoint用来实现TCP/IP协议的。
Tomcat并没有EndPoint接口,而是提供了一个抽象类AbstractEndPoint,里面定义了两个内部类:Acceptor和SocketProcessor。Acceptor用于监听Socket连接请求,SocketProcessor用于处理接收到的Socket请求,它实现Runnable接口,在Run方法里调用协议处理组件Processor进行处理。为了提高处理能力,SocketProcessor被提交到线程池来执行,而这个线程池叫做执行器(Executor)
2、Processor 处理器
Coyote协议处理接口,如果说EndPoint是用来实现TCP/IP协议的,那么Processor是用来实现HTTP/AJP协议的,Processor接收来自EndPoint的Socket,读取字节流解析成Request和Response对象,并通过Adapter将其提交到容器进行处理,Processor是对应用层协议的抽象。
3、Adapter
由于协议不同,客户端发过来的请求信息也不尽相同,Tomcat定义了自己的Request类来存放这些请求信息,ProtocolHandler接口负责解析请求并生成Request对象,但是这个Request对象不是标准的ServletRequest,不能用Request作为参数来调用容器。Tomcat设计者的解决方案是引入CoyoteAdapter,这是适配器模式的经典应用,连接器调用CoyoteAdapter的Service方法,将Request对象装换成ServletRequest,再调用容器来处理请求。
4、ProtocolHandler
Coyote的协议接口,相当于EndPoint和Processor的组合,即处理TCP/IP协议,又能处理HTTP/AJP协议,我们在配置server.xml时,指定协议名称protocol="HTTP/1.1"。
二、容器 —— Catalina
Tomcat是一个由一系列可配置的组件构成的Web容器,而Catalina是Tomcat的Servlet容器。
Tomcat的模块分层结构图如下:
Tomcat本质上就是一款Servlet容器,因此Catalina才是Tomcat的核心,其他模块都是为Catalina提供支撑的。
容器Catalina组件
如下图所示,Catalina负责管理Server,而Server表示着整个服务器,Server下面有多个服务Service,每个服务都包含着多个连接器组件Connector(Coyote实现)和一个容器组件Container。在Tomcat启动的时候,会初始化一个Catalina的实例。
Catalina各个组件的职责:
Catalina:负责解析Tomcat的配置文件,以此来创建服务器Server组件,并根据命令来对其进行管理;
Server:服务器,表示整个Catalina Servlet容器以及其他组件,负责组装并启动Servlet引擎,Tomcat连接器,Server通过实现Lifecycle接口,提供了一种优雅的启动和关闭整个系统的方式;
Service:服务,是Server内部的组件,一个Server包含多个Service,它将若干个Connector组件绑定到一个Container(Engine)上;
Connector:连接器,处理与客户端的通信,它负责接收客户端请求,将请求封装为Request对象,然后转给相关的容器处理,最后向客户端返回响应结果;
Container:容器,负责处理用户的Servlet请求,并将结果返回给Connector。
Container组件
Tomcat设计了4种容器,分别是Engine、Host、Context和Wrapper。这4中容器不是平行关系,Tomcat通过一种分层的架构,使得Servlet容器具有很好的灵活性。
Container各个组件的含义:
Engine:表示整个Cataline的Servlet引擎,用来管理多个虚拟站点,一个Service最多只能有一个Engine,但是一个Engine可以包含多个Host;
Host:代表一个虚拟主机,或者说一个站点,可以给Tomcat配置多个虚拟主机地址,而一个虚拟主机下可以包含多个Context;
Context:表示一个Web应用程序,一个Web应用可以包含多个Wrapper;
Wrapper:表示一个Servlet,Wrapper作为容器中的最底层,不能包含子容器。
Tomcat整体架构学习到此结束,下一篇文章我们学习tomcat启动流程和请求处理流程。
网友评论