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 objectvar schema = protobuf(fs.readFileSync(__dirname + 'test.proto', 'utf-8'))// 生成 Buffervar 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;}
