Skip to content

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优势

  1. nodejs 异步编程模型:采用了事件驱动、非阻塞I/O模型,适合高并发。
  2. js语言优势,社区活跃。

Nodejs编程模式

异步编程模式,非阻塞IO,事件驱动模型,允许I/O不阻塞的情况下执行其他任务。

node 的事件循环

nodejs是异步编程模式,其在执行过程中维护了一个栈,会将事件的上下文放入栈中,当遇到异步事件不会阻塞栈中事件继续执行,当执行到异步事件的回调,会将回调事件放到队列中。当栈中的事件执行完成,会将队列中的事件放入到栈中,继续下一次执行。而队列中任务分为宏任务和微任务,优先执行微任务队列中的任务。

Express

主要包含:

  1. Router:用于定义路由规则
  2. MiddleWare:中间件,用于拦截http请求,对事件进行预处理或后处理
  3. View engine: 视图引擎,渲染html
  4. Body-parser:解析POST请求的内容
  5. Cors:处理跨域资源共享
  6. Static: 静态文件处理

中间件

  1. 中间件可以有效的组织代码,便于理解维护。中间件负责执行异步操作,处理请求,响应任务。
  2. 中间件定义函数,函数包括request、response、和next函数。next用于通知下一个中间件开始执行。
  3. 中间件可以分为:应用级、路由级、错误处理中间件、内置中间件、第三方中间件。
  4. 使用app.use注册全局中间件
  5. 使用router.use 注册路由中间件

koa vs express

  1. koa执行到next会暂停当前中间件,而express 是执行完成。而且koa的next支持await。
  2. koa的参数是ctx,不同于express是request和response。
  3. koa需要单独引入koa-router定义路由

常见的koa第三方中间件

  • koa-router
  • koa-bodyparser
  • koa-jwt
  • koa-mount
  • koa-static

RPC通信

  1. RPC通信是两台服务器进行的通信,采用的是TCP协议。
  2. 含有单工通信,双工通信,半双工通信
  3. 使用的是二进制协议,体积更小,编解码速度更快
  4. 使用buffer创建二进制,常用protobufjs进行创建。
  5. 使用的net模块进行的通信。

进程 vs 线程

进程包含多个线程:进程是程序执行的实例,包含独立的内存和系统资源。 线程是进程的一个实体:是CPU调度的基本单位。

nodejs并发

  1. node是使用事件驱动和非阻塞IO,使得Nodejs在处理高并发的时候保持较低资源损耗。
  2. 单线程非阻塞异步IO:可以允许nodejs在等待IO操作的时候,执行其他工作
  3. 事件循环:事件循环机制允许在处理并发操作的时候保持高性能。
  4. 使用集群(Cluster)模块,允许创建多进程共享端口。每个进程都在单独的v8实例中,可以充分利用多核CPU优势。
js
cluster.isMaster //判断主进程

cluster.fork() //创建子进程

cluster.on //对进程进行监听

nodejs监控

  1. 使用node函数Process.memoryUsage(),此函数返回一个Node进程的内存使用情况。可以定期调用;使用node内置工具--perf
  2. 使用第三方工具,如:heapdump,返回进程快照。
  3. 开发阶段,使用ad压测,结合chrome devtool 查看内存使用情况。
  4. 使用垃圾回收日志--log-gc,可以通过日志分析垃圾回收释放的内存。
  5. 使用pm2