当前位置: 首页 > news >正文

tomcat组件架构设计

目录

1 Connector高内聚低耦合设计

1.1 ProtocolHandler组件

1.2 Endpoint组件

1.3 Processor组件

1.4 Adapter组件

2 Container父子容器组合模式设计

3 Pipeline-Value责任链模式设计

4 tomcat组件生命周期设计


1 Connector高内聚低耦合设计

优秀模块设计应该考虑高内聚低耦合设计

  • 高内聚相关度比较功能可能集中不要分散
  • 低耦合两个相关模块尽可能减少依赖的部分和降低依赖程序不要两个模块产生强依赖

tomcat连接器需要实现功能

  • 监听网络端口
  • 接受网络连接请求
  • 根据具体应用协议HTTP/AJP)解析字节流生成同一Tomcat Request对象
  • tomcat Request对象转换标准ServletRequest
  • 调用Servlet容器得到ServletResponse
  • ServletResponse转换Tomcat Response对象
  • tomcat Response转成网络字节流
  • 响应字节流客户端

分析如上功能可知连接器需要3高内聚功能

  • 网络通信
  • 应用协议解析
  • Tomcat Request/ResponseServlet Request/Response转换

因此tomcat设计3组件负责实现上述3功能

  • EndPoint负责处理连接读取字节Processor
  • Processor解析字节生成tomcatRequestAdapter
  • Adaptertomcat request转成ServletRequest对象容器

组件之间通过抽象接口交互各个组件隔离有助于增加复用性降低系统耦合度

1.1 ProtocolHandler组件
  • 由于I/O模型应用协议可以自由组合比如NIO+HTTP或者NIO2+AJP
  • tomcat设计者网络通信应用层协议解析放在一起考虑设计了一个ProtocolHandler接口封装两种变化
  • 各种协议通信模型的组合有相对应具体实现比如Http11NioProtocolAjpNioProtocol
  • tomcat设计了一些抽象封装不变的逻辑比如AbstractProtocol实现ProtocolHandler接口然后每一种应用协议自己抽象基类比如AbstractAjpProtocolAbstractHttp11Protocol具体协议实现扩展了协议抽象基类

  • 连接器使用ProtocolHandler来处理网络连接应用层协议
  • 连接器使用ProtocolHandler接口封装通信信息I/O模型差异
  • ProtocolHandler内部分为EndpointProcessor模块
  • Endpoint负责底层Socket通信
  • Processor负责应用协议解析
  • 连接器通过适配器Adapter调用容器

1.2 Endpoint组件
  • Endpoint通信端点监听通信接口具体Socket接受发送处理
  • Endpoint传输层抽象对应公共抽象类AbstractEndpoint具体子类对应具体NIOAIOAPRI/O模型

  • Endpoint实现中有两个重要的组件AcceptorSocketProcessor
  • Acceptor用于监听Socket连接请求
  • SocketProcessor用于处理接收Socket请求即Socket的读事件)
  • SocketProcessor提交线程池执行sever.xml配置Executor
  • SocketProcessor处理socket请求最终提交协议处理组件Processor

1.3 Processor组件
  • Processor用来实现HTTP/AJP协议
  • Processor接收来自EndpointSocket字节流解析TomcatRequestResponse对象
  • Processor将请求通过Adapter提交到容器处理

  • Processor组件解析socket数据生成TomcatRequest对象调用Adapterservice方法
1.4 Adapter组件
  • 由于协议不同客户端发送过来的请求信息也不相同
  • Tomcat自定了自己Request存放这些信息
  • Processor负责解析请求生成Tomcat Request对象
  • CoyoteAdapter负责Tomcat Request对象转为标准ServletRequest然后调用Engine容器Pipeline

2 Container父子容器组合模式设计
  • tomcat通过组合设计模式管理EngineHostContextWrapper容器
  • EngineHostContextWrapper继承了Container顶级接口
  • Container接口具备管理容器子容器列表能力

3 Pipeline-Value责任模式设计

  • Adapter执行service方法拿到Engine容器Pipeline的第一个Valve对象并执行invoke方法
  • 然后通过责任链方式调用Pipeline所有Valve对象
  • Engine容器最后一个Valve对象StandardEngineValve拿到Request对象Host然后调用Host容器Pipeline第一个Valve对象后面类推

Valve接口

Pipeline接口

  • Pipeline维护了firstValve和basicValve对象
  • 然后Valve存在next属性指向下一个Valve对象
  • 通过以上方式Pipeline间接维护所有Valve对象
4 tomcat组件生命周期设计
  • tomcat组件生命周期设计主要包含方面
  • 其一初始化启动停止销毁方法回调
  • 第二这些生命周期方法执行前后可扩展机制

  • tomcat通过父子容器方式管理所有EngineHostContextWrapper容器这样通过Engine容器找到所有子容器
  • Service组件维护Engine容器引用
  • Server组件维护Service组件列表
  • 以上所有组件实现Lifecycle接口实现各自初始化启动停止销毁阶段
  • 启动调用Server组件init,start方法Server组件负责调用自己维护各个Service组件init,start方法依此类推就完成所有组件初始化启动方法回调
  • 停止启动逻辑类似完成停止销毁方法回调

  • tomcat组件生命周期方法执行前后可扩展机制通过事件来完成
  • 比如启动前后发布对应事件如果需要扩展只需添加监听器监听对应事件即可
  • tomcat定义如下事件

tomcat组件生命周期状态变化

tomcat组件生命周期继承体系

http://www.xdnf.cn/news/946621.html

相关文章:

  • ubuntu服务器上极简部署odoo18
  • Spring是如何解决Bean的循环依赖:三级缓存机制
  • 一款用于react-native监听app[AppState]前后台的自定义Hooks开源插件
  • 基于 PyTorch 和 OpenCV 的实时表情检测系统
  • 企业如何增强终端安全?
  • 前端面试题 微信小程序兼容性问题与组件适配策略
  • 融智学本体论体系全景图
  • 西电计组第五章-指令系统
  • VmWare Ubuntu 16.04 搭建DPDK 19.08.2
  • 【JavaAPI搜索引擎】自动化测试报告
  • 【触想智能】工业平板电脑在无人巡检设备上的应用优势
  • 【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
  • Nosql之Redis集群
  • 突破原生整数范围限制:C++高精度乘法算法模板的实现与优化
  • 信号的诞生:Linux进程信号的启示与奥秘
  • Spring Boot 与 Kafka 的深度集成实践(一)
  • AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
  • 大模型——基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程
  • Shell 解释器​​ bash 和 dash 区别
  • AWS中国云的定时任务(AWS EventBridge+AWS Lambda)
  • 中医有效性探讨
  • spdlog 介绍与使用指南
  • lambda的惰性求值方法与及早求值方法
  • Vue3 PC端 UI组件库我更推荐Naive UI
  • go 里面的指针
  • [蓝桥杯 2024 国 Java B] 美丽区间
  • pymilvus
  • VRFF: Video Registration and FusionFramework 论文详解
  • 启动已有小程序项目
  • 详解K8s 1.33原地扩缩容功能:原理、实践、局限与发展