Tomcat设计剖析(一)

Tomcat整体结构及组件如下图所示

《Tomcat设计剖析(一)》

  1. Server
    a.提供监听机制,用于在Tomcat整个生命周期中对不同事件进行处理。
    b.提供Tomcat容器全局的命名资源实现
    Tomcat的运行实例的抽象,包含若干个Listener组件、GlobalNamingResource组件及若干个Service组件。
  2. Service
    Service组件由若干个Connector组件和Executor组件组合而成。
    Connector组件负责监听某端口的客户端请求,不同端口对应不同的Connector。
    Executor组件在Service抽象层提供了线程池,让Service下的组件可以共用线程池。
    默认情况下,不同的Connector组件会自己创建线程池来使用。其他组件也可以共享Service线程池。
  3. Connector
    Connector是Tomcat最核心的两个组件之一,主要负责接收客户端连接和客户端请求的处理加工。
    每个Connector都指定一个端口进行监听,分别对请求报文解析和对响应报文组装,解析生成Request对象,组装生成Response对象,可以有多个Connector。
    Protocol组件:是协议的抽象,将不同的协议进行了封装,如:HTTP协议和AJP协议。
    EndPoint组件:是接收端的抽象,BIO模式有JioEndpoint,NIO模式有NioEndpoint和本地I/O模式的AprEndpoint。
    Acceptor组件:用于接收客户端连接的接收器。
    Executor组件:Connector自己的私有线程池。
    Processor组件:处理客户端请求的处理器,不同的协议和不同的I/O模式有不同的处理方式。
    Mapper组件:路由器,对客户端请求URL的映射,通过它可以将不同的请求转发到对应的Host组件、Context组件、Wrapper组件进行处理并响应给客户端。即将请求发送到某虚拟主机上的某个web应用的某个servlet。
    CoyoteAdapter组件:适配器,将Connector组件和Engine容器适配连接起来。把接收到的客户端的请求报文解析成请求对象和响应对象传递到Engine容器,交由容器处理。
    目前Tomcat支持两种Connector,支持HTTP协议与AJP协议的Connector,Connector组件的不同体现在其协议及I/O模式的不同。HTTP Connector所支持的协议版本为HTTP/1.1和HTTP/1.0。每个Connector实例对应一个端口,在同一个Service中可以设置若干个Connector实例,端口必须不同,协议可以相同。如Http11Protocol(BIO模式)、Http11NioProtocol(NIO模式)。
  4. Engine
    全局引擎容器,标准实现是StandardEngine。
    Host组件:是Engine容器的子容器,表示一个虚拟主机,不同的域名被抽象成一个Host。
    AccessLog组件:负责记录客户端请求访问日志,Engine容器是一个全局的Servlet容器,记录的日志为所有客户端的请求,无论访问哪个虚拟主机。
    Pipeline组件:Pipeline属于一种设计模式,将不同级别的容器串联起来的通道,请求进来的时候就可以通过管道进行流转处理。
    Cluster组件:有Engine和Host两个级别的集群
    Realm组件:存储了用户、密码及权限等数据,主要是配合Tomcat实现资源认证模块
  5. Host
    表示虚拟主机,一个Engine可以包含若干个Host容器,一个Host容器可以包含若干个Context容器。
  6. Context
    Context容器包含若干个Wrapper组件、Realm组件、AccessLog组件、Manager组件等。
    Manager组件:维护会话的生成、更新、销毁。每个Context都有自己的会话管理器。
    Wrapper是Tomcat中最小级别的容器。其他组件不再赘述。
  7. Wrapper
    包含servlet和servlet对象池
    servlet对象池是为了支持一个Servlet对象对应一个线程的SingleThreadModel接口而使用的策略,Wrapper会有一个Servlet堆,负责保存若干个Servlet对象,当需要Servlet对象时从堆中pop出一个对象,当用完之后push回堆中。Wrapper容器中最多可以有20个某servlet类对象。超过会阻塞等待,直到有可用对象为止。
    原文作者:帅帅的波
    原文地址: https://segmentfault.com/a/1190000014122044
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞