美文网首页面试精选
Tomcat学习——整体架构

Tomcat学习——整体架构

作者: 最美的风景 | 来源:发表于2020-10-28 09:13 被阅读0次

    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启动流程和请求处理流程。

    相关文章

      网友评论

        本文标题:Tomcat学习——整体架构

        本文链接:https://www.haomeiwen.com/subject/wgqqvktx.html