Remote Procedure Call 远程过程调用

和 ajax的相同点

  1. 都是2个计算机之间的网络通信
  2. 需要双方约定一个数据格式

Ajax,本地电脑和服务器的通信
RPC,服务器和另外一台服务器的通信

和 ajax的不同点

  1. 不一定适用 DNS作为寻址服务
  2. 应用层协议一般不用 http
  3. 基于 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

编码 数据格式
解码 二进制为 数据格式

  1. npm install protocol-buffers

使用

  1. const protobuf = require('protocol-buffers')
  2. // pass a proto file as a buffer/string or pass a parsed protobuf-schema object
  3. var schema = protobuf(fs.readFileSync(__dirname + 'test.proto', 'utf-8'))
  4. // 生成 Buffer
  5. var buf = schema.Test.encode({
  6. num: 42,
  7. payload: 'hello world'
  8. })
  9. console.log(buf)
  10. // 解码,数字会出现精度问题
  11. const butter = schema.Test.decode(buffer);

test.proto

  1. enum FOO {
  2. BAR = 1;
  3. }
  4. message Test {
  5. required float num = 1;
  6. required string payload = 2;
  7. }
  8. message AnotherOne {
  9. repeated FOO list = 1;
  10. }

多路复用的 RPC通道