源码环境配置
- 导入源码包
- 编辑运行配置,设置入口类以及项目构建目录(build目录)
- 根据本地情况修改项目JDK版本,与字符编码
1.Tomcat架构演变历史
1.1 单server
Server 负责监听socket,解析请求,完成相关任务,返回处理结果
- Start():启动服务器,打开socket连接,监听服务端口,接受客户端请求、处理、返回响应
- Stop():关闭服务器,释放资源
- 缺点:请求监听和请求处理放一起扩展性很差(协议的切换 tomcat独立部署使用HTTP协议,与Apache集成时使用AJP协议)
1.2 网络协议与请求处理分离
将Server拆分成两部分:Connector组件与Container组件
- Connector
- 开启Socket并监听客户端请求,返回响应数据;
- 一个Connector对应一个端口
- Container:负责具体的请求处理
1.3 引入service 中间层
service 负责管理Connector与Container并建立映射关系
- 一个Server可以包含多个Service,每一个Service都是独立的,他们共享一个JVM以及系统类库。
- 一个Service负责维护多个Connector和一个Container
- 这样来自Connector的请求只能有它所属的Service维护的Container处理;当需要使用多个端口时,就要配置多个service
- 在这里Container是一个通用的概念,为了明确功能,并与Tomcat中的组件名称相同,可以将Container命名为Engineer
- Tomcat默认会启动一个名为Catalina的Service
1.4 通过任务拆分实现Container
将 Container 分成了四部分:Engine,Host,Context,Wrapper,并且通过责任链模式串联
- Engine:没有父容器,一个 Engine代表一个完整的 Servlet 引擎,它接收来自Connector的请求,并决定传给哪个Host来处理,Host处理完请求后,将结果返回给Engine,Engine再将结果返回给Connector。
- Host:表示一个虚拟主机,即一个Tomcat可以拥有多个域名;这么设计符合tomcat初期,服务器资源紧张,一台服务器需要部署多个不同域名的服务;一个Engine可以有多个Host
- Context:表示一个web应用,即webapp下的应用;一个Host可以有多个Context
- Wrapper:表示一个servlet,用来具体处理相应请求;一个Context可以有多个Wrapper
1.5 组件统一管理:给所有组件都加上生命周期(LifeCycle)
- 生命周期包括包括
- 生命周期状态:BEFORE_INIT_EVENT,AFTER_INIT_EVENT,START_EVENT等
- 生命周期方法:init(), start(), stop, getState()等
- 每个组件都有生命周期
- Connector:直接实现LifeCycle接口
- Container:Container本身就是接口,它实现了LifeCycle,所以它的具体实现类们就有了生命周期
2.Tomcat总体架构图解
2.1 Connector
- Endpoint用于处理底层Socket 的网络连接,即实现TCP/IP协议
- Processor 用于将Endpoint 接收到的Socket 封装成Request,即实现HTTP协议
- Adapter 用于将封装好的Request 交给Container 进行具体处理。
2.2 Container
文末附上一篇参考链接