为什么是Node.js?

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

为什么是Node.js?

我们都知道 Node.js 在诞生之初是为了实现高性能的 web 服务器,再后来 Node.js 慢慢演化为了一门服务端“语言”。

为什么在众多的解决方案中 Node.js 是最出彩的哪一个?

下面,来看一下 用户从发送请求 到获取数据的整个过程 image.png

  1. 客户端依据用户的操作发起请求
  2. 服务端根据业务逻辑响应对应的请求

在这里我们抛开带宽、硬件、性能等客观因素,真正影响用户获取数据速度的是:IO的时间消耗。 而我们都知道 IO 是计算机操作过程中最缓慢的环节(在磁盘和网络中的消耗是毫秒级别的)。

假设

当前目前是一个串行的任务,正在处理的一个请求中有一个需要长时间进行处理的 IO 行为,那么后续的任务就不能得到及时的响应。

当前很多的高级编辑语言都是采取多进程、多线程的方式来进行处理,但是也是会有一些问题的。

这里我们用餐馆来进行举例:

  • 当前有几个客人来点菜(几个请求发出)
  • 就有几个服务员来进行服务(几个线程来进行响应这个请求)

这样对客人的体验是非常好,但是如果某个时间段有很多的客人进来,我们的线程并不能无限制的增加,这样无人响应的过程就出现了。

Reactor 模式

基于这种情况,就有了 Reactor 模式,也就是应答者模式。

他的核心思想就是,仅仅保留一个服务员,然后让客人自己进行点餐,等客人点餐完毕之后,呼叫服务员就行。

这样的话,就是用单线程完成了多线程的事情,并且他是非阻塞的,使用这样的操作,可以避免多个线程进行切换的时候,状态的保存、时间的消耗等问题

Node.js 正是基于 Reactor 模式 和 js语言本身的特性,让单线程远离阻塞从而通过异步非阻塞IO跟好的使用 sql 支援。

Node.js 可以做什么?

  • 轻量级、高性能的 Web 服务
  • 前后端 JavaScript 同构开发
  • 便捷高效的前端工程化

Node.js 架构

这里我们将 Node.js 的核心分成了三个大的部分

  • Natives modules: 暴露出来对应的接口,提供开发者使用
  • Builtin modules: 帮助 node.js 找到对应的 c++ 调用接口
  • 具体功能层:负责js代码的最终执行,处理node环境下的代码执行细节

Natives modules

  • 当前层内容由 JS 实现
  • 提供应用程序可直接调用库,例如 fs、path、http 等
  • JS 语言无法直接操作底层硬件设备

正因为JS 语言无法直接操作底层硬件设备,所以我们需要对应的中间层来为我们进行转发事件Builtin modules应运而生。

Builtin modules 胶水层

通过这个中间层,我们可以让 Node.js 的核心模块来获得更底层的操作,例如文件的读写行为。

具体功能层

这一层是一些具体的功能模块:

  • v8:执行 js 代码,提供桥梁接口
  • libuv: 事件循环、事件队列、异步IO
  • c-ares(DNS)
  • http parser
  • zlib (compression)
  • 等...

image.png

猜你喜欢

转载自juejin.im/post/7102036641711128589