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. 单进程,单线程
异步、事件驱动模型
我们同样是要发起请求,等待服务器端响应;但是与银行例子不同的是,这次我们点完餐后拿到了一个号码,
拿到号码,我们往往会在位置上等待,而在我们后面的请求会继续得到处理,同样是拿了一个号码然后到一旁等待,接待员能一直进行处理。
等到饭菜做号了,会喊号码,我们拿到了自己的饭菜,进行后续的处理(吃饭)
这个喊号码的动作在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为例
假如获取profile和timeline操作各需要1s,那么串行获取就需要2s
(2)nodejs非阻塞i/o,发射/监听事件来控制执行过程
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简单入门前传,希望对大家有所帮助
如对本文有疑问, 点击进行留言回复!!
解决vue 项目使用webpack打包后,直接打开dist文件夹下的页面空白的问题
vscode写vue代码时常用格式化设置,解决格式化函数名后空格消失问题等...
网友评论