Tomcat整体结构及大致处理流程

《Tomcat内核设计剖析》笔记 原书作者博客

整体结构

如果将Tomcat内核高度抽象,则它可以看成由连接器(Connector)组件和容器(Container)组件组成

Container包括4个级别的容器:Engine组件、Host组件、Context组件和Wrapper组件

1.Server组件

Server是最顶级的组件,它代表Tomcat的运行实例,在一个JVM中只会包含一个Server。

在Server的整个生命周期中,不同阶段会有不同的事情要完成。为了方便扩展,它引入了监听器方式,所以它也包含了Listener组件。另外,为了方便在Tomcat中集成JNDI,引入GlobalNamingResources组件。

2.Service组件

服务的抽象,在设计上Server组件可以包含多个Service组件,

若干Connector组件和一个客户端请求处理组件Engine组成的集合即为Service。

此外,Service组件还包含了若干Executor组件,每个Executor都是一个线程池,它可以为Service内所有组件提供线程池执行任务。

3.Connector组件

主要的职责就是接收客户端连接并接收消息报文,消息报文经由它解析后送往容器中处理。

NIO方式下,多了一个Poller组件,它的职责是在NIO方式下轮询多个客户端连接,不断检测、处理各种事件,例如不断检测各个连接是否有可读,对于可读的客户端连接则尝试进行读取并解析消息报文。

4.Engine组件

代表全局Servlet引擎,每个Service组件只能包含一个Engine容器组件,但Engine组件可以包含若干Host容器组件。

· Listener组件: 可以在Tomcat生命周期中完成某些Engine容器相关工作的监听器。

· AccessLog组件: 客户端的访问日志,所有客户端访问都会被记录。

· Cluster组件: 它提供集群功能,可以将Engine容器需要共享的数据同步到集群中的其他Tomcat实例上。

· Pipeline组件: Engine容器对请求进行处理的管道。

· Realm组件: 提供了Engine容器级别的用户-密码-权限的数据对象,配合资源认证模块使用。

5.Host组件

代表虚拟主机,这些虚拟主机可以存放若干Web应用的抽象(Context容器)。

6.Context组件

Web应用的抽象,我们开发的Web应用部署到Tomcat后运行时就会转化成Context对象。

·Loader组件: Web应用加载器,用于加载Web应用的资源,它要保证不同Web应用之间的资源隔离。

· Manager组件: 会话管理器,用于管理对应Web容器的会话,包括维护会话的生成、更新和销毁。(TCP的三次握手就创建了一个会话)

· NamingResource组件: 命名资源,它负责将Tomcat配置文件的server.xml和Web应用的context.xml资源和属性映射到内存中。

· Mapper组件: Servlet映射器,它属于Context内部的路由映射器,只负责该Context容器的路由导航。

· Wrapper组件: Context的子容器。

7.Wrapper组件

代表Servlet,一个Wrapper对应一个Servlet。

· Servlet组件: Servlet即Web应用开发常用的Servlet,我们会在Servlet中编写好请求的逻辑处理。

· ServletPool组件: Servlet对象池,当Web应用的Servlet实现了SingleThreadModel接口时则会在Wrapper中产生一个Servlet对象池。线程执行时,需先从对象池中获取到一个Servlet对象,ServletPool组件能保证Servlet对象的线程安全。

整体流程

一个客户端请求到达Tomcat后处理的具体过程:

当Tomcat 启动后,Connector组件的接收器(Acceptor)将会监听是否有客户端套接字连接并接收Socket。

一旦监听到客户端连接,则将连接交由线程池Executor处理,开始执行请求响应任务。

Http11Processor组件负责从客户端连接中读取消息报文,然后开始解析HTTP的请求行、请求头部、请求体。将解析后的报文封装成Request 对象,方便后面处理时通过Request对象获取HTTP协议的相关值。

Mapper组件根据HTTP协议请求行的URL属性值和请求头部的Host属性值匹配由哪个Host容器、哪个Context容器、哪个Wrapper容器处理请求,这个过程其实就是根据请求从Tomcat中找到对应的Servlet。然后将路由的结果封装到Request对象中,方便后面处理时通过Request对象选择容器。

CoyoteAdaptor组件负责将Connector组件和Engine容器连接起来,把前面处理过程中生成的请求对象Request和响应对象Response传递到Engine容器,调用它的管道。

Engine容器的管道开始处理请求,管道里包含若干阀门(Valve),每个阀门负责某些处理逻辑。这里用xxxValve代表某阀门,我们可以根据自己的需要往这个管道中添加多个阀门,首先执行这个xxxValve,然后才执行基础阀门EngineValve,它会负责调用Host容器的管道。

Host容器的管道开始处理请求,它同样也包含若干阀门,首先执行这些阀门,然后执行基础阀门HostValve,它继续往下调用Context容器的管道。

Context容器的管道开始处理请求,,首先执行若干阀门,然后执行基础阀门ContextValve,它负责调用Wrapper容器的管道。

Wrapper容器的管道开始处理请求,首先执行若干阀门,然后执行基础阀门WrapperValve,它会执行该Wrapper容器对应的Servlet对象的处理方法,对请求进行逻辑处理,并将结果输出到客户端。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值