核心组件和流程

  • Connector连接器-对外交流
    • ProtocolHandler:封装通讯和I/O模型(EndPoint底层Socket通讯+Processor应用层协议解析)
    • Adapter:调用容器,生成ServletRequest和接受ServletResponse
  • Container容器-对内处理
    • 继承LifeCycle生命周期(一键式启停):init、start、stop、destroy
    • Mapper组件负责路由

Tomcat - 图1

设计模式

  • 核心原则:高内聚低耦合,找到子模块的变化点和不变点
  • 组合模式:管理容器
  • 观察者模式:发布启动事件达到解耦,满足开闭原则
  • 骨架抽象类/模板方法:满足变与不变,代码复用,灵活扩展
  • 责任链(Pipeline-Valve):处理请求,记录日志等,满足开闭原则

    打破双亲委派

  • 目的:隔离Web应用

Tomcat - 图2

Tomcat概念

Tomcat = http服务器(对外通讯包装为ServletRequest/ServletResponse)+servlet容器(定位+加载+调用 Servlet业务逻辑)
Servlet规范=Servlet容器+Servlet接口(doGet/doPost)
Servlet规范扩展点:Filter/Listener(弱化)
重要配置:server.xml(配置servlet)/catalina.xml(配置类加载器)/context.xml/tomcat-users.xml

体系架构

image.png
四种I/O模型:BIO/NIO/AIO(NIO2)/APR
三种应用层协议:HTTP/1.1/ AJP /HTTP/2

connector连接器

  • EndPoint:网络通信【字节流】-模板方法
  • Processor:序列化反序列化进行协议解析【Tomcat Request/Response】
  • Adapter:对象转化【ServletResponse/ServletRequest】-适配器

image.png
image.png
image.png

container容器

构造:组合模式
请求:责任链模式(管道添加单元——Pipeline、Valve,next;Filter链——数组pos递归去调用)
image.png
image.png

生命周期

创建、初始化、启动、停止、销毁
事件——观察者模式
LifeCycle实现一键式启停——组合模式
初始化自上而下
image.png
单一职责(接口分离原则)
image.png

启动过程

startup.sh —> 启动类(Bootstrap —> Catalina)—> 组件(Server —> Service)—> Connector/Engine
两阶段依次执行:load(解析、反射构建、初始化)、start

外置Tomcat带动Spring MVC启动是通过SPI加载后调用WebApplicationInitializer#onStart启动IoC容器

Spring内置Tomcat,AbstractApplicationContext#refresh#onRefresh

NIO线程模型

image.png
Tomcat自己实现了线程池,无限队列,自己实现了拒绝策略

ContainerBackgroundProcessorMonitor 后台线程监听器,定时任务

AIO

Tomcat Proactor模型实现AIO,不用线程池
image.png

调优

JConsole JMXRemote
并发线程调优
image.png
理论算法:并发线程数=(1+平均等待时间/平均工作时间)*CPU核心数;实际最好用压测