(一)Tomcat架构及运行原理之基本架构

目录

一、Tomcat架构

1.基本架构图

2.核心组件架构图

3.Container内部流程架构图

二、主要类组成

1.基本架构类图

2.模块功能实现类图

三、源码分析

一、Tomcat架构

研究Tomcat的架构以及流程是基于Springboot内嵌的Tomcat进行的,Springboot版本为2.1.6.RELEASE,内嵌的Tomcat版本为9.0。

1.基本架构图

基本架构图如下:

可以把这个架构图大致分为六个部分:

  1. Tomcat服务器本身:开发者接触的部分,包括配置、启动和关闭等开关;
  2. Server服务器:一个Tomcat只有一个Server服务器,这个服务器便是运行在Tomcat中的实例,它控制着Tomcat的运行生命周期;
  3. Service服务:在Server服务器中会有多个Service服务,用于提供主要的对外服务。其主要作用是将Connector和Container组合在一起运行,可以看成是Connector和Container的运行环境,当然,除了这两个主要角色还有其它的模块组件;
  4. Connector核心组件:用户处理连接相关事情,并提供Socket、request和response相关的转换,Springboot设置的port便是设置Connector中的port,而不是Tomcat对象的port;
  5. Container核心组件:用于封装和管理Servlet,以及具体处理Request并返回Response。这里需要注意的Container实际上是类似树状的结构,所有的子类如Engine、Host和Context等都实现了Container接口,一个Container可能包含0-N个子Container,只是最顶层是个Container,因此可以把这部分只当成一个Container;
  6. 其它模块组件:
    1. Jasper:JSP编译器,负责JSP页面的解析及JSP属性的验证,并将JSP页面动态转换成JAVA代码并编译成class文件;
    2. Naming:属性映射组件,绑定配置文件配置的属性及标签名字,并最终放入Context中;
    3. Session:Tomcat为了实现Http会话而实现对应的组件,用于存放请求的会话信息;
    4. Loging:Tomcat官方日志,默认使用JUL日志系统,用于打印Tomcat启动及运行日志;
    5. JMX:全名为Java Manager Extension,主要负责系统管理和监控,也可以动态监控和修改内存中的变量。

2.核心组件架构图

Tomcat运行架构流程如下:

架构组件说明:

  • ProtocalHandler:处理不同的连接类型,具体表现为Http 11 Protocal使用普通的socket连接的,而Http 11 NioProtocal是使用NioSocket连接的,还有Websocket也是用NioSocket处理的,只是后续处理和普通的Http请求有点不一样;
  • Endpoint:用来处理底层的Socket网络,因此其是用来实现TCP/IP协议的;
  • Processor:用来处理诸如Http和WebSocket这种建立在TCP/IP协议之上的更高级别协议;
  • Adapter:将请求适配到具体的Servlet容器进行处理;
  • Engine:Tomcat引擎,用来管理多个站点(或者虚拟主机),一个service只能有一个;
  • Host:代表一个虚拟主机,具体表现为默认的localhost代表ip的名字;
  • Context:代表一个应用,也是Servlet运行的上下文;
  • Wrapper:每个都封装着一个Servlet(当然只局限于普通的Http请求)。

3.Container内部流程架构图

我们根据前面可以知道Container内部的Host、Engine和Context这些都是一层包着一层的,但在这里面他们是如何进行数据交换以及传递的呢?其内部流程架构图大致如下:

可以看到在Container中Host、Engine和Context这些组件之间的通信并不是直接调用的,而是通过Pipeline管道对象中的Valve阀门对象来调用的,可以理解成各个组件有个通信管道连接着这几个主要组件,其中管道的末尾有个阀门控制,调用进下一个组件必须经过这个组件的阀门。示意图如下:

需要注意的是,此时在Valve中的request和response参数都是org.apache.catalina.connector包下的对象,而不是我们熟知的RequestFacade和ResponseFacade,转变成这两个是在最后的Valve中StandardWrapperValve转换的。

二、主要类组成

1.基本架构类图

基本架构类图如下:

看到这个错综复杂的类关系估计人要晕了,但是没关系,我们慢慢来看。这个类图是提取了一些关键的接口及实现类,因此总体上而言并不算很多。还是根据前面两个架构图,我们把这个类图分为三部分:

  1. Tomcat基本组成部分:这部分包含了基本架构图中的Tomcat、Server和Service及其实现类。这部分的主要功能职责便是Tomcat暴露在外运行启动的地方;
  2. 核心组件Container部分:这部分如核心组件架构图中的Container一样,包含了Engine、Host、Context和Wrapper。这部分的功能职责便是初始化并保留执行具体请求的处理类,如Servlet的初始化以及运行就是在这里面完成的;处理上下文初始化调用的某些接口,如读过XML集成Spring熟知的ServletContextListener接口便是在在这个流程执行的;
  3. 核心组件Connector部分:这部分如核心组件架构图中的Connector,包含了ProtocolHandler和Endpoint以及processor等,除了组件架构图展示的那几个,还包括了SocketChannel以及Executor接口及实现类。主要职责便是注册Nio轮询类以及线程池,轮询实际请求,并由Adapter接口实现类完成不同请求交给不同处理类的操作,处理实际请求的方法便是IO多路复用,使用Poller、PollerEvent和Selector来提高Tomcat的吞吐率。

2.模块功能实现类图

Container中通道结构类图:

可以看到这个图相较于Tomcat的基本类图来说就更加清晰明了了,没有那么多复杂的关系。从其类图就可以看出来其大致分为三个部分:

  1. 通道(Pipeline)和阀门(Valve)部分:由Valve接口、Pipeline接口及其六个实现子类组成,即图中中间到最下方的这些类。主要功能便是完成Container组件间的通信,这些阈值对象和主要对象的绑定就是在主要对象初始化时绑定的;
  2. 通信参数:即图中左上角的request和response部分。org.apache.catalina.connector包下的request和response里面都封装了javax.servlet.http包下response和request的实现类,同样也封装了host、context以及wrapper等对象,因此只需要处理完request和response后直接往下传就OK了,处理模式和责任链模式很像;
  3. 过滤器和Servlet:即图中最右边的四个类。其主要功能便是从StandardWrapperValve调用到过滤器,过滤器最后再调用进Servlet,将收到请求、调用进Container、Valve链调用、过滤器链调用和Servlet整个流程串联起来,形成整个通路。

三、源码分析

Tomcat的源码流程分析根据前面的架构图也分为三个部分:

  1. Tomcat基础架构和核心组件Container的初始化和执行流程,见文章(二)Tomcat架构及运行原理之Container源码分析

  2. Tomcat核心组件Connector的初始化和执行流程,见文章(三)Tomcat架构及运行原理之Connector源码分析

  3. 收到请求后Valve和过滤器等的串联流程,见文章(四)Tomcat架构及运行原理之请求处理,这篇看不看都无所谓了,只需要大致了解其流程就行,毕竟里面的处理代码逻辑没有很多,只有Adapter里面的逻辑需要稍微注意一下。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值