【Node.js记录】初识Node.js,介绍、优缺点、使用领域、为何学习Node?

目录

Nodejs介绍

为何学习Node

Node特点

非阻塞异步io

单线程

事件驱动

单线程,带来的缺点

Node.js中的特点就是单线程,它带来了好处,但也有弊端,单线程弱点如下:

缺点解决方案

弊端1:

弊端2:

弊端3:

跨平台

为什么Serverless NodeJS服务端开发非常有显著技术优势

使用领域

总结


Nodejs介绍

Node.js发布于2009年5月,由Ryan Dahl开发,是一个基于Chrome V8引擎的JavaScript运行环境,使用了一个事件驱动、非阻塞式I/O模型,让JavaScript 运行在服务端的开发平台,它让JavaScript成为与PHP、Python、Perl、Ruby等服务端语言平起平坐的脚本语言。

可以理解为一个轻量级的JSP或PHP环境,用来开发Web应用会便捷很多。

为何学习Node

如果你有一定的前端基础,比如 HTML、CSS、JavaScript、jQuery;那么,Node.js 能让你以最低的成本快速过渡成为一个全栈工程师。

  1. 学习成本低(移动端、桌面应用、前后端通吃)。
  2. node的开发效率非常高,并有能力构建复杂系统。
  3. 跨平台,且部署的快。
  4. 单线程,并发强。
  5. 对服务器要求低(适合创业者)。
  6. 可以非常好的解决了IO密集的问题。

Node具有活跃的社区和丰富的模块池,拥有很多现成的功能实现。在框架方面,也有成熟的koa,express等基本框架和egg等二次封装框架,可根据需求选择,上手也比较方便。

Node和传统的后端语言(比如PHP、JAVA等)相比,各有优缺点,各自擅长领域和侧重点不同,因此,各有千秋、各有需求市场。Node 让我们进行后端开发多了一种便捷的手段,所以大家也不要总说哪些语言是最好的。

Node特点

非阻塞异步io

例如,当在访问数据库取得数据的时候,需要一段时间。在传统的单线程处理机制中,在执行了访问数据库代码之后,整个线程都将暂停下来,等待数据库返回结果,才能执行后面的代码。也就是说,I/O阻塞了代码的执行,极大地降低了程序的执行效率。

由于 Node.js 中采用了非阻塞型I/O机制,因此在执行了访问数据库的代码之后,将立即转而执行其后面的代码,把数据库返回结果的处理代码放在回调函数中,从而提高了程序的执行效率。

当某个I/O执行完毕时,将以事件的形式通知执行I/O操作的线程,线程执行这个事件的回调函数。为了处理异步I/O,线程必须有事件循环,不断的检查有没有未处理的事件,依次予以处理。

阻塞模式下,一个线程只能处理一项任务,要想提高吞吐量必须通过多线程。而非阻塞模式下,一个线程永远在执行计算操作,这个线程的CPU核心利用率永远是100%。所以,这是一种特别有哲理的解决方案:与其人多,但是好多人闲着;还不如一个人玩命,往死里干活儿。

单线程

在 Java、PHP 或者 .net 等服务器端语言中,会为每一个客户端连接创建一个新的线程。而每个线程需要耗费大约2MB内存。也就是说,理论上,一个8GB内存的服务器可以同时连接的最大用户数为4000个左右。要让Web应用程序支持更多的用户,就需要增加服务器的数量,而 Web 应用程序的硬件成本当然就上升了。

Node.js不为每个客户连接创建一个新的线程,而仅仅使用一个线程。当有用户连接了,就触发一个内部事件,通过非阻塞I/O、事件驱动机制,让 Node.js 程序宏观上也是并行的。使用 Node.js ,一个8GB内存的服务器,可以同时处理超过4万用户的连接。

另外,单线程带来的好处,操作系统完全不再有线程创建、销毁的时间开销。但是单线程也有很多弊端,会在 Node.js 的弊端详细讲解,请继续看。

事件驱动

在 Node.js 中,客户端请求建立连接,提交数据等行为,会触发相应的事件。在 Node.js 中,在一个时刻,只能执行一个事件回调函数,但是在执行一个事件回调函数的中途,又有其他事件产生,可以转而处理其他事件(比如,又有新用户连接了),然后返回继续执行原事件的回调函数,这种处理机制,称为“事件环”机制。

Node.js 底层是 C++V8也是C++写的)。底层代码中,近半数都用于事件队列、回调函数队列的构建。用事件驱动来完成服务器的任务调度,这是鬼才才能想到的。针尖上的舞蹈,用一个线程,担负起了处理非常多的任务的使命。

单线程,带来的缺点

不适合CPU密集型应用
只支持单核CPU,不能充分利用CPU
可靠性低,一旦代码某个环节崩溃,整个系统都崩溃

Node.js中的特点就是单线程,它带来了好处,但也有弊端,单线程弱点如下:

  1. 无法利用多核CPU

  2. 错误会引起整个应用退出无法继续调用异步I/O

  3. 大量计算占用CPU导致无法继续调用异步I/O

以上问题都可以用一些框架进行解决。

缺点解决方案

弊端1:

  • (1)一些管理工具比如pm2,forever 等都可以实现创建多进程解决多核 CPU 的利用率问题。

  • (2)在v0.8版本之前,实现多进程可以使用child_process

  • (3)在v0.8版本之后,可以使用cluster模块,通过主从模式,创建多个工作进程解决多核CPU的利用率问题。

弊端2:

  • (1)Nnigx反向代理,负载均衡,开多个进程,绑定多个端口;

  • (2) 一些管理工具比如pm2,forever 等都可以实现进程监控,错误自动重启等

  • (3)开多个进程监听同一个端口,使用Node提供的cluster模块;

  • (4)未出现cluster之前,也可以使用child_process,创建多子线程监听一个端口。

  • (5)这里说明下,有上面的这些解决方案,但是写node后端代码的时候,异常抛出try catch显得格外有必要。

弊端3:

  • (1)可以把大量的密集计算像上面一样拆分成多个子线程计算

  • 但是如果不允许拆分,想计算100万的大数据,在一个单线程中,Node确实显得无能为力,这本身就是V8内存限制的弊端。

小结:以上这些弊端随着Node的版本更新,和新的api模块出现,逐渐解决了这些弊端。

跨平台

起初,Node 只能在 Linux 平台上运行。后来随着 Node的发展,微软注意到了它的存在,并投入了一个团队帮助 Node 实现 Windows 平台的兼容,在v0.6.0版本发布时,Node 已经能够直接在 Window 平台运行了(Node 是基于libuv实现跨平台)。

为什么Serverless NodeJS服务端开发非常有显著技术优势

大家可以参考这篇文章评论:Node.js 做 Web 后端优势为什么这么大?

使用领域

  • 第一大类:用户表单收集系统、后台管理系统、实时交互系统、考试系统、联网软件、高并发量的web应用程序
  • 第二大类:基于web、canvas等多人联网游戏
  • 第三大类:基于web的多人实时聊天客户端、聊天室、图文直播
  • 第四大类:单页面浏览器应用程序
  • 第五大类:操作数据库、为前端和移动端提供基于json的API

小结:Nodejs能实现几乎一切的应用,只考虑适不适合使用它

总结

尝试学习,看看能否走的更远,混应用开发越来越多,原生路不好走了...

猜你喜欢

转载自blog.csdn.net/piyangbo/article/details/125797728