Node.js介绍

身为一个前端人,想要去了解后端的编程思维,Node.js是最适合的一门语言。不言其他,只说JavaScript。这是每一个前端人都必须掌握的,而node.js也是基于JS,这使得前端人去学习node的门槛会低很多。

Node.js是什么?

Node.js基于Google的V8引擎,得以让JavaScript运行在服务器端,快速构建可扩展的网络应用程序的平台。
Node.js使用事件驱动,非阻塞I/O模型,轻量、高效,可以完美地处理时时数据,运行在不同的设备上。

Node.js有什么优点?

1.它是一个JavaScript运行环境 (Nodejs采用C++语言编写而成)
Nodejs基于Javascript语言,我们不需要再去重新学习一门新的陌生的后端语言,学习门槛和曲线都会低一些。另外,这使得统一前后端公共类库,代码标准化等成为了可能,同时也让前端人越来越容易成为一名全栈工程师。
2.依赖于浏览器V8引擎进行代码解释,实现高性能服务器
Nodejs并没有重新开发运行时环境,而是选择了目前最快的浏览器(Google)内核V8做为执行引擎,运行高性能 V8JavaScript 脚本语言,该语言是一种可以运行在服务器端的 JavaScript 脚本语言。。
那么,什么是 V8 JavaScript 脚本语言呢?该语言是一种被 V8 JavaScript 引擎所解析并执行的脚本语言。V8JavaScript 引擎是由 Google 公司使用 C++语言开发的一种高性能 JavaScript 引擎,该引擎并不局限于在浏览器中运行。Node.js 将其转用在了服务器中,并且为其提供了许多附加的具有各种不同用途的API。例如,在一个服务器中,经常需要处理各种二进制数据。在 JavaScript 脚本语言中,只具有非常有限的对二进制数据的处理能力,而 Node.js 所提供的 Buffer 类则提供了丰富的对二进制数据的处理能力。
另外,在 V8 JavaScript 引擎内部使用一种全新的编译技术。这意味着开发者编写的高端的JavaScript 脚本代码与开发者编写的低端的C语言具有非常相近的执行效率,从而使得node.js运行速度非常快,性能也非常好。
3.事件驱动
这儿,大家可能困惑,服务器端不同于客户端,没有按钮可供我们去点击,如何实现事件驱动呢?你不妨换一种思路,就会发现事件无时无刻不在发生。一个连接被建立,这是一个事件,数据通过连接进行接收,也是一个事件,数据通过连接停止,还是一个事件。JavaScript 本身就是一种很棒的事件驱动编程语言,因为它允许使用匿名函数和闭包,这使得服务器端使用事件编程成为了可能。事件发生时调用的回调函数可以在捕获事件处进行编写,这样可以使代码容易编写和维护。没有复杂的面向对象框架,没有接口,没有过度设计的可能性,我们只需监听事件,编写一个回调函数即可,其他事情都可以交给系统处理!
4.非阻塞
非阻塞模式下,一个线程永远在执行计算操作,这个线程所使用的CPU核心利用率永远是100%,使得效率大大提高,节省了资源。而如果是在阻塞模式下,解决思路则是提供多个线程,这样则会浪费资源。
5.异步I/O
同步式I/O或阻塞式I/O,线程在执行中如果遇到磁盘读写或网络通信,通常要耗费较长时间。这时操作系统会剥夺这个线程的CPU控制权,使其暂停执行,同时将资源让给其他的工作线程,这种线程调度方式成为阻塞,当I/O操作完毕时,操作系统将这个线程的阻塞状态解除,恢复其对CPU的控制权、令其继续执行。
异步式I/O或非阻塞式I/O,针对所有I/O操作不采用阻塞策略,当线程遇到I/O操作时,不会以阻塞的方式等待I/O操作的完成或数据的返回,而只是将I/O请求发送给操作系统,继续执行下一条语句,当操作系统完成I/O操作时,以事件的形式通知执行I/O操作的线程,线程会在特定时候处理这个事件,为了处理异步I/O,线程必须有事件循环,不断的检查有没有未处理的事件,依次予以处理。
6.超强的高并发能力
Node.js 的首要目标是提供一种简单的、用于创建高性能服务器及可在该服务器中运行的各种应用程序的开发工具。
首先让我们来看一下现在的服务器端语言中存在着什么问题。 在 Java、PHP 或者.net 等服务器端语言中,会为每一个客户端连接创建一个新的线程。而每个线程需要耗费大约 2MB 内存。也就是说,理论上,一个 8GB 内存的服务器可以同时连接的最大用户数为 4000 个左右。要让 Web 应用程序支持更多的用户,就需要增加服务器的数量,而 Web 应用程序的硬件成本当然就上升了。
Node.js 不为每个客户连接创建一个新的线程,而仅仅使用一个线程。当有用户连接了,就触发一个内部事件,通过非阻塞 I/O、事件驱动机制,让 Node.js 程序宏观上也是并行的。使用 Node.js,一个 8GB内存的服务器,可以同时处理超过 4 万用户的连接。使得Node很好的解决了IO密集的问题,展示了Node在相对较低的资源耗用下的高性能与出众的负载能力。
7.社区活跃发展速度快
Nodejs的社区在壮大,包的数量在快速增加,质量也在不断提升,最主要的是很多包都简单灵巧,方便大家使用快速开发。

Node,js有什么缺点?

1.不适合CPU计算密集型应用
CPU密集型应用给Node带来的挑战主要是:由于JavaScript单线程的原因,如果有长时间运行的计算(比如大循环),将会导致CPU时间片不能释放,使得后续I/O无法发起;
解决方案:分解大型运算任务为多个小任务,使得运算能够适时释放,不阻塞I/O调用的发起;
2.只支持单核CPU,不能充分利用CPU
3.内存控制不足且容量有限制
Javascript的面向对象是基于JSON的,而Java是直接使用内存结构。通过JSON序列化和反序列的过程控制内存,这方面显然是不如Java的。此外,由于V8引擎有内存设计的限制,32位环境中最大堆是1G,64位环境中最大堆也不到2G,如果要一次读入10G数据,对于Nodejs来说也无法实现。
4.不适合无异步的应用
比如系统管理,自行化脚本等,还是Python更顺手,Nodejs的异步调用可能会给编程带来一些麻烦。
5.可靠性低
一旦代码某个环节崩溃,整个系统都崩溃
原因:单进程,单线程
解决方案:
(1)Nnigx反向代理,负载均衡,开多个进程,绑定多个端口;
(2)开多个进程监听同一个端口,使用cluster模块;
6.开源组件库质量参差不齐,更新快,向下不兼容
7.Debug不方便,错误没有stack trace

适合NodeJS的场景

1.RESTful API
(每个Node.js进程可以支持超过12万活跃的连接,每个连接消耗大约2K的内存。)
这是NodeJS最理想的应用场景,可以处理数万条连接,本身没有太多的逻辑,只需要请求API,组织数据进行返回即可。
它本质上只是从某个数据库中查找一些值并将它们组成一个响应。
由于响应是少量文本,入站请求也是少量的文本,因此流量不高,一台机器甚至也可以处理最繁忙的公司的API需求。
2.统一Web应用的UI层
目前MVC的架构,在某种意义上来说,Web开发有两个UI层,一个是在浏览器里面我们最终看到的,另一个在server端,负责生成和拼接页面。
3.大量Ajax请求的应用
例如个性化应用,每个用户看到的页面都不一样,缓存失效,需要在页面加载的时候发起Ajax请求,
NodeJS能响应大量的并发请求
总而言之,NodeJS适合运用在高并发、I/O密集、少量业务逻辑的场景。如在线多人聊天,多人在线小游戏,实时新闻,博客,微博之类的等等。
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值