Node.js简单入门前传


Posted in Javascript onAugust 21, 2017

1.什么是NodeJS

简单的说 Node.js 就是运行在服务端的 JavaScript。

Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。

Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎(Google的Chrome浏览器使用的JavaScript执行环境),

V8引擎执行Javascript的速度非常快,性能非常好。

2.为什么选择NodeJS

如果你是一个前端程序员,你不懂得像PHP、Python或Ruby等动态编程语言,然后你想创建自己的服务,那么Node.js是一个非常好的选择。

Node.js 是运行在服务端的 JavaScript,如果你熟悉Javascript,那么你将会很容易的学会Node.js。

当然,如果你是后端程序员,想部署一些高性能的服务,那么学习Node.js也是一个非常好的选择。

3.NodeJS的特点

我们先来看看NodeJS官网上的介绍:

Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.

其特点为:

1. 它是一个Javascript运行环境

2. 依赖于Chrome V8引擎进行代码解释

3. 事件驱动

4. 非阻塞I/O

5. 轻量、可伸缩,适于实时数据交互应用

6. 单进程,单线程

异步、事件驱动模型

Node.js简单入门前传

       我们同样是要发起请求,等待服务器端响应;但是与银行例子不同的是,这次我们点完餐后拿到了一个号码,

拿到号码,我们往往会在位置上等待,而在我们后面的请求会继续得到处理,同样是拿了一个号码然后到一旁等待,接待员能一直进行处理。

等到饭菜做号了,会喊号码,我们拿到了自己的饭菜,进行后续的处理(吃饭)

这个喊号码的动作在NodeJS中叫做回调(Callback),能在事件(烧菜,I/O)处理完成后继续执行后面的逻辑(吃饭),

这体现了NodeJS的显著特点,异步机制、事件驱动

整个过程没有阻塞新用户的连接(点餐),也不需要维护已经点餐的用户与厨师的连接

       Node.Js使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

基于这样的机制,理论上陆续有用户请求连接,NodeJS都可以进行响应,因此NodeJS能支持比Java、PHP程序更高的并发量

虽然维护事件队列也需要成本,再由于NodeJS是单线程,事件队列越长,得到响应的时间就越长,并发量上去还是会力不从心

总结一下NodeJS是怎么解决并发连接这个问题的:

更改连接到服务器的方式,每个连接发射(emit)一个在NodeJS引擎进程中运行的事件(Event),放进事件队列当中,

而不是为每个连接生成一个新的OS线程(并为其分配一些配套内存)

I/O阻塞

NodeJS解决的另外一个问题是I/O阻塞,看看这样的业务场景:需要从多个数据源拉取数据,然后进行处理

(1)串行获取数据,这是我们一般的解决方案,以PHP为例

Node.js简单入门前传

假如获取profile和timeline操作各需要1S,那么串行获取就需要2S

(2)NodeJS非阻塞I/O,发射/监听事件来控制执行过程

Node.js简单入门前传

NodeJS遇到I/O事件会创建一个线程去执行,然后主线程会继续往下执行的,

因此,拿profile的动作触发一个I/O事件,马上就会执行拿timeline的动作,

两个动作并行执行,假如各需要1S,那么总的时间也就是1S

它们的I/O操作执行完成后,发射一个事件,profile和timeline,

事件代理接收后继续往下执行后面的逻辑,这就是NodeJS非阻塞I/O的特点

总结一下:

Java、PHP也有办法实现并行请求(子线程),但NodeJS通过回调函数(Callback)和异步机制会做得很自然

4. NodeJS的优缺点

优点:

1. 高并发(最重要的优点)

2. 适合I/O密集型应用

    缺点:

1. 不适合CPU密集型应用;CPU密集型应用给Node带来的挑战主要是:由于JavaScript单线程的原因,如果有长时间运行的计算(比如大循环),将会导致CPU时间片不能释放,使得后续I/O无法发起;

解决方案:分解大型运算任务为多个小任务,使得运算能够适时释放,不阻塞I/O调用的发起;

2. 只支持单核CPU,不能充分利用CPU

3. 可靠性低,一旦代码某个环节崩溃,整个系统都崩溃

原因:单进程,单线程

解决方案:(1)Nnigx反向代理,负载均衡,开多个进程,绑定多个端口;

 (2)开多个进程监听同一个端口,使用cluster模块;

4. 开源组件库质量参差不齐,更新快,向下不兼容

5. Debug不方便,错误没有stack trace

总结

以上所述是小编给大家介绍的Node.js简单入门前传,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
js函数使用技巧之 setTimeout(function(){},0)
Feb 09 Javascript
javascript 节点遍历函数
Mar 28 Javascript
解析js如何获取当前url中的参数值并复制给input
Jun 23 Javascript
jquery ajax,ashx,json的用法总结
Feb 12 Javascript
了不起的node.js读书笔记之mongodb数据库交互
Dec 22 Javascript
Javascript中使用A标签获取当前目录的绝对路径方法
Mar 02 Javascript
JavaScript获得当前网页来源页面(即上一页)的方法
Apr 03 Javascript
JavaScript判断IE版本型号
Jul 27 Javascript
Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)
Sep 09 Javascript
vue 使用eventBus实现同级组件的通讯
Mar 02 Javascript
webpack实现一个行内样式px转vw的loader示例
Sep 13 Javascript
在Vue项目中用fullcalendar制作日程表的示例代码
Aug 04 Javascript
详解基于webpack2.x的vue2.x的多页面站点
Aug 21 #Javascript
Vue中的ref作用详解(实现DOM的联动操作)
Aug 21 #Javascript
jquery动态赋值id与动态取id方法示例
Aug 21 #jQuery
详解webpack的配置文件entry与output
Aug 21 #Javascript
jQuery模拟爆炸倒计时功能实例代码
Aug 21 #jQuery
原生JS 购物车及购物页面的cookie使用方法
Aug 21 #Javascript
webpack3+React 的配置全解
Aug 21 #Javascript
You might like
PHP 和 XML: 使用expat函数(二)
2006/10/09 PHP
从Web查询数据库之PHP与MySQL篇
2009/09/25 PHP
php下使用curl模拟用户登陆的代码
2010/09/10 PHP
windows下apache搭建php开发环境
2015/08/27 PHP
php中引用&的用法分析【变量引用,函数引用,对象引用】
2016/12/12 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
2017/12/25 PHP
PHP goto语句用法实例
2019/08/06 PHP
jquery 图片 上一张 下一张 链接效果(续篇)
2010/04/20 Javascript
纯JS实现的批量图片预览加载功能
2011/08/14 Javascript
当滚动条滚动到页面底部自动加载增加内容的js代码
2014/05/13 Javascript
js树插件zTree获取所有选中节点数据的方法
2015/01/28 Javascript
javascript文件加载管理简单实现方法
2015/07/25 Javascript
jQuery实现ajax调用WCF服务的方法(附带demo下载)
2015/12/04 Javascript
jquery淡入淡出效果简单实例
2016/01/14 Javascript
javascript 利用arguments实现可变长参数
2016/11/21 Javascript
Vuex之理解Mutations的用法实例
2017/04/19 Javascript
详解Vue基于vue-quill-editor富文本编辑器使用心得
2019/01/03 Javascript
利用vue重构有赞商城的思路以及总结整理
2019/02/21 Javascript
laravel-admin 与 vue 结合使用实例代码详解
2019/06/04 Javascript
JavaScript实现简单的图片切换功能(实例代码)
2020/04/10 Javascript
解决父组件将子组件作为弹窗调用只执行一次created的问题
2020/07/24 Javascript
[04:46]2018年度玩家喜爱的电竞媒体-完美盛典
2018/12/16 DOTA
Python 列表(List)操作方法详解
2014/03/11 Python
Python中不同进制互相转换(二进制、八进制、十进制和十六进制)
2015/04/05 Python
Django的数据模型访问多对多键值的方法
2015/07/21 Python
tensorflow建立一个简单的神经网络的方法
2018/02/10 Python
Python调用shell cmd方法代码示例解析
2020/06/18 Python
阿联酋网上花店:Ferns N Petals
2018/02/14 全球购物
俄罗斯最大的香水和化妆品网上商店:Randewoo
2020/11/05 全球购物
什么是Assembly(程序集)
2014/09/14 面试题
品恩科技软件测试面试题
2014/10/26 面试题
寄语是什么意思
2014/04/10 职场文书
2014年教师学期工作总结
2014/11/08 职场文书
质量保证书格式模板
2015/02/27 职场文书
分享:关于学习的励志名言赏析
2019/08/16 职场文书
Linux7.6二进制安装Mysql8.0.27详细操作步骤
2021/11/27 MySQL