Advertisement

如何设计一个可用的web容器

阅读量:

构建一个Web容器涉及多个技术层面的基础知识与实践经验。例如如通信层的知识、数据传输机制的理解、以及程序语言相关的知识等。这些知识点构成了一个功能完善的Web容器所需的基础能力。然而由于实际应用中系统的复杂性往往使得单纯阐述其功能与实现细节则较为冗长因此本文将重点探讨Web容器的设计思路而不深入讨论具体实现细节。

web容器,设计,JSP

连接接收器

该系统的核心功能是持续监控是否有客户端套接字连接存在,并完成socket的接收任务。为了优化性能,在接收端仅执行最少的操作:维护基本状态变量、实施流量控制、管理serverSocket的接收操作、设置接收到socket的属性参数,并将处理后的socket分配到线程池中进行处理;对于需要较长处理时间的任务则由线程池负责完成。例如对socket底层数据的读取解析以及与HTTP协议相关的复杂操作等。

web容器,设计,JSP

连接数控制器

一台机器在运行过程中会面临访问请求高峰期,并且由于服务器存在物理限制而导致负载能力受限的问题。为了防止Web服务器不堪重负而出现性能瓶颈现象, 我们需要实施一系列防护措施以确保网络系统的稳定运行。这里的流量特指套接字连接数量, 通过调节套接字的最大连接数目来实现对网络带宽的有效管理。其中一种有效的方法是实施流量管理策略, 它类似于在数据流入口设置速率限制机制, 当达到预设的最大带宽时会自动切断新请求直到系统空闲后重新接受新的连接请求为止。计数值可通过JDK提供的AQS(Abstract Queue Synchronizer)框架实现

web容器,设计,JSP

套接字工厂


在不同的情境中可能需要实施不同级别的安全措施。例如,在涉及支付的交易中必须将信息先加密后发送,并且其中还包含了密钥协商的过程。从应用层的角度来看,则涉及使用HTTP与HTTPS的问题。简单来说,TLS\SSL协议的主要功能包括三个方面:首先,提供身份认证服务,以确保本次会话实体身份的有效性;其次,提供加密服务,采用强大的加密机制能够有效防止通信过程中的消息被解密;最后,提供抗篡改服务,通过哈希算法对消息进行签名并验证该签名的存在,从而确保通信内容没有被篡改或伪造。HTTP协议对应的是Socket类,而HTTPS则对应SSLSocket类。至于如何创建Socket和SSLSocket的具体实现则由套接字工厂完成处理

web容器,设计,JSP

任务定义器——Task

明确需要完成的任务,并将其划分为三个主要方面:一是实现对客户端 socket 的正常响应;二是减少连接计数器的数量;三是完成 socket 的关闭操作。其中涉及 socket 操作的部分最为关键且最为繁琐。具体来说,则需要执行以下几项操作:一是完成对底层 socket 字节流的读取;二是解析 HTTP 协议中的请求报文(包括请求行内容以及其头部和正文信息);三是依据上述分析结果生成相应的 HTTP 响应数据,并发送给客户端设备。

web容器,设计,JSP

任务执行器


一个设定了上下限任务处理系统的多线程池被称为"任务执行器"的原因在于该系统相当于持续监控并检查某个特定的任务队列,在检测到存在可执行的任务时就立即处理。此系统除了遵循最大值与最小值设置外,并且会在超负荷运行时主动拒绝新请求等各项规定进行规范运作。

web容器,设计,JSP

报文读取


用于接收来自客户端的报文并提供缓冲功能。报文被复制至desBuf。

web容器,设计,JSP

报文输出


负责将经web容器处理的报文传输至操作系统底层,并实现缓存功能。通过缓冲区传输报文outputBuf至操作系统。

web容器,设计,JSP

输入过滤器

在这个读取环节中期望进行一些额外的处理,并且这些额外的处理可能会根据特定条件而采取不同的方式实现;为了实现程序解耦与扩展的目的进而引入了过滤器;通过层层叠叠设置的过滤器执行筛选操作之后会传递至desBuf;整个流程类似于设置了多个处理关卡每个关卡都会执行相应的操作直至完成源数据至目的数据的转换工作

web容器,设计,JSP

输出过滤器


与输入过滤器功能类似,用于在报文输出的时候。

web容器,设计,JSP

报文解析器


提供解析http协议各个部分的能力。

web容器,设计,JSP

请求生成器


基于面向对象的方法,在每个请求过程中与之相关的属性及协议字段都被抽象为一个Request对象。该方案包含了请求行、请求头以及完整的请求体信息,在处理相关事务时可以直接从request对象中提取所需数据,并且这种设计能够便于遵循Servlet规范进行处理

web容器,设计,JSP

响应生成器


在处理请求时,该生成器需包含三个部分的信息:响应行、响应头和响应体。系统会自动将处理后的结果值设置到response对象中。以实现Servlet标准为目标。

web容器,设计,JSP

地址映射器


地址映射模块作为实现路径路由的核心组件连接着所有的Web服务和资源。当一个请求发起时,其路径信息会被系统自动解析以定位对应的响应资源,并将该资源的数据返回给客户端设备。

web容器,设计,JSP

生命周期


为了进一步实现模块化设计,在整个系统中包含大量功能模块的前提下;每个功能模块可能在不同时间点触发特定事件处理流程;因此有必要引入一个统一的生命周期管理系统来协调所有功能模块的工作流程。举个例子来说,在系统运行的不同阶段(如启动阶段),各个功能模块都会被调用并执行相应的操作(如初始化、退出等)。此外,在某个特定状态下完成某种任务前或完成后触发相关操作?引入一个周期性事件监听机制是解决这个问题的理想选择。

web容器,设计,JSP

JMX管理器


对系统运行状态进行实时监控与管理,在服务器性能指标及相关参数的数据采集基础上综合分析JVM资源占用情况、Web应用程序连接数量以及多线程处理机制等关键指标的变化趋势。支持通过远程界面实现对系统的实时监控与配置,并基于此设计了一套完整的分布式系统管理方案

web容器,设计,JSP

Web载入器


该WebLoader被设计用于加载一系列的Web应用程序项目,并通过复杂的机制管理这些资源。单个Web容器通常能够管理多个Web应用程序以满足服务需求。为了实现类库(lib)与Servlet之间的隔离以避免潜在的安全漏洞和性能问题,在配置时必须确保每个独立的应用必须配置独特的ClassLoader,并且这些ClassLoader之间没有直接或间接的继承关系以保证完全独立的安全环境。

web容器,设计,JSP

会话管理器


该系统的主要功能是对 session 进行管理,并包含以下几点:
① 生成 sessionID,在没有 jsessionid 值的情况下,默认认为该会话不存在。
② 许多客户端的 session 数据会被服务器存储。
③ 每个 session 都会有超时时间限制,并定期清理以避免占用过多服务器内存。
④ 对于一些特别重要的 session,则可被持久化存储在磁盘上,并在需要时可快速加载到内存中使用。

web容器,设计,JSP

运行日志


对运行时一些警告、异常、错误进行记录。

web容器,设计,JSP

访问日志


访问日志通常会记录客户端的访问相关信息,在具体细节上涉及客户端ip地址等信息,并涵盖请求时间、请求协议以及处理流程等多个维度的数据点。这些数据不仅能够统计出用户的数量及其使用时长分布情况,并且还能够反映出用户行为模式的特点及偏好倾向等信息特征。基于这些数据的分析结果为公司制定运营策略提供了依据

web容器,设计,JSP

安全管理器


该Web项目部署于Web容器平台之上,在启动过程中采用命令行参数-Djava.security.manager和-Djava.security.policy=web.policy来指定配置文件位置。初始化时需确保该系统能够稳定可靠地运行,并且要求该系统的功能分区达到了某种程度上的隔离效果以减少外部干扰。其中系统管理员还需注意配置好相应的安全策略参数才能实现预期的功能需求

web容器,设计,JSP

运行监控 &远程管理


提供一个可以实时监控web容器运行状态的平台,并且能进行远程管理。

web容器,设计,JSP

集群

通常分为两类:一种是负载均衡型集群,在这种类型中通过特定的分发算法将访问流量均匀分配到各台服务器上进行处理;另一种是高可靠性型集群,在这种架构下通过集群通信将多台服务器连接在一起,并且在某一台服务器出现故障时能够通过自动切换或流量转移等方式保证整个系统的对外可用性。Web应用程序通常采用无状态设计,默认情况下可以直接部署到分布式系统中;而涉及会话(session)的情况则属于有状态场景,则需要利用集群通信技术实现对会话数据的复制与同步。相关的解决方案主要包括基于组播的技术用于高效的数据传播以及单播机制来确保数据一致性。

web容器,设计,JSP

Servlet引擎


基于Java反射技术的Servlet引擎组能够通过动态创建实例将Web应用中的Servlet和JSP生成的对象并存入Servlet池中,并根据具体调用相应的操作方法。网站将所有业务流程统一配置在DoPost或DoGet方法中进行处理;当Web容器接收请求时会按照预先定义的处理规则自动执行相关操作,并最终返回给客户端相应的响应内容。

web容器,设计,JSP

JSP编译器


遵循规范的JSP最终都会被转换为Servlet来进行执行。由此可见,在开发过程中必须遵循规范来对jsp文件进行编译。实际上,JSP的编译器本质上就是用来解析jsp语法并据此生成相应代码的功能模块。

web容器,设计,JSP

Web容器主要包含一些相关组件的作用,在各个组件模块的基础上进行构建即可建立一个能够支持你的Web服务运行起来的Web容器。

========广告时间========

我的最新著作《Tomcat内核设计剖析》已经正式上市销售。有需要的读者可以访问京东平台购买:https://item.jd.com/12185360.html。感谢广大读者的支持与关注。

该文为何会深入解析《Tomcat内核设计剖析》这一技术要点?

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

全部评论 (0)

还没有任何评论哟~