【Node.js】学习系列10-从前端的角度讲RPC是什么和buffer模块

文章目录

  • 简介
  • TCP通信方式
  • buffer模块
  • protocol-buffers

简介

Remote Procedure Call(远程过程调用),和ajax很像,是服务器与服务器之间的网络通信,都需要双方约定一个数据格式。

与ajax的不同:

  • 一般是内网之间请求,不一定使用DNS。例如服务器A拿着服务器B的唯一标识符id或者其他,去负载均衡服务器找到服务器B的IP,就可以请求了;
  • 应用层协议一般不使用http,使用二进制协议,性能上有优势,有更小的体积,更快的编解码速率;
  • 基于 TCP 或 UDP 协议;

TCP通信方式

  • 单工通信:在通信中只能一方传给另一方,不能同时多条发送;
  • 半双工通信:就是轮番的单工通信,a给b完后b给a,以此往复,双方不能同时发送;
  • 全双工通信:双方随便发;

全双工通信成本高,难度高,所以很多都采用半双工通信;

题外话:vue工程启动时,其实本地会启动服务,与放入服务的编译页面文件形成全双工通信,触及热刷新(可能描述不准确,将来细讲)。

buffer模块

简单介绍使用方法,具体看官网;

/* Buffer 对象用于表示固定长度的字节序列,下面创建几个buffer */
const buffer1 = Buffer.from("求求别再卷了") // 
const buffer2 = Buffer.from([1, 2, 3, 99]) // 
const buffer3 = Buffer.alloc(20) // 

/* 每一个数都是一个十六进制数,两个数字为一位,位的下标和数组一样从0开始 */
// int8占1位,int16占2位
buffer2.writeInt8(12, 1) //  往第二位写入12
buffer2.writeInt16BE(512, 2) //  往第三位写入512,由于int16占两位,所以第四位也被拿来用了。且BE表示高位排前面。
// buffer2.writeInt16LE(512, 2) //  高位排后面了

如果用原生的方法去写一个二进制编码,需要通过各种write函数去塞入数据,很麻烦,所以业界出现了很多解决方案,例如protocol buffer,是谷歌弄出的二进制编码库,这个库和语言无关,任何语言都能使用。但前端中,目前只支持到浏览器环境的js,node环境需要用到另一个叫protocol-buffers的npm包(真是没道理哈哈哈)。

protocol-buffers

首先引入这个包

npm init
npm i protocol-buffers

创建个test.proto文件,里面设定buffer格式

设定普通文本的结构体:
message Course {
    required float id = 1;
    required string name = 2;
    repeated Lesson lesson = 3;
}

message Lesson {
    required float id = 1;
    required string title = 2;
}

然后引入这个文件进行编码:

const fs = require('fs');
const protobuf = require('protocol-buffers');

// 根据协议,编译出一个js逻辑对象,里面包含encode和decode函数
// 实际写web服务器的时候,注意这个操作可以直接在进程启动就做
// 否则在http处理过程里做的话,是一次不必要的性能消耗
const schemas = protobuf(fs.readFileSync(`${__dirname}/test.proto`)); // 读取结构设计,并生成对象

const buffer = schemas.Course.encode({ // 编码符合结构的数据
  id: 4,
  name: 'hh',
  lesson: []
})
console.log(buffer); // 在前端被转成二进制编码
console.log(schemas.Course.decode(buffer)); // 后端解码

你可能感兴趣的:(Node.js)