Remote Procedure Call 远程过程调用
和 ajax的相同点
- 都是2个计算机之间的网络通信
- 需要双方约定一个数据格式
Ajax,本地电脑和服务器的通信
RPC,服务器和另外一台服务器的通信
和 ajax的不同点
- 不一定适用 DNS作为寻址服务
- 应用层协议一般不用 http
- 基于 TCP或 UDP协议
RPC一般是内网之前的请求
寻址&负载均衡
Ajax:使用 DNS进行寻址
域名换 IP,DNS
PRC:使用特有服务进行寻址
多路复用
TCP通信
单工、半双工、全双工通信
https://blog.csdn.net/a3192048/article/details/85319182
单工通信
- 消息只能单方向传输的工作方式。例如遥控、遥测,就是单工通信方式
半双工通信
Half Duplex
- 双向交替通信
- 轮番单工通信
全双工通信
- 自由的通信
- 客户端和服务器互相发送消息
二进制协议
- 更小的数据包体积
- 更快的编码,解码速率
html协议
- html string
- json
PRC通信,采用二进制协议
二进制流
Butter解码二进制数据包
解码二进制数据包
把数据编码为一个二进制的数据包,
protocol butter
二进制编码库,兼容 JS,不是一 nodejs为标准实现的
https://github.com/protocolbuffers/protobuf
推荐使用 npm protocol-buffers
https://www.npmjs.com/package/protocol-buffers
protocol-buffers
编码 数据格式
解码 二进制为 数据格式
npm install protocol-buffers
使用
const protobuf = require('protocol-buffers')
// pass a proto file as a buffer/string or pass a parsed protobuf-schema object
var schema = protobuf(fs.readFileSync(__dirname + 'test.proto', 'utf-8'))
// 生成 Buffer
var buf = schema.Test.encode({
num: 42,
payload: 'hello world'
})
console.log(buf)
// 解码,数字会出现精度问题
const butter = schema.Test.decode(buffer);
test.proto
enum FOO {
BAR = 1;
}
message Test {
required float num = 1;
required string payload = 2;
}
message AnotherOne {
repeated FOO list = 1;
}