Mini Tomcat 是一个简化版的 Tomcat 实现,涵盖 Java 后端面试所需的所有核心知识点。本项目通过手写实现帮助理解原理,而非死记硬背八股文。
核心特性:
- ✅ BIO/NIO 双模式网络 I/O
- ✅ 完整的 Servlet 容器实现
- ✅ 线程池管理和优化
- ✅ Filter 和 Listener 机制
- ✅ Session 管理
- ✅ 自定义 ClassLoader 和类隔离
- ✅ XML 配置解析和注解扫描
- ✅ 四级容器架构 (Engine → Host → Context → Wrapper)
- ✅ Pipeline/Valve 请求处理链
- 语言: Java 8+
- 构建工具: Maven 3.6+
- 日志框架: SLF4J + Logback
- 测试框架: JUnit 5
- XML 解析: JAXP (DOM)
git clone https://github.com/yourusername/mini-tomcat.git
cd mini-tomcat
mvn clean installBIO 模式 (默认端口 8080):
cd mini-tomcat-core
mvn exec:java -Dexec.mainClass="com.minitomcat.Bootstrap"NIO 模式 (自定义端口 9090):
mvn exec:java -Dexec.mainClass="com.minitomcat.Bootstrap" -Dexec.args="9090 webapps nio"命令行参数格式:
java -jar mini-tomcat.jar [port] [webroot] [io-mode]
port: 端口号 (默认: 8080)webroot: Web应用根目录 (默认: webapps)io-mode: I/O模式 bio/nio (默认: nio)
访问示例 Servlet:
curl http://localhost:8080/hello
curl http://localhost:8080/hello?name=Worldmini-tomcat/
├── mini-tomcat-servlet/ # Servlet API 接口定义
│ ├── Servlet # Servlet 核心接口
│ ├── ServletRequest # 请求封装
│ ├── ServletResponse # 响应封装
│ ├── Filter # Filter 接口
│ └── Listener # 监听器接口
│
├── mini-tomcat-core/ # 核心实现模块
│ ├── connector/ # 连接器 (BIO/NIO)
│ │ ├── BioEndpoint # BIO 实现
│ │ ├── NioEndpoint # NIO 实现
│ │ └── HttpProcessor # HTTP 协议处理
│ │
│ ├── container/ # 容器层
│ │ ├── Engine # 引擎容器 (顶层)
│ │ ├── Host # 虚拟主机容器
│ │ ├── Context # Web应用容器
│ │ ├── Wrapper # Servlet包装器
│ │ ├── Pipeline # 请求处理管道
│ │ ├── Valve # 处理阀门
│ │ └── Lifecycle # 生命周期管理
│ │
│ ├── request/ # 请求处理
│ │ ├── Request # HTTP请求实现
│ │ └── Response # HTTP响应实现
│ │
│ └── Bootstrap # 启动入口
│
├── mini-tomcat-session/ # Session 管理
│ ├── SessionManager # Session 管理器
│ └── StandardSession # Session 实现
│
├── mini-tomcat-loader/ # 类加载器
│ └── WebappClassLoader # Web应用类加载器
│
├── mini-tomcat-config/ # 配置解析
│ ├── WebXmlParser # web.xml 解析器
│ └── AnnotationScanner # 注解扫描器
│
└── mini-tomcat-util/ # 工具类
└── ThreadPool # 线程池实现
BIO (Blocking I/O)
- 每个连接一个线程
- 适合连接数少的场景
- 实现简单,易于理解
NIO (Non-blocking I/O)
- Selector 多路复用
- 单线程管理多个连接
- 适合高并发场景
- Buffer 零拷贝优化
面试重点:
BioEndpoint.java: BIO 实现NioEndpoint.java: NIO + Selector 实现- 性能对比和使用场景
线程池设计
ThreadPoolExecutor(
corePoolSize, // 核心线程数
maximumPoolSize, // 最大线程数
keepAliveTime, // 空闲线程存活时间
workQueue, // 任务队列
threadFactory, // 线程工厂
handler // 拒绝策略
)面试重点:
- 线程池参数调优
- 拒绝策略选择
- 线程安全保证
容器层次架构:
Engine (引擎)
└── Host (虚拟主机)
└── Context (Web应用)
└── Wrapper (Servlet包装器)
Servlet 生命周期:
init()- 初始化service()- 处理请求destroy()- 销毁
面试重点:
- Servlet 单例模式
- 线程安全问题
- 请求路由机制
Filter 链模式:
Request → Filter1 → Filter2 → Servlet → Filter2 → Filter1 → Response
Listener 事件监听:
- ServletContextListener - 应用启动/销毁
- SessionListener - Session 创建/销毁
- RequestListener - 请求开始/结束
面试重点:
- 责任链模式应用
- 观察者模式应用
- Filter 执行顺序
Session 实现机制:
- JSESSIONID Cookie
- ConcurrentHashMap 存储
- 定时清理过期 Session
- Session 持久化
面试重点:
- Session vs Cookie
- 分布式 Session 方案
- Session 劫持防御
自定义 ClassLoader:
Bootstrap ClassLoader
↓
Extension ClassLoader
↓
Application ClassLoader
↓
WebappClassLoader (自定义)
双亲委派机制:
- 类隔离
- 避免重复加载
- 安全性保证
面试重点:
- 双亲委派模型
- 类加载顺序
- 热部署实现原理
XML 解析 (DOM):
- web.xml 配置文件解析
- Servlet 映射关系
- Filter 配置
注解扫描:
- @WebServlet
- @WebFilter
- @WebListener
- 反射机制应用
面试重点:
- DOM vs SAX 对比
- 反射性能优化
- 注解处理流程
Lifecycle 生命周期:
NEW → INITIALIZING → INITIALIZED → STARTING → STARTED
↓
DESTROYED ← DESTROYING ← STOPPED ← STOPPING
Pipeline/Valve 模式:
- 责任链模式
- 灵活的请求处理
- 动态添加/删除处理器
面试重点:
- 模板方法模式
- 状态机设计
- 组合模式应用
| 设计模式 | 应用场景 | 代码位置 |
|---|---|---|
| 单例模式 | ServletContainer | ServletContainer.java |
| 工厂模式 | Servlet 创建 | ServletWrapper.java |
| 责任链模式 | Filter 链, Pipeline/Valve | FilterChainImpl.java, Pipeline.java |
| 观察者模式 | Listener 机制 | ListenerManager.java |
| 模板方法模式 | Lifecycle 管理 | ContainerBase.java |
| 组合模式 | 容器层次结构 | Container.java |
| 策略模式 | BIO/NIO 切换 | Bootstrap.java |
| 代理模式 | Servlet 调用 | ServletWrapper.java |
查看开发历史和每个阶段的实现:
git log --oneline --graph
git tag查看特定阶段:
git checkout v1.0-phase1 # Phase 1: BIO + 静态资源
git checkout v1.0-phase2 # Phase 2: Servlet 容器
git checkout v1.0-phase3 # Phase 3: 线程池
git checkout v1.0-phase4 # Phase 4: NIO 模式
git checkout v1.0-phase5 # Phase 5: Session 管理
git checkout v1.0-phase6 # Phase 6: ClassLoader
git checkout v1.0-phase7 # Phase 7: Filter/Listener
git checkout phase-8-config-parsing # Phase 8: 配置解析
git checkout phase-9-container-architecture # Phase 9: 容器架构- Phase 1: 基础 HTTP 服务器 (BIO + 静态资源)
- Phase 2: Servlet 容器
- Phase 3: 多线程与线程池
- Phase 4: NIO 支持
- Phase 5: Session 管理
- Phase 6: 类加载与热部署
- Phase 7: Filter 与 Listener
- Phase 8: 配置解析 (XML + 注解)
- Phase 9: 容器架构完善 (Engine/Host/Context/Wrapper)
- Phase 10: 优化与测试 (进行中)
1. Tomcat 的整体架构是怎样的?
- 参考:
docs/ARCHITECTURE.md - 代码: Container 层次结构
2. BIO 和 NIO 的区别?什么场景用 NIO?
- 参考:
BioEndpoint.javavsNioEndpoint.java - NIO 适合高并发、连接数多的场景
3. Servlet 的生命周期?线程安全吗?
- init() → service() → destroy()
- Servlet 是单例,需要注意线程安全
4. Filter 的执行顺序?如何控制?
- 按照 web.xml 中配置顺序
- 责任链模式实现
5. Session 是如何实现的?
- JSESSIONID Cookie
- ConcurrentHashMap 存储
- 定时清理机制
6. 类加载机制?双亲委派模型?
- Bootstrap → Extension → Application → Webapp
- 保证类唯一性和安全性
7. Tomcat 如何实现热部署?
- 自定义 ClassLoader
- 监听文件变化
- 重新加载类
MIT License
Mini Tomcat - 面向面试的学习项目