Tomcat架构设计精髓分析-Connector高内聚低耦合设计

优秀的模块化设计通常都会采用高内聚、低耦合

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

Tomca连接器需要实现的功能:

  • 监听网络端口

  • 接受网络连接请求。
  • 读取请求网络字节流。
  • 读取请求网络字节流。
  • 根据具体应用层协议(HTTP/AjP)解析字节流,生成统一的Tomcat Request对象。 
  • 将Tomcat Request对象标成标准的ServletRequest。
  • 调用Servlet容器,得到ServletResponse
  • 将ServletResponse转成Tomcat Response对象
  • 将Tomcat Response转成网络字节流。
  • 将响应字节流写回给浏览器。

分析连接器详细功能列表,我们会发现连接器需要完成3个高内聚的功能

  • 网络通信
  • 应用层协议解析
  • Tomcat Request/Response与ServletRequest/ServletResponse的转化。 

因此Tomcat的设计者设计了3个组件来实现这3个功能分别是EndPoint、Processor和Adapter。

  • EndPoint负责提供字节流给Processor;
  • Processor负责提供Tomcat Request对象给Adapter;
  • Adapter负责提供ServletRequest对象给容器。 

由于I/O模型和应用层协议可以自由组合,比如NIO+HTTP或者NIO2+AJP。Tomcat的设计者将网络通信和应用层协议解析放在一起考虑,设计了一个叫ProtocolHandler的接口来封装这两种变化点。各种协议和通信模型的组合有相应的具体实现类。 比如:Http11NioProtocol和AjpNioProtocol。

        除了这些变化点,系统也存在一些相对稳定的部分,因此Tomcaat设计了一系统抽象基类来封装这些稳定的部分,抽象基类AbstractProtocol实现了ProtocolHandler接口,每一种应用层协议有自己的抽象基类,比如AbstractAjpProtocol和AbstractHttp11Protocl,具体协议的实现类扩展了协议层抽象类。

设计复杂系统的基本思路

首先要分析需求,根据高内聚低耦合的原则确定子模块,然后找出子模块中的变化点和不变点,用接口和抽象类去封装不变点,在抽象基类中定义模板方法,让子类自己实现抽象方法,也就是具体子类去实现变化点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/652752.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LMDeploy量化部署LLMVLM实践-笔记五

本次课程由西北工业大学博士生、书生浦源挑战赛冠军队伍队长、第一期书生浦语大模型实战营优秀学员【安泓郡】讲解【OpenCompass 大模型评测实战】课程 课程视频:https://www.bilibili.com/video/BV1tr421x75B/ 课程文档:https://github.com/InternLM/…

Apache RocketMQ ACL 2.0 全新升级

作者:徒钟 引言 RocketMQ 作为一款流行的分布式消息中间件,被广泛应用于各种大型分布式系统和微服务中,承担着异步通信、系统解耦、削峰填谷和消息通知等重要的角色。随着技术的演进和业务规模的扩大,安全相关的挑战日益突出&am…

PDF高效编辑器,支持修改PDF文档并转换格式从PDF文件转换成图片文件,轻松管理你的文档世界!

PDF文件已成为我们工作、学习和生活中不可或缺的一部分。然而,传统的PDF阅读器往往只能满足简单的查看需求,对于需要频繁编辑、修改或转换格式的用户来说,就显得力不从心。现在,我们为您带来一款全新的PDF高效编辑器,让…

qml和c++结合使用

目录 文章简介1. 创建qml工程2. 创建一个类和qml文件,修改main函数3. 函数说明:4. qml 文件间的调用5. 界面布局6. 代码举例 文章简介 初学qml用来记录qml的学习过程,方便后面归纳总结整理。 1. 创建qml工程 如下图,我使用的是…

node.js egg.js

Egg 是 Node.js 社区广泛使用的框架,简洁且扩展性强,按照固定约定进行开发,低协作成本。 在Egg.js框架中,ctx 是一个非常核心且常用的对象,全称为 Context,它代表了当前 HTTP 请求的上下文。ctx 对象封装了…

无人机探测技术,无人机侦测频谱仪技术实现详解

频谱仪,又称为频谱分析仪,是一种用于测量电信号频谱特性的仪器。其基本原理是通过将时域信号转换为频域信号,进而分析信号的频率成分、功率分布、谐波失真等参数。频谱仪利用快速傅里叶变换(FFT)算法,将采集…

Blender基础操作

1.移动物体: 选中一个物体,按G,之后可以任意移动 若再按X,则只沿X轴移动,同理可按Y与Z 2.旋转物体: 选中一个物体,按R,之后可以任意旋转 若再按X,则只绕X轴旋转&…

学习笔记:Vue2高级篇

Vue2 学习笔记:Vue2基础篇_ljtxy.love的博客-CSDN博客学习笔记:Vue2中级篇_ljtxy.love的博客-CSDN博客学习笔记:Vue2高级篇_ljtxy.love的博客-CSDN博客 Vue3 学习笔记:Vue3_ljtxy.love的博客)-CSDN博客 文章目录 7.…

Redis缓存问题:穿透,击穿,雪崩等

Redis缓存问题:穿透,击穿,雪崩等 在高并发场景下,数据库往往是最薄弱的环节,我们通常选择使用redis来进行缓存,以起到缓冲作用,来降低数据库的压力,但是一旦缓存出现问题,也会导致数据库瞬间压力过大甚至崩溃,从而导致整个系统崩溃.今天就聊聊常见的redis缓存问题. 缓存击穿 …

[滴水逆向三期] 在代码空白区添加代码

思路 把MessageBox()函数的机器码添加到第一个节的空白区,修改程序的入口点,使程序先执行MessageBox()函数在屏幕上显示一个弹窗,然后在jmp回原来的入口点,运行原来程序。 要添加的内容 6A 00 6A 00 6A 00 6A 00 E8 XX XX XX XX…

如何基于Spring Boot项目从零开始打造一个基于数据库号段模式去中心化的分布式ID生成方案

一、前言 在当前系统开发过程中,单体架构的应用正在走向消亡,越来越多的应用开始分布式架构,在分布式架构设计过程中,有一个问题往往避免不了,就是分布式ID生成问题。 在常见解决方案中,有使用雪花算法或…

SOLIDWORKS Electrical 3D--精准的三维布线

相信很多工程师在实际生产的时候都会遇到线材长度不准确的问题,从而导致线材浪费甚至整根线材报废的问题,这基本都是由于人工测量长度所导致的,因此本次和大家简单介绍一下SOLIDWORKS Electrical 3D布线的功能,Electrical 3D布线能…