大家好,我是小米,一个在代码里泡了九年的程序员。前几天去面试一家互联网公司,面试官笑眯眯地问我:“你了解 Tomcat 的 Container 架构吗?”
我心想,这问题挺常见的,属于那种“问不深就考概念、问深了就劝退”的经典类型。于是我开始讲——没想到,这一讲,就聊了快半个小时。
今天就把我当时的回答完整复盘给你听,保证听完后,你不再怕面试官问这个问题。
1.故事开头:Tomcat 是一座“服务城市”
我特别喜欢把 Tomcat 比作一座城市。
在这座“城市”里,有各种基础设施:
- Connector(连接器):它就像城市的“交通入口”,负责接待外来的请求(HTTP 或 AJP)。
- Container(容器):它是城市的“核心区域”,负责处理这些请求、执行 Servlet、返回结果。
可以这么说,Connector 接收请求,Container 处理请求。
而 Container 的内部,其实是一个层层嵌套、各司其职的“小宇宙”。
如果把它比作一座行政体系,那它大概长这样:
Engine(发动机) → Host(主机) → Context(上下文) → Wrapper(包装器)
听起来有点抽象?别急,我们慢慢拆。
2.Engine:一切请求的总管
Engine 是整个 Container 体系的顶层容器,就像一座城市的“市政府”。
当 Connector 把请求交给 Engine 时,Engine 要决定:
- 这个请求该交给哪台主机(Host)?
- 用哪个 Web 应用(Context)去处理?
- 最后哪个具体的 Servlet(Wrapper)来执行?
Tomcat 默认只有一个 Engine,名字叫Catalina(这名字是不是很熟?Tomcat 的主类就叫这个)。
Engine 内部会注册多个 Host,比如:
- localhost
- myapp.company.com
- test.company.com
Engine 根据请求头里的 Host 值去匹配对应的 Host。
换句话说,Engine 是整个容器链的入口,负责路由请求到正确的主机。
3.Host:承载多个 Web 应用的主机
每个 Host 代表一台虚拟主机,也就是一个域名或主机名。
比如我们访问: