Remote Procedure Call —— 远程过程调用
与ajax的相同点:
1.都是两个计算机之间的网络通信
2.需要双方约定一个数据格式
与ajax的不同点:
- 不一定使用DNS作为寻址服务(RPC一般是在内网里面互相请求)
- 应用层协议一般不使用http(RPC使用二进制协议)
- 基于TCP或UDP协议
5月13号更新
寻址/负载均衡
ajax:使用DNS进行寻址(浏览器把域名发送给DNS转换成IP再返回给浏览器,浏览器再用这个IP去拿到数据。)
RPC:使用特有服务进行寻址。(利用统一标识符,例如id、vip发送给寻址服务器,寻址服务器再把IP返回给客户端服务器。然后客户端服务器将IP返回给另一台服务器再拿到数据。)
TCP通信
- 单工通信(永远只有一方给另一方发送数据)
- 半双工通信(同一时间内只有一端能给另外一端发送数据——轮番单工通信。)
- 全双工通信(客户端和服务端均可自由的通信。)
RPC调用二进制协议(二进制流0和1的形式)
http则是html和json的形式
- 更小的数据包体积
- 更快的解编码的速率
Node.js Buffer编解码二进制数据包
用处:处理TCP文件流的一些数据以及文件系统的一些数据
菜鸟教程的解释:
JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。
但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。
在 Node.js 中,Buffer 类是随 Node 内核一起发布的核心库。Buffer 库为 Node.js 带来了一种存储原始数据的方法,可以让 Node.js 处理二进制数据,每当需要在 Node.js 中处理I/O操作中移动的数据时,就有可能使用 Buffer 库。原始数据存储在 Buffer 类的实例中。一个 Buffer 类似于一个整数数组,但它对应于 V8 堆内存之外的一块原始内存。
const buffer1 = Buffer.from('huanyue');
const buffer2 = Buffer.from([0,1,2,3,4]);
const buffer3 = Buffer.alloc(20);
console.log(buffer1);
console.log(buffer2);
console.log(buffer3);
输出结果:
安装buffer包:
npm install protocol-buffers
可是我写了一个小demo奇妙的报错了:(未解决报错)
文件夹目录结构:
index.js部分的代码:
const fs = require('fs');
const protobuf = require('protocol-buffers');
const schema = protobuf(fs.readFileSync(__dirname + 'test.proto','utf-8'));
console.log(schema);
const buffer = schema.Column.encode({
id: 1,
name: Node.js,
price: 99.99
});
console.log(schema.Column.decode(buffer));
test.proto部分代码:
message Column {
required int32 id = 1;
required string name = 2;
required float price = 3
}
查了一些博客,但是还没有眉目,稍后再看看吧~