NodeJS
多进程
- Node本身是单线程,可以通过child_process来启动多个进程防止阻塞主进程
- 可以通过exec、execFile、spawn、fork四种方式来创建子进程
- exec为直接调用操作系统的命令启动进程,spawn则是支持流式的与操作系统进程进行交互
- execFile用于直接执行操作系统中的某个命令文件
- fork则是创建一个新的Node进程,并且支持父子进程之间通过message的方式进行通信
EvenEmitter
- 基于观察者模式实现的一个事件监听和分发机制,通过on去监听事件、emit触发事件、removeListener移除监听
- 具体实现:使用对象存储所有events,key为事件名称,value为监听的回调数组,on方法调用时往回调数组中push,emit则顺序执行,当执行出错时抛出error事件
Stream和Buffer
- Buffer为类数组对象,对象中的每个元素都是8字节整数
- Buffer通常用于读取文件内容或net模块网络通信
- Buffer.from 用于从字符串创建Buffer,Buffer.toString 可以将Buffer对象转为字符串
- Stream对象是基于EventEmitter实现的可读写流式对象,支持边读边写
- fs.createReadStream可用来创建读文件流,fs.createWriteStream用来创建写文件流
Http
- http.createServer创建http服务器
node优势
- nodejs 异步编程模型:采用了事件驱动、非阻塞I/O模型,适合高并发。
- js语言优势,社区活跃。
Nodejs编程模式
异步编程模式,非阻塞IO,事件驱动模型,允许I/O不阻塞的情况下执行其他任务。
node 的事件循环
nodejs是异步编程模式,其在执行过程中维护了一个栈,会将事件的上下文放入栈中,当遇到异步事件不会阻塞栈中事件继续执行,当执行到异步事件的回调,会将回调事件放到队列中。当栈中的事件执行完成,会将队列中的事件放入到栈中,继续下一次执行。而队列中任务分为宏任务和微任务,优先执行微任务队列中的任务。
Express
主要包含:
- Router:用于定义路由规则
- MiddleWare:中间件,用于拦截http请求,对事件进行预处理或后处理
- View engine: 视图引擎,渲染html
- Body-parser:解析POST请求的内容
- Cors:处理跨域资源共享
- Static: 静态文件处理
中间件
- 中间件可以有效的组织代码,便于理解维护。中间件负责执行异步操作,处理请求,响应任务。
- 中间件定义函数,函数包括request、response、和next函数。next用于通知下一个中间件开始执行。
- 中间件可以分为:应用级、路由级、错误处理中间件、内置中间件、第三方中间件。
- 使用app.use注册全局中间件
- 使用router.use 注册路由中间件
koa vs express
- koa执行到next会暂停当前中间件,而express 是执行完成。而且koa的next支持await。
- koa的参数是ctx,不同于express是request和response。
- koa需要单独引入koa-router定义路由
常见的koa第三方中间件
- koa-router
- koa-bodyparser
- koa-jwt
- koa-mount
- koa-static
RPC通信
- RPC通信是两台服务器进行的通信,采用的是TCP协议。
- 含有单工通信,双工通信,半双工通信
- 使用的是二进制协议,体积更小,编解码速度更快
- 使用buffer创建二进制,常用protobufjs进行创建。
- 使用的net模块进行的通信。
进程 vs 线程
进程包含多个线程:进程是程序执行的实例,包含独立的内存和系统资源。 线程是进程的一个实体:是CPU调度的基本单位。
nodejs并发
- node是使用事件驱动和非阻塞IO,使得Nodejs在处理高并发的时候保持较低资源损耗。
- 单线程非阻塞异步IO:可以允许nodejs在等待IO操作的时候,执行其他工作
- 事件循环:事件循环机制允许在处理并发操作的时候保持高性能。
- 使用集群(Cluster)模块,允许创建多进程共享端口。每个进程都在单独的v8实例中,可以充分利用多核CPU优势。
js
cluster.isMaster //判断主进程
cluster.fork() //创建子进程
cluster.on //对进程进行监听
nodejs监控
- 使用node函数Process.memoryUsage(),此函数返回一个Node进程的内存使用情况。可以定期调用;使用node内置工具--perf
- 使用第三方工具,如:heapdump,返回进程快照。
- 开发阶段,使用ad压测,结合chrome devtool 查看内存使用情况。
- 使用垃圾回收日志--log-gc,可以通过日志分析垃圾回收释放的内存。
- 使用pm2