那天的面试现场,我脑袋突然空白
上周我去参加一家金融科技公司的 Java 高级开发面试。一切都挺顺利,Redis、JVM、Spring 全答得顺风顺水。
直到面试官轻轻一笑,说了一句:
“那我们来聊聊 Tomcat 吧,说说你对它的顶层架构理解?”
当场我脑子“嗡”的一声:
——Tomcat 架构?我只记得 Catalina、Coyote、Connector……那它们到底谁是谁爹?!
我硬着头皮扯了几句,然后在回家路上一路反思:
Tomcat 的架构我天天在用,怎么就讲不明白?
于是我花了一整个周末,啃源码、画图、看官方架构图。今天就用我这几天的“血泪笔记”,帮你彻底搞懂 Tomcat 的顶层架构。(看完这篇,保你再也不会在面试时“嗡”地一声了!)
先来一个故事:Tomcat 就像一个餐厅
我们先别管那些 “Catalina”、“Coyote”、“Container” 这些名词。先想象这样一个场景:
一家高档餐厅,门口有接待员(Connector),厨房里有主厨团队(Container),后台还有个大管家负责统筹调度(Catalina)。
Tomcat 就是这样一个餐厅系统。
- Connector(连接器) :就像餐厅门口的接待员,负责接客(接收请求)和送菜(返回响应)。
- Container(容器) :就是后厨,真正“烹饪”请求的地方。它里面有四层厨房:Engine、Host、Context、Wrapper,每层分工明确。
- Catalina(核心引擎) :就是餐厅的大管家。它负责整个餐厅的启动、关闭、协调各部门运作。
当你启动 Tomcat 时,其实就是 Catalina 启动了一个 Server,Server 包含多个 Service,每个 Service 下面又有 Connector + Container 的搭配。
Tomcat 架构的“家谱图”
我们来看看真正的 Tomcat 架构“家族图”:
是不是突然清晰了?咱们把每个角色的职责再讲清楚~
Server:Tomcat 的“总指挥”
Tomcat 启动时,最顶层的对象叫 Server。
- 它代表整个 Tomcat 实例(就像一个完整的餐厅系统)。
- Server 负责管理所有的 Service。
- 当你执行 shutdown 命令时,其实就是让 Server 关闭所有 Service,优雅停机。
面试回答示例:
Tomcat 的最顶层组件是 Server,它代表整个服务器实例,用于管理多个 Service 的生命周期。
Service:连接器与容器的桥梁
Service 是连接前台和后厨的桥梁。
- 每个 Service 由 一个或多个 Connector 和 一个 Container 组成。
- Connector 负责接收请求,Container 负责处理。
- 这样可以支持多个协议:例如 HTTP、AJP(Tomcat 用于和 Apache 通信的协议)。
一句话记忆:
Service 是“前台+后厨”的一套组合,Connector 进菜,Container 做菜。
Connector:请求的“接待员”
Connector 也叫 Coyote(郊狼),是 Tomcat 的通信模块。
它的核心职责有两个:
- 监听端口、接收请求
- 把请求交给 Container 处理,并把响应写回客户端
Tomcat 默认使用两个常见的 Connector:
- HTTP/1.1 Connector:处理浏览器直接访问的 HTTP 请求
- AJP Connector:用于和 Apache、Nginx 等前端服务器集
当请求到达 Connector 后,它不会自己去执行 Servlet,而是把请求交给 “后厨” Container。
比喻记忆:
Connector 就像服务员——点单、传菜、送菜。
Container:真正处理请求的“后厨”
Container 是 Tomcat 中最重要的部分之一。它定义了 从接收请求到执行 Servlet 的全过程。
它内部有四层结构:
一层层关系就像这样:
Engine(大厨房)→ Host(每个餐厅分店)→ Context(每个菜系)→ Wrapper(具体厨师)
当请求从 Connector 传过来时,它会一层层往下传递,直到找到对应的 Servlet 执行。
Catalina:Tomcat 的灵魂人物
前面我们说 Catalina 是“大管家”,其实它是 Tomcat 的核心引擎。
Catalina 的主要职责包括:
- 解析配置文件 server.xml
- 创建并启动 Server、Service、Connector、Container
- 管理 Tomcat 的生命周期(启动、暂停、关闭)
- 加载和管理 Web 应用
换句话说,Catalina 是 Tomcat 架构的灵魂。没有它,整个系统都无法启动。
Coyote:Connector 的内核
Coyote 是 Tomcat 网络通信的实现模块。它是 Connector 的底层实现,支持多种协议(HTTP/1.1、HTTP/2、AJP、WebSocket 等)。
Coyote 会把底层 Socket 流包装成一个标准的 Request/Response 对象,然后交给上层的 Catalina 去处理。
让我们跟着一个请求走一遍
假设你在浏览器输入:
这个请求在 Tomcat 中的流转路径如下:
- Connector 接收请求: Coyote HTTP/1.1 Connector 在 8080 端口监听到请求。
- 转换成 Request/Response 对象: Coyote 把底层 Socket 封装成标准请求对象。
- 交给 Engine 处理: Catalina 的 Engine 接收到请求。
- Host 匹配域名: 找到对应的虚拟主机(如 localhost)。
- Context 匹配应用路径: 定位到 /demo 这个 web 应用。
- Wrapper 匹配 Servlet: 找到 /hello 对应的 Servlet 并执行。
- Servlet 执行业务逻辑,生成响应: 把结果返回到 Response。
- Connector 把响应发送回浏览器
一个完整的请求-响应流程就这样走完了。是不是瞬间清晰了?
Tomcat 架构总结口诀
面试前背熟这几句话:
Catalina 掌管全局,Server 服务整合。
Service 连接前后,Connector 接收传达。
Container 层层递进,Engine 主控中枢。
Host 管站点,Context 管应用,Wrapper 管 Servlet。
Coyote 传输协议,Catalina 执行核心。
面试官可能追问的问题(附答案)
Q1:Tomcat 支持多协议是怎么做到的?
通过在一个 Service 中配置多个 Connector(例如 HTTP、AJP),它们共用同一个 Container。
Q2:Tomcat 是如何找到对应 Servlet 的?
通过 Container 层层匹配:Engine → Host → Context → Wrapper,最终根据 URL pattern 找到对应 Servlet。
Q3:Tomcat 中的 Pipeline 和 Valve 是干嘛的?
它是责任链模式实现的请求处理管道,每一层 Container 都有自己的 Valve(类似拦截器),可实现日志、鉴权等功能。
Q4:Catalina 与 Coyote 的关系?
Coyote 是通信层(处理协议、IO),Catalina 是业务层(处理 Servlet 调度)。
写在最后:理解架构,才能真正“驯服”Tomcat
当我重新看完 Tomcat 架构图那一刻,我突然想明白一件事:
Tomcat 从来不只是一个 Servlet 容器,它是一套精妙的系统工程。 每一层都有清晰的职责,每个模块都能独立扩展、替换。
这种解耦的设计思想,才是 Java 架构师最该学的部分。所以,如果下一次面试官再问你——
“能讲讲 Tomcat 的顶层架构吗?”
请你微笑着说:
“Tomcat 的核心分为 Catalina(容器引擎)和 Coyote(通信组件)。顶层是 Server,内部由多个 Service 组成,Service 由 Connector + Container 构成。Container 再分为 Engine、Host、Context、Wrapper 四层结构,共同实现请求到 Servlet 执行的全过程。”
这一刻,轮到面试官“嗡”的一声了!
END
我是小米,一个喜欢分享技术的31岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!