Tomcat的连接器是如何设计的?

  • NIO

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

  • NIO.2

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

  • APR

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

3 Tomcat支持的应用层协议

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

  • HTTP/1.1

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

  • AJP

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

  • HTTP/2

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

4 Service

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

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

但单独的连接器或容器都无法对外提供服务,需组装才能正常协作,而组装后的整体,就称为Service组件。所以,Service并不神奇,只是在连接器和容器外面多包了一层,把它们组装在一起。

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

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

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

5 连接器架构

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

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

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

5.1 功能需求


  • 监听网络端口

  • 接受网络连接请求

  • 读取网络请求字节流

  • 根据具体应用层协议(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接口,封装这两种变化点。

5.2 ProtocolHandler


各种协议和通信模型的组合有相应的具体实现类,如:

Tomcat设计了一系列抽象基类封装稳定部分,抽象基类AbstractProtocol实现了ProtocolHandler接口。

每种应用层协议有自己的抽象基类,如AbstractAjpProtocol、AbstractHttp11Protocol,具体协议实现类扩展了协议层抽象基类。

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

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

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

5.2.1 Endpoint

通信端点,即通信监听的接口,是具体的Socket接收和发送处理器,是对传输层的抽象,因此Endpoint用来实现TCP/IP协议。

Endpoint是一个接口,对应的抽象实现类是AbstractEndpoint,而AbstractEndpoint的具体子类,比如在NioEndpoint和Nio2Endpoint中,有两个重要的子组件:Acceptor和SocketProcessor。

Acceptor

用于监听Socket连接请求。SocketProcessor用于处理接收到的Socket请求,它实现Runnable接口,在run方法里调用协议处理组件Processor进行处理。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

对于很多Java工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

整理的这些资料希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

再分享一波我的Java面试真题+视频学习详解+技能进阶书籍

美团二面惜败,我的凉经复盘(附学习笔记+面试整理+进阶书籍)

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
与成长,其余的都不重要,希望读者们能谨记这一点。**

再分享一波我的Java面试真题+视频学习详解+技能进阶书籍

[外链图片转存中…(img-8MEyo5IG-1713434374903)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 30
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值