静网PWA视频评论

基于Node.js的Web服务端框架思考与实现

2023年10月16日

- txt下载

本文主要工作如下: 1)通过对 Node.js 的相关技术进行分析,在此基础上结合实际开发场景,完成了框架的需求分析和结构设计。以模块化机制为基础,设计并实现了框架的核心模块,包括请求管理、参数处理、过滤、路由、会话管理和静态资源管理等功能模块,为开发者提供请求处理与响应的各个环节的丰富基础功能。
1 绪论
1.1 研究背景及意义
随着互联网的发展以及 Web 应用数量的快速增加,人们日常生活中方方面面的需求,包括网上银行、网络直播、在线医疗、协同办公等都可以通过 Web 应用实现。而服务端是 Web 应用开发的基石,是 Web 应用质量和性能的重要保障。随着用户需求的增长,服务端开发的工作量和复杂度也在日渐上升。在此背景下,使用服务端框架进行开发成为提高 Web 应用开发效率以及改善用户体验最为有效的解决方案。
Node.js[1]作为一项诞生于 2009 年的新兴技术,于 2011 年正式发布 Windows 版本。由于其高效的 Chrome V8 引擎[2]和异步 I/O 的特性,使得基于 Node.js 开发的 Web 应用程序具有高性能与可扩展的特性[3]。使用 Node.js 进行 Web 应用开发的优势主要有以下几个方面:
1)与传统服务端开发语言相比,Node.js 的异步 I/O 模型对大部分 I/O 请求的响应更快[4]。
2)Node.js 将数据解析与前端分离,实现了视图层(User Interface,UI)与数据模型的解耦。
3)Node.js 为前端开发语言 JavaScript 提供了服务端的执行环境,实现了前后端开发语言的统一,大大降低了应用的开发成本[5]。
与 Node.js 的高速发展相比,Node.js 在服务端开发领域的成熟度与传统服务端开发语言相比仍有较大差距,这给 Node.js 在服务端的发展带来了机遇与挑战。目前,Node.js 的稳定版本已更新到 14.16 以上,其高效的异步 I/O 模型、新的语法特性、良好的社区生态与全面的 npm 包管理平台,都是 Node.js 持续发展的有效保障[6]。与此同时,现有的基于 Node.js 的 Web 服务端框架数量较少,尚未存在一款具有垄断地位的Node.js 服务端框架。种种迹象都表明研究并实现一款基于 Node.js 的 Web 服务端框架是可行的。
.........................
1.2 研究现状
近年来,尤其是互联网进入到以前后端分离为主导的开发模式后,Node.js 在服务端开发领域的重要性得到了重视,诞生了几款较为流行的 Web 服务端框架。
Express[7]和 Koa 是两款基于 Node.js 的 Web 基础框架。这两款框架采用中间件的开发模式,框架本身只提供少量的功能用于请求处理,对请求的处理主要通过第三方中间件来实现,具有对请求处理流程的切分能力强、可扩展性高的特点。在这种开发模式下,开发者通过在请求处理流程中的任意位置添加中间件来满足开发需求。由于中间件模式带来的高灵活性,使 Express 和 Koa 有着较好的社区生态和插件生态。在实际开发过程中,第三方中间件具有各自的代码逻辑,并且在使用时需要手动引入和创建,会导致项目重构和维护上的困难。因此,这两款框架更多是作为其他 Web 服务端框架的底层框架。
Nest 和 Hapi 是目前两款较为流行的 Web 服务端的开发框架。Nest 是在 Express 的基础上进行二次开发的框架。Nest 采用了 MVC[8]的结构设计,将功能划分为控制层(Controller)、提供层(Provider)和模型层(Model)。其中 Controller 负责以注入的方式传入请求,并返回对客户端的响应;Provider 负责提供请求的各项处理;Model负责将对应的 Controller 和 Provider 联系起来。这种分层结构使得 Nest 具有较强的功能解耦能力。
Hapi 在早期也是基于 Express 进行的开发,但是在后来的迭代中将 Express 从框架底层移除,但是在结构上仍然保留了 Express 基于扩展的设计思想。Hapi 采用基于插件的扩展结构,与基于中间件的扩展结构的主要区别在于 Hapi 中一个插件代表一个独立服务,而 Express 中一个中间件代表一个函数。Hapi 提供了认证、日志、路由等功能模块用于请求的识别、记录与转发,同时结合 joi、vision 等插件完成请求解析与视图管理。但 Hapi 的插件系统兼容性较差,只能使用框架官方指定的插件,不兼容第三方插件,并且由于 Hapi 的中文文档和社区较少,对国内开发者来说学习起来有一定的门槛。
.....................
2 基于 Node.js 的服务端框架相关技术
2.1 Node.js 相关技术
2.1.1 模块化机制
从编程的角度来说,模块是指能够提供一定功能或数据的程序语句集合,并且具备和外部联系的接口。Node.js 采用 CommonJS 标准实现了模块化机制[9],每个文件都是一个模块,并且有自己的作用域,在作用域中定义的一切内容都是独有的。在CommonJS 模块规范下,项目在首次运行时会依照模块在引用文件中出现的顺序依次加载所有模块,并且将运行结果进行缓存,后续多次调用模块时直接从缓存中获取而不会再次执行该模块。CommonJS 规范中包含三个部分:模块定义(exports)、标识(module)和引用(require)。
其中,模块定义是用来暴露出当前模块所提供的方法和属性。使用 module.exports来导出某个模块对象的基本语法如下所示:
模块化机制
......................
2.2 Web 缓存技术
Web 缓存技术是一种在 Web 的关键节点上存储频繁访问的数据的技术。它将已访问的资源存储在 Web 应用中的某些位置,资源被再次访问时,不需要请求服务端,而是直接返回缓存中的资源。根据 Web 应用中缓存的存储位置,可以将其分为客户端缓存[19]与服务端缓存[20]。
2.2.1 客户端缓存
客户端缓存是指资源的接收方(通常为浏览器)建立一个缓存区,对 Web 请求返回的资源进行缓存。客户端与服务端通过应答的模式进行通信。客户端发起 HTTP 请求,服务端处理和响应 HTTP 请求。在这个过程中,客户端缓存主要是通过 HTTP 缓存机制[21]来实现的,通过在 HTTP 协议头中定义不同的缓存规则来决定客户端是直接使用缓存中的副本还是要向服务端重新请求更新的资源。
客户端在没有缓存的时候向服务端发起请求,服务端会将资源和缓存规则一并返回,客户端根据响应头中不同的缓存标识信息来确定使用何种缓存规则。根据在获取资源时是否需要重新向服务器发起请求可以将其分为两大类:强制缓存和协商缓存[22]。 在强制缓存规则下,如果缓存生效则直接使用缓存,无需向服务端重新发起请求。强制缓存主要有以下两个规则参数:
1)Expires:用来指定资源过期的时间。Expires=max-age+请求发出的时间。当请求的资源尚未过期时,可以直接从客户端缓存中取出资源。
2)Cache-Control:用来对客户端缓存方式进行控制。Cache-Control 在请求头或者响应头中设置,可以组合使用多种指令来对客户端缓存方式进行控制。Cache-Control 的指令如表 2-2 所示,以下为每组指令的说明:
(1)no-store 和 no-cache:决定缓存方式。no-store 表示资源不会被缓存;no-cache表示不允许客户端缓存资源与服务端资源不一致,即每次请求时需要向服务端确认资源是否发生变更。
(2)public 和 private:决定缓存位置。public 表示资源可以在客户端和服务端缓存;private 表示资源只能在服务端缓存。
(3)max-age 和 must-revalidation:决定缓存过期时间。max-age 表示缓存资源的最大可用时间,当缓存过期后,向服务端验证资源有效后仍可使用原来的资源;must-revalidation 表示缓存过期后,客户端必须向服务端重新请求资源
..........................
3 基于高斯混合模型的缓存替换算法.................30
3.1 高斯混合模型概述..................30
3.2 算法执行流程.................30
4 基于 Node.js 的 Web 服务端框架设计.................40
4.1 需求分析.................40
4.1.1 功能性需求.................40
4.1.2 非功能性需求.................40
5 基于 Node.js 的 Web 服务端框架实现.................50
5.1 请求管理模块实现.................50
5.1.1 框架初始化加载.................50
5.1.2 请求处理与调度.................50
6 基于 Node.js 的 Web 服务端框架测试
6.1 测试环境
框架测试过程中需要 2 台计算机用于搭建 Node.js 服务器和客户端,通过将 Node.js服务器以及客户端电脑部署在同一局域网中,通过 100Mbps 以太网通信,测试使用的软硬件环境配置如表 6-1 所示。
表 6-1 测试环境配置
本次测试所需的工具介绍如下:
Chai 断言库:Chai.js 是一款支持测试驱动开发(Test-Driven Development,TDD)[44]和行为驱动开发(Behavior-Driven Development,BDD)[45]的断言库。其拥有 3 个断言库,包括 Expect 断言库、Should 断言库和 Assert 断言库,可以用于与 JavaScript 类型的测试框架进行组合使用。
Mocha:Mocha 是基于 JavaScript 的一款自动化测试框架,能有效的对异步方法进行测试,在 Node.js 的控制端和客户端中都可以运行。本文采用 Chai 的 Expect 断言库与 Mocha 进行组合使用,在 Node.js 环境中编写的功能单点测试用例,捕获异常输出的测试用例。
Jmeter:Apache Jmeter 是一款由 Apache 组织开发的压力测试工具,用于对软件做压力测试[46]。在设计阶段,Jmeter 能够充当 HTTP 代理来记录 Web 请求,随后通过设置请求样本的发送数量和重复次数来产生请求流量。
......................
7 总结与展望
7.1 论文总结
随着 Node.js 的发展,由于其异步 I/O 的特性,在高并发的 I/O 场景下实现了比传统服务端开发语言更为高效的处理效率。本文通过对 Node.js 相关技术进行调研和分析,设计并实现了一款基于 Node.js 的 Web 服务端框架。该框架通过对请求处理和响应的具体流程进行划分,为开发者提供了更为高效的请求处理能力。本文主要工作如下:
1)通过对 Node.js 的相关技术进行分析,在此基础上结合实际开发场景,完成了框架的需求分析和结构设计。以模块化机制为基础,设计并实现了框架的核心模块,包括请求管理、参数处理、过滤、路由、会话管理和静态资源管理等功能模块,为开发者提供请求处理与响应的各个环节的丰富基础功能。
2)通过对主流 Node.js 的 Web 服务端框架进行分析,针对主流框架存在的不足,结合框架的功能模块给出了相应的优化方案。在功能属性配置方面,框架采用基于配置文件的功能属性定义方式,将功能属性的配置信息从业务代码中分离,提高代码的可维护性。在框架初始化时,通过对配置文件进行解析,实现功能模块的自定义加载。在请求调度方面,基于缓存队列设计了延迟调度方案。框架使用缓存队列存储请求,同时对 CPU 进行监控,在高并发场景下通过延迟调度完成请求的错峰处理,降低了请求错误率。在静态资源加载方面,框架使用客户端与服务端缓存相结合的双缓存方案对静态资源进行缓存,减少请求次数和文件 I/O 操作,提高了静态资源加载效率。
3)在缓存替换方面,本文提出了一种基于高斯混合模型的缓存替换算法。使用滑动窗口进行特征提取和计算,通过高斯混合模型对窗口时间内会被再次访问的资源进行预测,并根据预测结果进行缓存替换,实现了较高的缓存命中率和字节命中率。
4)对框架进行全面测试,包括自动化功能测试、静态资源加载耗时测试、请求错误率测试以及请求处理效率测试。从四个方面验证了框架的可用性和良好的性能,也进一步验证框架设计的合理性。
参考文献(略)

收藏

相关推荐

清纯唯美图片大全

字典网 - 试题库 - 元问答 - 繁體 - 顶部

Copyright © cnj8 All Rights Reserved.