Skip to content

echojfree/mini-tomcat

Repository files navigation

Mini Tomcat - 面向面试的手写 Tomcat

项目简介

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)

快速开始

1. 编译项目

git clone https://github.com/yourusername/mini-tomcat.git
cd mini-tomcat
mvn clean install

2. 启动服务器

BIO 模式 (默认端口 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)

3. 测试访问

访问示例 Servlet:

curl http://localhost:8080/hello
curl http://localhost:8080/hello?name=World

项目结构

mini-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           # 线程池实现

核心知识点

1. 网络编程与 I/O 模型

BIO (Blocking I/O)

  • 每个连接一个线程
  • 适合连接数少的场景
  • 实现简单,易于理解

NIO (Non-blocking I/O)

  • Selector 多路复用
  • 单线程管理多个连接
  • 适合高并发场景
  • Buffer 零拷贝优化

面试重点:

  • BioEndpoint.java: BIO 实现
  • NioEndpoint.java: NIO + Selector 实现
  • 性能对比和使用场景

2. 多线程与线程池

线程池设计

ThreadPoolExecutor(
    corePoolSize,     // 核心线程数
    maximumPoolSize,  // 最大线程数
    keepAliveTime,    // 空闲线程存活时间
    workQueue,        // 任务队列
    threadFactory,    // 线程工厂
    handler           // 拒绝策略
)

面试重点:

  • 线程池参数调优
  • 拒绝策略选择
  • 线程安全保证

3. Servlet 容器

容器层次架构:

Engine (引擎)
  └── Host (虚拟主机)
       └── Context (Web应用)
            └── Wrapper (Servlet包装器)

Servlet 生命周期:

  1. init() - 初始化
  2. service() - 处理请求
  3. destroy() - 销毁

面试重点:

  • Servlet 单例模式
  • 线程安全问题
  • 请求路由机制

4. Filter 和 Listener

Filter 链模式:

Request → Filter1 → Filter2 → Servlet → Filter2 → Filter1 → Response

Listener 事件监听:

  • ServletContextListener - 应用启动/销毁
  • SessionListener - Session 创建/销毁
  • RequestListener - 请求开始/结束

面试重点:

  • 责任链模式应用
  • 观察者模式应用
  • Filter 执行顺序

5. Session 管理

Session 实现机制:

  • JSESSIONID Cookie
  • ConcurrentHashMap 存储
  • 定时清理过期 Session
  • Session 持久化

面试重点:

  • Session vs Cookie
  • 分布式 Session 方案
  • Session 劫持防御

6. 类加载机制

自定义 ClassLoader:

Bootstrap ClassLoader
    ↓
Extension ClassLoader
    ↓
Application ClassLoader
    ↓
WebappClassLoader (自定义)

双亲委派机制:

  • 类隔离
  • 避免重复加载
  • 安全性保证

面试重点:

  • 双亲委派模型
  • 类加载顺序
  • 热部署实现原理

7. 配置解析

XML 解析 (DOM):

  • web.xml 配置文件解析
  • Servlet 映射关系
  • Filter 配置

注解扫描:

  • @WebServlet
  • @WebFilter
  • @WebListener
  • 反射机制应用

面试重点:

  • DOM vs SAX 对比
  • 反射性能优化
  • 注解处理流程

8. 容器架构

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.java vs NioEndpoint.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 - 面向面试的学习项目

About

手写tomcat掌握其实现原理

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages