首先我们要知道什么是node.js?
Node.js采用谷歌的V8引擎,是一个服务器端的、非阻断式I/O的、事件驱动的
JavaScript运行环境。
一、Node.js架构具体包含什么呢?咱们从一个图来看看会更加明白。
natives modules:
1.当前层内容由js实现 。
2.提供应用程序可直接调用库,例如fs、path、http等 。
3.js语言无法直接操作底层硬件设置 。
builtin modules - 胶水层 :
调用具体的c++函数的作用
底层:
1.v8:执行js代码,提供桥梁接口
功能: (自己编写的js代码,内置的js代码、第三方的代码)
提供接口,js与c或者c++之间[[的转换功能
- libuv:事件循环、事件队列、异步IO 。
- 第三方模块:zlib、http、c-ares等。
二、node.js最大的特点是非阻塞式IO即异步IO,那么异步IO是什么呢?
从下面的图我们先来看看什么是异步和同步。
阻塞IO的判断条件是什么呢:操作系统重复调用IO操作,判断IO是否结束 (轮询)。通俗的说就是在一个进程完成后再执行另一个进程,还是同时执行两个进行的问题。常见轮询技术有read 、select、 poll、kqueue、event ports。当然我们期望的是非阻塞IO。
Libuv是一个跨平台的的基于事件驱动的异步io库。但是他提供的功能不仅仅是io,包括进程、线程、信号、定时器、进程间通信等。下面是来自官网对Libuv架构的介绍图。
目前异步IO的特点为:
1.IO是应用程序的瓶颈所在
2.异步IO提高性能无需原地等待结果返回
3.IO操作属于操作系统系统级别,平台都有对应实现
4.Node.js单线程配合事件驱动架构及libuv实现了异步IO
三、事件循环(event loop)
NodeJs 在一个事件驱动的模型中工作,涉及到一个事件多路分用器(Event Demultiplexer) 和一个事件队列(Event Queue)。所有的 I/O 请求最终会生成一个成功或失败的事件或其他的触发器,叫做事件(Event)。根据下面这些算法处理这些事件。
1.事件多路分用器接受 I/O 请求并且委托这些请求给适当的硬件。
2.一旦 I/O 请求处理了(例如:一个文件里里面的数据可以读取,从一个 socket 的数据可以读取等),事件多路 分用器为在一个需要处理的队列中的特定行为添加注册的回调处理器。这些回调被称为事件,事件添加的队列被称为事件队列。
3.当在一个事件队列中有可以处理的事件的时候,会按接受它们的顺序循环执行,直到队列为空。
4.如果在事件队列中没有事件或者事件多路分用器没有即将发生的请求,程序会完成。否则,这个过程会从第一步开始继续。
协调整个机制的程序被称为事件循环(Event Loop)。
四、事件驱动架构
事件驱动架构是软件开发中的通用模式,他和发布订阅、观察者比较类似,他们的共同特点:主体发布消息,其它实例接受消息。
nodejs为事件提供了一个专门的模块:lib/events.js。 events常用的方法有两个,分别是on和emit,on用来监听事件,emit用来触发事件。
五、Node.js应用场景
1.IO密集型高并发请求
2.操作数据库提供API服务
3.实时聊天应用程序
六、Node.js实现API服务的步骤是什么?
1. npm init -y 初始化项目 。
2. npm install -g typescript 全局安装typescript 。
3. tsc --init 生成tsconfig.json 配置文件 。
4. npm install -g ts-node 开发时运行ts文件。
5. 写需求代码 。
6. 引入express npm i express 类型npm i @types/express -D。