栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

【大厂每日面试】Tomcat的连接器是如何设计的,zookeeper注册中心原理

【大厂每日面试】Tomcat的连接器是如何设计的,zookeeper注册中心原理

=================================================================

为什么要学习Tomcat的设计思路,对我们这些 crud 工程师有用吗?现代背景下,我们不仅可以学到Tomcat的架构,学会从宏观上怎么去设计一个复杂系统,怎么设计顶层模块,以及模块之间关系。

Tomcat总体架构

=========================================================================

Tomcat主要实现了2个核心功能:

  • 处理Socket连接,负责网络字节流与Request和Response对象的转化

  • 加载和管理Servlet,以及具体处理Request请求

因此Tomcat设计了两个核心组件:

  • 连接器(Connector)

负责对外交流

  • 容器(Container)

负责内部处理。

Tomcat支持哪些I/O模型呢?

  • NIO

非阻塞I/O,采用Java NIO类库实现。

  • NIO.2

异步I/O,采用JDK 7最新的NIO.2类库实现。

  • APR

采用Apache可移植运行库实现,是C/C++编写的本地库。

Tomcat支持哪些应用层协议呢?

  • HTTP/1.1

大部分Web应用采用的访问协议。

  • AJP

用于和Web服务器集成(如Apache)。

  • HTTP/2

HTTP 2.0大幅度的提升了Web性能。

Service


Tomcat为支持多种I/O模型和应用层协议,一个容器可能对接多个连接器。

但单独的连接器或容器都无法对外提供服务,需组装起来才能正常工作,组装后的整体称为Service组件。

Service只是在连接器和容器外面多包了一层,把它们组装在一起。

Tomcat内可能有多个Service,通过在Tomcat中配置多个Service,可实现通过不同端口号访问同一台机器上部署的不同应用。

最顶层是Server(即一个Tomcat实例)。一个Server中有一或多个Service,一个Service中有多个连接器和一个容器。

连接器与容器之间通过标准的ServletRequest和ServletResponse通信。

连接器


连接器对Servlet容器屏蔽了协议及I/O模型的区别,处理Socket通信和应用层协议的解析,得到Servlet请求。

所以无论是HTTP、AJP,在容器中获取到的都是一个标准的ServletRequest对象。

连接器的详细功能:

  • 监听网络端口

  • 接受网络连接请求

  • 读取网络请求字节流

  • 根据具体应用层协议(HTTP/AJP)解析字节流,生成统一的Tomcat Request对象

  • 将Tomcat Request对象转成标准的ServletRequest

  • 调用Servlet容器,得到ServletResponse

  • 将ServletResponse转成Tomcat Response对象

  • 将Tomcat Response转成网络字节流

  • 将响应字节流写回给浏览器。

提完了需求,就需要考虑它应该有哪些子模块呢?

优秀的模块化设计应该考虑高内聚、低耦合。通过分析连接器的功能,发现连接器需要完成如下高内聚的功能:

  • 网络通信

  • 应用层协议解析

  • Tomcat Request/Response与ServletRequest/ServletResponse的转化

因此Tomcat的设计者设计了3个组件来实现这3个功能:Endpoint、Processor和Adapter。

组件之间通过抽象接口交互。这样做还有一个好处是封装变化。这是面向对象设计的精髓,将系统中经常变化的部分和稳定的部分隔离,有助于增加复用性,并降低系统耦合度。

不管网络通信I/O模型、应用层协议、浏览器端发送的请求信息如何变化,但整体处理逻辑不变:

  • Endpoint

提供字节流给Processor

  • Processor

提供Tomcat Request对象给Adapter

  • Adapter

提供ServletRequest对象给容器

如果要支持新的I/O方案、新的应用层协议,只需要实现相关具体子类,上层通用的处理逻辑不会变。

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

比如:Http11NioProtocol和AjpNioProtocol

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

![](h

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

ttps://img-blog.csdnimg.cn/20210717232129435.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzNTg5NTEw,size_16,color_FFFFFF,t_70)

这样设计是为尽量将稳定的部分放到抽象基类,同时每一种I/O模型和协议的组合都有相应的具体实现类,我们在使用时可以自由选择。

连接器模块的核心组件:

  • Endpoint

  • Processor

  • Adapter

Endpoint和Processor放在一起抽象成了ProtocolHandler组件

顶层组件

===================================================================

ProtocolHandler组件


连接器用ProtocolHandler处理网络连接、应用层协议,包含如下重要部件

Endpoint
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/682966.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号