背景
随着 Nodejs 的兴起,越来越多的 Web 服务中间层被搭建起来。如 Node 服务端渲染,BFF(Backend For Frontend))层,而 RPC 是远端过程调用,经常用于 BFF 层。最近,我打算写一个中间层,用 Nodejs 调用 Go 服务,除了可以简单用 http 调用之外,发现还有基于 RPC 的调用就研究了一下。
RPC简介
RPC(Remote Procedure Call)中文名「远程过程调用」,拆开理解,「过程」也叫方法或函数,「远程」就是说方法不在当前进程里,而是在其他进程或机器上面,合起来 RPC 就是调用其他进程或机器上面的函数。简单讲,就是本地调用的逻辑处理的过程放在的远程的机器上,而不是本地服务代理来处理。一个完整的 RPC 框架主要有三部分组成:通信框架、通信协议、序列化和反序列化格式。
前端视角看RPC
与 Ajax 对比相同点
与 Ajax 对比不相同点
https://域名/xxx
,服务器需要根据域名区寻找对应的 IP 地址,这就是 DNS 寻址过程,而 RPC 一般用在内网之间互相请求,一般使用特有服务进行寻址。RPC与HTTP区别
RPC基本原理
首先来看看一个 基于 TCP 的 RPC 调用的基本流程,以便对它有个宏观的认识。
RPC 的目标就是要将 2~8 这些步骤都封装起来,让用户对这些细节透明。
简单RPC通信协议设计
通常它由一个 Header 和一个 Payload(类似于 HTTP 的 Body)组成,合起来叫一个包(Packet)。之所以要有包,是因为二进制只完成 Stream 的传输,并不知道一次数据请求和响应的起始和结束,我们需要预先定义好包结构才能做解析。
协议设计就像把一个数据包按顺序切分成若干个单位长度的「小格子」,然后约定每个「小格子」里存储什么样的信息,一个「小格子」就是一个 Byte,它是协议设计的最小单位,1 Byte 是 8 Bit,可以描述 0 ~ 2^8 个字节数,具体使用多少个字节要看实际存储的信息。
简单包结构设计
0 1 2 3 4 5 6 7 8 9 10
+------+------+------+------+------+------+------+------+------+------+
| type | requestId | codec| bodyLength |
+------+---------------------------+------+---------------------------+
| ... payload |
| ... |
+---------------------------------------------------------------------+
这已经是可以工作的 RPC 通讯协议了,但随着 RPC 功能的增加我们可能需要记录更多的信息,这里就不说了。可以自行再了解。
Nodejs实现RPC通信协议
Nodejs 中有个 Buffer 模块,可以提供对二进制数据的操作。所以我们可以用来进行二进制的编码和解码,结合上面的通信协议,可以写出编码和解码部分代码。
简单编码部分
// 编码
const payload = {
service: 'com.test',
methodName: 'plus',
args: [ 1, 2 ],
};
const body = new Buffer(JSON.stringify(payload));
const header = new Buffer(10);
header[0] = 0;
header.writeInt32BE(1000, 1);
header[5] = 1; // codec => 1 代表是 JSON 序列化
header.writeInt32BE(body.length, 6);
const packet = Buffer.concat([ header, body ], 10 + body.length);
简单解码部分
// 解码
const type = buf[0]; // => 0 (request)
const requestId = buf.readInt32BE(1); // => 1000
const codec = buf[5];
const bodyLength = buf.readInt32BE(6);
const body = buf.slice(10, 10 + bodyLength);
const payload = JSON.parse(body);
极客时间上,也有介绍基于 TCP 的,半双工通信及全双工通信的代码,有兴趣可以看看这个:https://github.com/geektime-geekbang/geek-nodejs/tree/master/chapter2/rpc
Nodejs流行的RPC框架
grpc
—— https://grpc.io, 这个是国外比较流行的,有 google 背书,支持多语言,听说使用的公司也比较多,看上去是比较成熟的框架。sofa
—— https://tech.antfin.com/sofa 这个是国内阿里开源的,目前阿里开源的 Eggjs 框架也开源了基于 sofa 的最佳实践。DUBBO
—— 阿里开源的 java RPC 框架参考资料
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有