前言如果你有一定的前端基础,比如HTML、CSS、JavaScript、jQuery;然后,节点,我觉得全栈也要精通数据库,不喜勿喷),从而接触到后端和移动端的开发。当然,Node.js不是万能的,也不代表学习了它就可以完全替代其他后端开发语言。它有自己的使命和应用领域。另外,目前非常流行的Vue.js、React.js等很多数据层动态交互更喜欢Node.js,一些比较流行的打包工具也是如此;综上所述,为什么要学习它又增加了一大原因。与传统的后端语言(如PHP、JAVA等)相比,Node.js各有优缺点,擅长的领域和侧重点也不同。因此,每个人都有自己的优势和需求。Node.js为我们提供了一种方便的后端开发方式。所以不要总说哪种语言最好,各有各的使命,呵呵。Node.js非阻塞异步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内存的服务器可以同时处理超过40,000个用户连接。另外,单线程带来的好处,操作系统不再有线程创建和销毁的时间开销。但是单线程也有很多缺点,在Node.js的缺点中会详细说明,请继续阅读。事件驱动在Node.js中,客户端请求建立连接、提交数据等行为,都会触发相应的事件。在Node.js中,一次只能执行一个事件回调函数,但是在执行一个事件回调函数的过程中,会产生其他事件,可以改为处理其他事件(例如,新用户连接),然后返回继续执行原事件的回调函数。这种处理机制称为“事件循环”机制。Node.js底层是C++(V8也是用C++写的)。将近一半的底层代码用于事件队列和回调函数队列的构建。用事件驱动来完成服务器的任务调度,那是只有鬼才能想到的事情。针尖上的舞蹈,一根线,肩负着处理千丝万缕的使命。注意这里的事件循环,也可以说是Node.js的精髓所在。这里引用Node.js官方网站┌──────────────────────────────────────────────────────────────────┐┌──>│计时器││└──────────────────────────────────────────────┘│┌────────────────┴──────────────────┐││等待回调││└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐││等待回调││└────────────────┬──────────────────┘│┌──────────────┴────────────────┐┐│空闲,准备││└──────────────────┬────────────────┘┌────────────────────────┐│┌──────────────────┴──────────────┐│传入:│││投票│<──────┤连接,││└────────────────┬────────────────┘│数据等││┌──────────────────────────────────────────────┐└────────────────────┘││检查││└──────────────────────────────────────────────────────────┘│┌────────────────┴──────────────┐└──┤收盘回调│└────────────────────────────────────────────────────┘引用Node官网的一段话:注意:每个框将被称为事件循环的一个“阶段”。每个阶段都有一个要执行的回调的FIFO队列。虽然每个阶段都有自己的特殊方式,但一般来说,当事件循环进入给定阶段时,它会执行该阶段特定的任何操作,然后对该阶段的队列执行回调,直到队列耗尽。已经执行了尽可能多或尽可能多的回调。当队列耗尽或达到回调限制时,事件循环将进入下一阶段,依此类推。关于事件循环是一个核心点,面试官经常被问到具体的执行输出。可以看我的文章跨平台一开始Node只能运行在Linux平台上。后来随着Node的发展,微软注意到了它的存在,并投入了一个团队帮助Node实现Windows平台兼容。v0.6.0版本发布时,Node已经可以直接运行在Window平台上了。Node是基于libuv的跨平台的。Node.js的劣势单线程带来的劣势Node.js的特点之一就是单线程,单线程带来很多好处,但也有缺点。单线程的弱点如下。无法使用多核CPU错误会导致整个应用程序退出,无法继续调用异步I/O。海量计算占用CPU,无法继续调用异步I/O。以上确实是Node的缺点,但是会有一些相应的解决方案:缺点一:解决方案(1)一些管理工具如pm2、forever等可以创建多个进程来解决多核CPU利用率问题。(2)v0.8版本之前,可以使用child_process实现多进程(3)v0.8版本之后,可以使用cluster模块,通过主从模式创建多个工作进程,解决多进程-核心CPU利用率问题。缺点2:解决方案(1)Nnigx反向代理,负载均衡,开启多进程,绑定多端口;(2)一些管理工具如pm2、forever等可以实现进程监控、错误自动重启等。(3)开启多个进程监听同一个端口,使用Node提供的集群模块;(4)在cluster出现之前,也可以使用child_process创建多个子线程来监听一个端口。(5)这里说明一下,有上面的解决方案,但是在写node后端代码的时候,特别需要在抛出异常的时候抛出trycatch。劣势三:解决方案(1)大量的密集型计算可以如上拆分成多个子线程计算,但是如果不允许拆分,如果要计算100万大数据,Node在单个中确实无能为力线。这本身就是V8内存限制的缺点。说明:child_process和cluster模块我会另文说。好消息是,以上缺点随着Node版本的更新和新的api模块的出现,似乎解决了这些缺点。用过node调试的人可能马上就会觉得调试太难了。没有堆栈跟踪,因此调试更加困难。Node社区中的npm包Node.js社区有许多质量参差不齐的包。如果你想偷懒,恰好npm了一个有问题的包,那你就麻烦了,因为代码是开源的,只能自己调试。Node.js的应用场景介绍了Node.js的特点和不足,然后说说Node.js的应用场景。Node.js适合开发什么样的应用?擅长I/O,不擅长计算。因为Node.js最擅长的是任务调度。如果你的业务有很多CPU计算,其实相当于这个计算阻塞了这个单线程。不太适合Node开发,但是没有解决方案,只能说不太适合。当应用程序需要处理大量并发I/O,并且应用程序不需要在向客户端发送响应之前执行非常复杂的处理时,Node.js非常适合。Node.js也非常适合配合websocket开发长连接的实时交互应用。具体场景可以表述为:第一类:用户表单采集系统、后台管理系统、实时交互系统、考试系统、网络软件、高并发Web应用;第二类:网页类、画布类等人联网类游戏;第三类:基于网络的多人实时聊天客户端、聊天室、图文直播;第四类:单页浏览器应用;第五类:操作数据库,前端和移动端提供了基于json的API;第六类,....有哪些大公司在用雅虎:雅虎开源了Cooktail框架,借助Node.js将前端框架YUI3的能力扩展到服务端。腾讯:将Node应用于长连接,提供实时功能。花瓣网、蘑菇街:通过socket.io实时通知。阿里:主要是利用并行I/O的性能,实现高效分发。他们也出过很多Node框架LinkedIn:手机网站也用Node网易:游戏领域对并发和实时性要求高,网易开源了Node的实时框架pomelo等等...参考文章:本文部分内容来自朴玲老师的《深入浅出Node.js》大家好,我是考拉,正在做Node.js进阶进阶路线。今天就分享这么多。如果您对分享的内容感兴趣,可以关注公众号《程序员成长指南》,或者加入技术交流群一起讨论。加入我们,一起学习!..
