Tomcat
总体架构
Coyote 连接器组件
-
对外交流
-
支持的协议
-
应用层
- HTTP/1.1
- HTTP/2
- AJP
-
传输层
-
NIO
- 非阻塞 I/O
-
NIO2
- 异步 I/O
-
APR
- Apache 可移植运行库
-
-
-
组件
-
Endpoint
- 接收和发送 Socket
-
Processor
- 生成 Tomcat 原生 Request
-
ProtocolHandler
- EndPoint + Processor
-
Adapter
- 生成 ServletRequest
-
Catalina 容器组件
-
内部处理具体业务
-
Tomcat 的核心
-
一个 Server 实例
-
多个 Service 实例
-
多个 Connector 实例
-
一个 Container 实例
-
Engine
- 整个 Catalina 的 Servlet 引擎
-
Host
- 一个虚拟主机/站点
-
Context
- 一个 Web 应用程序
-
Wrapper
- 一个 Servlet
-
-
-
核心配置
配置文件
- conf/server.xml
主要标签结构
-
Server 根标签
-
Listener
-
GlobalNamingResources
-
Service 标签
-
Listener
- 为 Service 添加生命周期监听器
-
Executor
- 配置 Service 共享线程池
-
Connector 标签
- port
- protocal
- executor
-
Engine 标签
-
Host 标签
-
Context 标签
- docBase
- path
-
-
-
-
简单实现
原理
-
提供服务,接收请求(Socket 通信)
-
将请求信息封装成 Request/Response 对象
-
处理客户端请求的资源
- 静态资源(Html)
- 动态资源(Servlet)
-
将资源返回给客户端
需求
-
1.0
- 浏览器请求 localhost:8080 页面,返回字符串 Hello Minicat
-
2.0
- 封装 Request 和 Response 对象,返回 HTML 静态资源文件
-
3.0
-
可以请求动态资源(Servlet)
-
多线程实现
- 线程池
-
-
性能优化
Https 支持
类加载机制
JVM 的类加载机制
-
类加载器体系
-
引导类加载器
- c++ 编写,加载 java 核心库 java.*
-
扩展类加载器
- java 编写,加载扩展库 JAVA_HOME/lib/ext目录下的 jar 文件,如 classpath 中的 jre
-
系统类加载器
- 默认的类加载器,搜索环境变量 classpath 中指明的路径
-
双亲委派机制
Tomcat 的类加载机制
源码剖析
启动流程
- 从启动脚本出发
- 逐级初始化
- 逐级启动
请求处理流程
- Mapper 组件完成 url 和 Host、Context 和Wrapper 等容器的映射
- Endpoint 处理 socket 请求,调用 Processor 处理
- Processor 解析处理 socket 请求,封装成 request
- Processor 调用 CoyoteAdapter 进行路径映射,并将 Request 对象转换成 ServletRequest
- CoyoteAdapter 调用 Engine 并匹配到 Host
- Engine 调用 Host 并匹配到 Context
- Host 调用 Context 并匹配到 Wrapper
- Context 调用 Wrapper 得到 Servlet 并构造 FilterChain
- FilterChain 执行各个 Filter 并执行 Servlet
Mapper 组件体系结构
-
MapElement 基类
- 一个 MappedHost
- 多个 MappedContext
- 多个 MappedWrapper