前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >硬核图解 Tomcat 整体架构

硬核图解 Tomcat 整体架构

作者头像
肉眼品世界
发布于 2020-11-11 03:20:21
发布于 2020-11-11 03:20:21
92900
代码可运行
举报
文章被收录于专栏:肉眼品世界肉眼品世界
运行总次数:0
代码可运行

总体架构

核心功能:

  • 处理 socket 连接,负责将网络字节流与 Request 和 Response 对象的转化;
  • 加载和管理 Servlet,以及具体处理 Request 请求;

Tomcat 支持的 io 模型有 NIO、NIO2、APR,Tomcat 支持的应用层协议有 http1.1 ajp http2.0。

Tomcat 最顶层是 server,一个 server 有多个 service,一个 service 有多个连接器和一个容器,连接器和容器之间通过 ServletRequest 和 ServletResponse 通信。

通过组合模式、模板方法、观察者模式和骨架抽象类,tomcat 定义了基类 LifeCycleBean 实现 LifeCycle 接口,把公共的逻辑,生命周期状态转变和维护、生命事件的触发和监听器的添加删除,子类负责实现自己的 init、stop 和 start 等方法。

  • tomcat 自定义了监听器;
  • @WebListener 注解,定义自己的监听器;

StandardServer、StandardService 等是 Server 和 Service 组件的具体实现类,它们都继承了 LifecycleBase。

StandardEngine、StandardHost、StandardContext 和 StandardWrapper 是相应容器组件的具体实现类,因为它们都是容器,所以继承了 ContainerBase 抽象基类,而 ContainerBase 实现了 Container 接口,也继承了 LifecycleBase 类,它们的生命周期管理接口和功能接口是分开的。

连接器 Connector

连接器进一步细化:

  • 监听网络端口;
  • 接受网络请求;
  • 读取网络字节流;
  • 根据应用层协议解析字节流,生成统一的 tomcat request 和 tomcat response 对象;
  • 将 tomcat request 对象转成 servletRequest;
  • 调用 servlet 容器,得到 servletResponse;
  • 将 servletResponse 转成 tomcat response;
  • 将 tomcat response 转成网络字节流;
  • 将响应字节流写回给浏览器;

按照高内聚的功能划分:

  • 网络通信;
  • 应用层协议解析;
  • tomcat request/response 与 servlet request/response 的转换;

组件通过接口交互,好处是封装变化。Endpoint 负责提供字节流给 Processor,Processor 负责提供 tomcat request 对象给 Adapter,Adapter负责提供 Servlet Request 给容器。

其中 Endpoint 和 Processor 抽象组装在一起形成了 ProtocolHandler 组件。

ProtocolHandler

Endpoint

接口,抽象实现类是 AbstractEndpoint,具体子类在 NioEndpoint 和 Nio2Endpoint,其中两个重要组件:Acceptor 和 SocketProcessor。

Acceptor 用于监听 Socket 连接请求,SocketProcessor 用于处理收到的 Socket 请求,提交到线程池 Executor 处理。

Processor

接收 Endpoint 的 socket,读取字节流解析成 tomcat request 和 response,通过 adapter 将其提交到容器处理。Processor 的具体实现类 AjpProcessor、Http11Processor 实现了特定协议的解析方法和请求处理方式。

Endpoint 接收到 socket 连接后,生成一个 socketProcessor 交给线程池处理,run 方法会调用 Processor 解析应用层协议,生成 tomcat request 后,调用 adapter 的 service 方法。

Adapter

ProtocolHandler 接口负责解析请求生成 tomcat requst,CoyoteAdapter 的 service 方法,将 Tomcat Request 对象,转成 ServletRequest,再调用 service 方法。

容器 Container

容器的层次结构

父子关系的 Engine、Host、Context、Wrapper 和 Servlet。Context 表示 web 应用程序、wrapper 表示 servlet、context 有多个 wrapper,host 也有多个 context。

Host 代表的是一个虚拟主机,或者说一个站点,可以给 Tomcat 配置多个虚拟主机地址,而一个虚拟主机下可以部署多个 Web 应用程序;Engine 表示引擎,用来管理多个虚拟站点,一个 Service 最多只能有一个 Engine。

容器通过 Pipeline-Valve 责任链,对请求一次处理,invoke 处理方法,每个容器都有一个 Pipeline,触发第一个 Valve,这个容器的 valve 都会被调到,不同容器之间通过 Pipeline 的 getBasic 方法,负责调用下层容器的第一个 Valve。

整个调用连由连接器中的 adapter 触发,调用 engine 中的第一个 Valve。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Calling the container
connector.getService().getContainer().getPipeline().getFirst().invoke(request, response);

wrapper 容器的最后一个 valve 创建一个 filter 链,并调用 doFilter 方法,最终会调用到 servlet 的 service 方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
final class StandardWrapperValve
    extends ValveBase {

   @Override
      public final void invoke(Request request, Response response)
          throws IOException, ServletException {
          // ...

          ApplicationFilterChain filterChain =
                ApplicationFilterFactory.createFilterChain(request, wrapper, servlet);

        // Call the filter chain for this request
        // NOTE: This also calls the servlet's service() method
        Container container = this.container;
        try {
            if ((servlet != null) && (filterChain != null)) {
                // Swallow output if needed
                if (context.getSwallowOutput()) {
                    try {
                        SystemLogHandler.startCapture();
                        if (request.isAsyncDispatching()) {
                            request.getAsyncContextInternal().doInternalDispatch();
                        } else {

                        // dofilter
                            filterChain.doFilter(request.getRequest(),
                                    response.getResponse());
                        }
                    } finally {
                        String log = SystemLogHandler.stopCapture();
                        if (log != null && log.length() > 0) {
                            context.getLogger().info(log);
                        }
                    }
                } else {
                    if (request.isAsyncDispatching()) {
                        request.getAsyncContextInternal().doInternalDispatch();
                    } else {
                        // dofilter
                        filterChain.doFilter
                            (request.getRequest(), response.getResponse());
                    }
                }

            }
        } catch() {
        // ...
        }
    }
}

ServletContext 是 tomcat 中的一个成员变量,spring 中的 ApplicationContext 是 servlet 规范中的 ServletContext 属性。

版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 肉眼品世界 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Tomcat系统架构浅析
今天咱们就来一步一步分析Tomcat的设计思路,看看Tomcat的设计者们是如何设计一个复杂系统,怎么设计顶层模块,以及模块之间的关系。
架构狂人
2023/08/16
3520
Tomcat系统架构浅析
Tomcat源码解析(一): Tomcat整体架构
连接器对Servlet容器屏蔽了协议及I/O模型等的区别,无论是HTTP还是AJP,在容器中获取到的都是一个标准的ServletRequest对象
冬天vs不冷
2025/01/21
3310
Tomcat源码解析(一): Tomcat整体架构
【Tomcat源码解析】整体架构及组件
Tomcat,昔日名为 Catalina,本是轻巧的 Servlet 容器。Catalina,美国加州海岸线上一颗璀璨的明珠。或许,Tomcat 的缔造者寄望于此,期冀将 Tomcat 塑造为一款既优雅又轻盈的 Web 服务器。自 4.x 版本起,Tomcat 不再局限于 Servlet 的支持,而是增添了诸多新功能,如 JSP、EL、命名服务等,从而超越了 Catalina 的范畴。
@派大星
2024/08/27
1250
【Tomcat源码解析】整体架构及组件
Tomcat的连接器是如何设计的?
Tomcat为 支持多种I/O模型和应用层协议,一个容器可能对接多个连接器。 但单独的连接器或容器都无法对外提供服务,需组装才能正常协作,而组装后的整体,就称为Service组件。所以,Service并不神奇,只是在连接器和容器外面多包了一层,把它们组装在一起。
JavaEdge
2021/12/07
6030
Tomcat的连接器是如何设计的?
Tomcat的连接器是如何设计的?
Tomcat内可能有多个Service,在Tomcat中配置多个Service,可实现通过不同端口号访问同一台机器上部署的不同应用。
JavaEdge
2021/10/18
5730
Tomcat的连接器是如何设计的?
聊聊Tomcat的架构设计
Tomcat 是 Java WEB 开发接触最多的 Servlet 容器,但它不仅仅是一个 Servlet 容器,它还是一个 WEB 应用服务器,在微服务架构体系下,为了降低部署成本,减少资源的开销,追求的是轻量化与稳定,而 Tomcat 是一个轻量级应用服务器,自然被很多开发人员所接受。
张乘辉
2019/06/14
6500
Tomcat 架构原理解析到架构设计借鉴
静下心来,细细品味经典的开源作品 。提升我们的「内功」,具体来说就是学习大牛们如何设计、架构一个中间件系统,并且让这些经验为我所用。
码哥字节
2020/07/07
2.9K0
Tomcat 架构原理解析到架构设计借鉴
21张图解析Tomcat运行原理与架构全貌
早年间,精通CRUD的小菜同学在Tomcat上通过继承HttpServlet进行CRUD
菜菜的后端私房菜
2024/08/05
5591
Tomcat相关面试题,看这篇就够了!
Tomcat相关的面试题出场的几率并不高,正式因为如此,很多人忽略了对Tomcat相关技能的掌握,下面这一篇文章整理了Tomcat相关的系统架构,介绍了Server、Service、Connector、Container之间的关系,各个模块的功能,可以说把这几个掌握住了,Tomcat相关的面试题你就不会有任何问题了!另外,在面试的时候你还要有意识无意识的往Tomcat这个地方引,就比如说常见的Spring MVC的执行流程,一个URL的完整调用链路,这些相关的题目你是可以再往Tomcat处理请求的这个过程去说的!掌握注Tomcat这些技能了,面试官一定会佩服你的!
java思维导图
2019/05/08
6240
Tomcat相关面试题,看这篇就够了!
tomcat整体架构
上面简单列了tomcat的模块结构,下面结合配置文件更加具体一点来分析,当然更多是集中在Connector和Container两个组件上,毕竟这是两个核心组件,后续的内容也会更多集中在这两个组件上面
东营浪人
2019/09/05
6440
tomcat整体架构
Tomcat笔记:Tomcat的执行流程解析
Bootstrap的main方法先new了一个自己的对象(Bootstrap),然后用该对象主要执行了四个方法:
朝雨忆轻尘
2019/06/19
9980
Tomcat笔记:Tomcat的执行流程解析
Tomcat面试题
Tomcat 服务器Apache软件基金会项目中的一个核心项目,是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。
挨踢小子部落阁
2023/03/15
3230
Tomcat面试题
你会用Tomcat,但不一定懂
Tomcat是我们最常用的Web容器,但是很少有人知晓其工作原理。下面就总结一下极客时间的课程《深入拆解 Tomcat & Jetty》,本文仅总结部分知识,有兴趣可以找相应的课程学习一番。
用户3467126
2022/09/01
3750
你会用Tomcat,但不一定懂
四张图带你了解Tomcat系统架构
俗话说,站在巨人的肩膀上看世界,一般学习的时候也是先总览一下整体,然后逐个部分个个击破,最后形成思路,了解具体细节,Tomcat的结构很复杂,但是 Tomcat 非常的模块化,找到了 Tomcat最核心的模块,问题才可以游刃而解,了解了Tomcat的整体架构对以后深入了解Tomcat来说至关重要!
Java后端技术
2018/08/09
3.2K0
四张图带你了解Tomcat系统架构
Tomcat源码解析(八):一个请求的执行流程(附Tomcat整体总结)
Tomcat源码解析(四):StandardServer和StandardService
冬天vs不冷
2025/01/21
1880
Tomcat源码解析(八):一个请求的执行流程(附Tomcat整体总结)
框架源码私享笔记(01)Tomcat核心架构功能 | 配置详解
Tomcat是Apache基金会基于Java开发开源的web容器。Tomcat应用服务器,又称“汤姆猫”,它开源、轻量、易于集成、社区背书支持的特性,深受Java开发者偏爱。尤其是Tomcat专注于处理servlet和jsp的出色能力深得研发者信赖(当然目前jsp用的企业已经很少,瓶颈在于互联网高并发时代背景下,jsp的响应和吞吐量很难满足需求)。
拉丁解牛说技术
2025/03/03
2260
框架源码私享笔记(01)Tomcat核心架构功能 | 配置详解
Tomcat卷一 ----架构和初始化源码分析
1) Tomcat 最初由Sun公司的软件架构师 James Duncan Davidson 开发,名称为 “JavaWebServer”。
大忽悠爱学习
2022/05/09
9500
Tomcat卷一 ----架构和初始化源码分析
Tomcat卷二---请求流程源码分析
设计了这么多层次的容器,Tomcat是怎么确定每一个请求应该由哪个Wrapper容器里的 Servlet来处理的呢?
大忽悠爱学习
2022/05/09
7750
Tomcat卷二---请求流程源码分析
Tomcat面试题(2020最新版)
文章目录 Tomcat是什么? Tomcat的缺省端口是多少,怎么修改 tomcat 有哪几种Connector 运行模式(优化)? Tomcat有几种部署方式? tomcat容器是如何创建servlet类实例?用到了什么原理? Tomcat工作模式 Tomcat顶层架构 Tomcat顶层架构小结 Connector和Container的微妙关系 Container架构分析 Container如何处理请求的
Java架构师必看
2020/04/10
1.1K0
Tomcat系统架构简介
从架构图可以看出,顶层组件Server代表一个Tomcat Server实例,一个Server中有一个或者多个Service,每个Service有多个Connector,以及一个Engine。
mazhen
2023/11/24
4080
Tomcat系统架构简介
相关推荐
Tomcat系统架构浅析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验