故事背景
socket.io, node.js, koa为首的一些通信框架和后端技术点。
之后有必要过一遍《NodeJS 设计模式》。
基础概念
一、短轮询、长轮询(comet)、长连接(SSE)、WebSocket
- 基本概念
Ref: [Node.js] 01 - How to learn node.js
① 短轮询 - 服务器立即响应
② comet 长轮询 - 服务器觉得有必要时(比如发生了变化)才响应
③ SSE - 支持了服务器端的推送
④ WebSocket - 全双工,http的扩展 - Netty, nodejs就是基于此技术的例子
- 最简单的http服务器
使用了“包”,也就是require(<包>),也就谈到了npm, package.json文件。
var http = require('http'); http.createServer( function (request, response) { // 发送 HTTP 头部
// HTTP 状态值: 200 : OK
// 内容类型: text/plain
response.writeHead (200, {'Content-Type': 'text/plain'}); // 发送响应数据 "Hello World"
response.end ('Hello World\n');
}).listen(8888); // 终端打印如下信息
console.log('Server running at http://127.0.0.1:8888/');
超级简单的服务器
二、单线程模型架构
与Unix环境系统编程的API很像。
Ref: [Node.js] 02 - Read Eval Print Loop
var exec = require('child_process').exec;
var shell = require("shelljs");
/**
* 参数处理模块,变化无穷
*/
var argv = require('yargs').argv;
三、Buffer 类
Ref: [Node.js] 03 - Buffer, Stream and File IO
一个 Buffer 类似于一个整数数组,但它对应于 V8 堆内存之外的一块原始内存。
一种功能更为全面的Array。
四、文件系统操作
Ref: Node.js v10.5.0 Documentation
var fs = require("fs");
文件读写 默认是异步。
文件流 与事件触发相结合。
const os = require('os');
系统本身的API对接。
五、事件触发
- 基本概念
Ref: [Node.js] 04 - Event and Callback
Node.js 的每一个 API 都是异步的
Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。
var events = require('events');
var eventEmitter = new events.EventEmitter(); eventEmitter.on() # 绑定事件
eventEmitter.emit() # 触发事件
参见链接中的:一个综合性的例子
- 事件触发的继承
大多数时候我们不会直接使用 EventEmitter,而是在对象中继承它。
包括 fs、net、 http 在内的,只要是支持事件响应的核心模块都是 EventEmitter 的子类。
举例:老师喊一嗓子,触发每个学生对象喊一句“到”。
六、模块知识
具体参见:[Node.js] 05 - Modules and Function
var util = require('util');
Node 服务器
一、写个服务器
可见,node方式写server之简洁明了。
var http = require('http'); http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(1337, "127.0.0.1"); console.log('Server running at http://127.0.0.1:1337/');
二、服务器性能
Ref: [Node.js] 06 - Multi-thread and process module
- 服务器扩展性
- X轴方向:服务实例拓展
- y轴方向:功能性的拓展
- z轴方向:按照业务数据对服务进行拓展(更多的服务分别处理不同的业务)
- Microservices
微服务的容错性 ----> Unity的自治思想
-
对比 Netty
- 线程数:100;循环次数:100;
- 线程数:1000;循环次数:10;
- 线程数:1000;循环次数:100;
Multi-thread/process 实践
Ref: [Node.js] 06 - Multi-thread and process module
JS本身的异步方法,以及node封装的系统接口。
/* implement */
Server 框架
Express 与 Koa 实践,包括涉及到的负载平衡以及相关方案。
如何做massive requests的压力测试?
/* implement */