文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

深入分析 Tomcat 原理

2024-12-02 03:25

关注

早期Web容器早期的 Web 应用主要用于浏览新闻等静态页面,HTTP 服务器(比如 Apache、Nginx)向浏览器返回静态 HTML,浏览器负责解析 HTML,将结果呈现给用户。

Servlet规范

随着互联网发展,往往更多的是需要动态的交互。所以 Sun 公司推出了 Servlet 技术:servlet 规范!目前最新是 Servlet 4.0 ,它支持 HTTP2.0!

符合 Servlet 规范的 Web 流程:由 Servlet 容器来创建和管理 Servlet,客户端的请求 会被封装成 ServletRequest 和 ServletResponse,其本质上就是对通信协议的封装。

Tomcat简介

Tomcat 就是一个 Servlet 容器,实现了对 Servlet 和 JavaServer Page(JSP)的支持。同时,它还具有 HTTP 服务器的功能。所以,「Tomcat = HTTP服务器 + Servlet容器」,一般我们给这种组件称为:「轻量级web容器」!

Tomcat架构

Tomcat-Server

Tomcat-连接器

连接器,启动 ServerSocket,负责监听 Socket 请求,将数据转换成 Tomcat Request,交给 Engine 处理。一个 Service 可以有多个 Connector,表示它可以监听多个端口。

Tomcat-容器

即 Servlet 容器,它是 Tomcat 容器的最顶层组件,它会管理多个虚拟主机 Host,一个 Service 只能有一个 Engine,但是一个 Engine 可以配置多个 Host。Tomcat 的 Servlet 容器是具有明显的分层架构的。

Tomcat生命周期管理

「Tomcat 设计众多组件来保证高内聚低耦合,保证可扩展性」。但是,组件数量多也会带来其它问题,比如组件的管理,在启动、关闭和销毁需要涉及多个组件的操作。Tomcat 设计了 LifeCycle 接口,它定义生命周期钩子函数:init()、start()、stop() 和 destroy(),组件都实现这个接口,定义自己的处理逻辑。并且,上层组件在触发自己生命周期钩子函数的同时,会触发它管理的下层组件的钩子函数。其实国外设计框架很喜欢设计这个 LifeCycle 接口,新版 Apache Dubbo 也加入了这一特性。

Tomcat 在实现组件生命周期管理,充分利用了「组合模式、观察者模式和模板模式」。

Tomcat连接器

Tomcat 连接器,用来监听 Socket 连接,将 TCP 底层的字节流数据,转换为 Request 和 Response;连接器主要有3个组件:「EndPoint、Processor、Adapter」。

其中,Tomcat 将 EndPoint 和 Processor 组合到一起,组成了 ProtocolHandler,这其实就是一种组合设计模式的使用。

Tomcat连接器-NioEndpoint

「Tomcat 使用 NioEndPoint 基于 java 的 nio 包实现了 I/O 多路复用模型」,主要包含了 LimitLatch、Acceptor、Poller、SocketProcessor 和 Executor 共 5 个组件。它的工作过程如下:

  1. 「LimitLatch」:负责控制最大连接数,NIO 模式下默认是 10000,达到这个阈值后,连接请求被拒绝。它是基于 AQS 实现,原理就跟 Lock 一样。
  2. 「Acceptor」:独立线程,不断调用 ServerSocketChannel 的 accept() 方法来接收新连接,一旦有新的连接请求到来,返回 SocketChannel 对象,然后将其封装在一个 PollerEvent 对象中,并将 PollerEvent 对象压入 Poller 的 Queue 里(「典型的生产者 - 消费者模式」)。
  3. 「Poller」:独立运行在一个线程里,底层就是一个 Selector,每个 Poller 线程可能同时被多个 Acceptor 线程调用来注册 PollerEvent。Poller 不断的通过内部的 Selector 对象向内核查询 Channel 的状态,一旦可读就生成任务类 SocketProcessor 交给 Executor 去处理。
  4. 「SocketProcessor」:实现了 Runable 接口,主要是调用 Http11Processor 来处理请求。Tomcat 会将 Socket 包装成一个 SocketWrapper,Http11Processor 会调用 SocketWrapper 来读写数据。
  5. 「Executor」:自定义的线程池,负责运行 SocketProcessor ,会调用 Http11Processor 来读取和解析请求数据。Http11Processor 是应用层协议的封装,它会调用容器获得响应,再把响应通过 Channel 写出。

Tomcat连接器-Nio2Endpoint

Tomcat 还支持了异步 I/O,基于 Java AIO 实现 - Nio2Endpoint 的组件跟 NioEndpoint 类似,但是 Nio2Endpoint 中没有 Poller 组件,也就是没有 Selector。这是因为在异步 I/O 模式下,Selector 的工作交给内核来做了。

最后

其实 Tomcat 的实现细节很多,没办法一一重现,大部分情况下需要自己去对着源码跑一遍,像很多实际运用:

来源:Java架构师进阶编程内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯