Nodejs 之 RPC 协议简介

article/2025/9/19 4:25:37

背景

随着 Nodejs 的兴起,越来越多的 Web 服务中间层被搭建起来。如 Node 服务端渲染,BFF(Backend For Frontend))层,而 RPC 是远端过程调用,经常用于 BFF 层。最近,我打算写一个中间层,用 Nodejs 调用 Go 服务,除了可以简单用 http 调用之外,发现还有基于 RPC 的调用就研究了一下。

RPC简介

RPC(Remote Procedure Call)中文名「远程过程调用」,拆开理解,「过程」也叫方法或函数,「远程」就是说方法不在当前进程里,而是在其他进程或机器上面,合起来 RPC 就是调用其他进程或机器上面的函数。简单讲,就是本地调用的逻辑处理的过程放在的远程的机器上,而不是本地服务代理来处理。一个完整的 RPC 框架主要有三部分组成:通信框架、通信协议、序列化和反序列化格式。

前端视角看RPC

与 Ajax 对比相同点

  • 都是两个计算机之间的网络通信,Ajax 是浏览器和服务器通信,RPC 是服务器和服务器通信

  • 都需要双方约定一个数据格式

与 Ajax 对比不相同点

  • RPC 调用不一定使用 DNS 作为寻址服务,Ajax 一般是浏览器向服务器请求,请求地址一般是https://域名/xxx,服务器需要根据域名区寻找对应的 IP 地址,这就是 DNS 寻址过程,而 RPC 一般用在内网之间互相请求,一般使用特有服务进行寻址。

  • RPC 应用层协议一般不使用 HTTP,一般使用一些二进制协议,其优点是数据包体积更小、编解码速率更快。

  • RPC 基于 TCP 或 UDP 协议,其中 TCP 通信又存在多种通信方式,单工通信[两个服务器之间,只允许单向发送消息,如只能 A 给 B 发消息]、半双工通信[两个服务器之间,同一时间只允许单向发送消息,如时间段一 A 发给 B,时间段二 B 发给 A,又称为轮番单工通信]、全双工通信[可以自由互相发送消息]。

RPC与HTTP区别

  • RPC 通常所讲是一个框架,而 HTTP(HyperText Transfer Protocol) 是基于 TCP 的实现的超文本传输协议,HTTP 是无状态协议;最初用于浏览器与服务器的通信,后来广泛用于各个服务间的通信。

  • RPC 是远程过程调用,RPC 框架可以的通信过程可以使用各种通信协议(如 HTTP,TCP 以及各种自定义协议)实现。良好的 rpc 调用是面向服务的封装,针对服务的可用性和效率等都做了优化。单纯使用 http 调用则缺少了这些特性。

RPC基本原理

首先来看看一个 基于 TCP 的 RPC 调用的基本流程,以便对它有个宏观的认识。

  1. 调用方(Client)通过本地的 RPC 代理(Proxy)调用相应的接口

  2. 本地代理将 RPC 的服务名,方法名和参数等等信息转换成一个标准的 RPC Request 对象,即组装成能够进行网络传输的消息体

  3. RPC 框架采用 RPC 协议(RPC Protocol)将 RPC Request 对象序列化成二进制形式,然后通过 TCP 通道传递给服务提供方 (Server)

  4. 服务端(Server)收到二进制数据后,将它反序列化成 RPC Request 对象(解码)

  5. 服务端(Server)根据 RPC Request 中的解码信息找到本地对应的方法,传入参数执行,得到结果,并将结果封装成 RPC Response 交给 RPC 框架

  6. RPC 框架将 RPC Response 对象序列化成二进制形式,然后通过 TCP 通道传递给服务调用方(Client)

  7. 调用方(Client)收到二进制数据后,将它反序列化成 RPC Response 对象,并且将结果通过本地代理(Proxy)返回给业务代码

  8. 调用方(Client)得到最终结果。

RPC 的目标就是要将 2~8 这些步骤都封装起来,让用户对这些细节透明。

简单RPC通信协议设计

通常它由一个 Header 和一个 Payload(类似于 HTTP 的 Body)组成,合起来叫一个包(Packet)。之所以要有包,是因为二进制只完成 Stream 的传输,并不知道一次数据请求和响应的起始和结束,我们需要预先定义好包结构才能做解析。

协议设计就像把一个数据包按顺序切分成若干个单位长度的「小格子」,然后约定每个「小格子」里存储什么样的信息,一个「小格子」就是一个 Byte,它是协议设计的最小单位,1 Byte 是 8 Bit,可以描述 0 ~ 2^8 个字节数,具体使用多少个字节要看实际存储的信息。

简单包结构设计

  • 标记包的类型,比如:0 表示请求,1 表示响应,需要一个Byte

  • 关联ID,将请求和它对应的响应关联起来,这个 ID 我们选择用一个 Int32 类型(4 Bytes)自增的数字表示

  • Payload 长度记录,要能实现包的准确切割,我们需要明确包的长度,用4个Byte

  • 应用层协议类型标记,一个Byte

012345678910
+------+------+------+------+------+------+------+------+------+------+
| 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);

Nodejs流行的RPC框架

  1. grpc —— https://grpc.io, 这个是国外比较流行的,有 google 背书,支持多语言,听说使用的公司也比较多,看上去是比较成熟的框架。

  2. sofa —— https://tech.antfin.com/sofa 这个是国内阿里开源的,目前阿里开源的 Eggjs 框架也开源了基于 sofa 的最佳实践。

  3. DUBBO —— 阿里开源的 java RPC 框架


http://chatgpt.dhexx.cn/article/NwfjgDJe.shtml

相关文章

RPC协议底层原理与实现

RPC协议基本组成 在一个典型RPC的使用场景中,包含了服务发现、负载、容错、 网络传输 、 序列化 等组件,其中RPC协议就指明了程序如何进行网络传输和序列化 。也就是说一个RPC协议的实现就等于一个非透明的RPC调用,如何做到的的呢&#xff1f…

RPC详解

RPC是什么 RPC(Remote Procedure Call)远程过程调用协议,一种通过网络从远程计算机上请求服务,而不需要了解底层网络技术的协议。RPC它假定某些协议的存在,例如TPC/UDP等,为通信程序之间携带信息数据。在O…

深入理解RPC—协议

协议 一提到协议,你最先想到的可能是 TCP 协议、UDP 协议等等,并且这些网络传输协议的实现有点晦涩难懂。虽然在 RPC 中我们也会用到这些协议,但这些协议更多的是对我们上层应用是透明的,我们 RPC 在使用过程中并不太需要关注他们…

浅谈RPC协议

RPC协议 RPC简介为啥需要RPCRPC的调用过程gRPCProtoBuffergRPC实战 RPC简介 RPC(Remote Procedure Call Protocol)远程过程调用协议,目标就是让远程服务调用更加简单、透明。RPC 框架负责屏蔽底层的传输方式(TCP 或者 UDP&#x…

网络协议——RPC协议综述

拿最简单的场景,客户端调用一个加法函数,将两个整数加起来,返回它们的和。 如果放在本地调用,那是简单的不能再简单了,。但是一旦变成了远程调用,门槛一下子就上去了。 如何解决这五个问题? …

RPC(远程过程调用协议)简介

RPC框架解释 谁能用通俗的语言解释一下什么是 RPC 框架? - 远程过程调用协议RPC(Remote Procedure Call Protocol) 首先了解什么叫RPC,为什么要RPC,RPC是指远程过程调用,也就是说两台服务器A,B&#xff0…

RPC和HTTP

一、为什么需要RPC,而不是简单的HTTP接口? RPC(即Remote Procedure Call,远程过程调用),主要是基于TCP/IP协议;而HTTP服务主要是基于HTTP协议的。我们都知道HTTP协议是在传输层协议TCP之上的&a…

RPC入门总结(一)RPC定义和原理

转载:深入浅出 RPC - 浅出篇 转载:RPC框架与Dubbo完整使用 转载:深入浅出 RPC - 深入篇 转载:远程调用服务(RPC)和消息队列(Message Queue)对比及其适用/不适用场合分析 一、RPC 1. RPC是什么 RPC(Remote Proced…

RPC协议与Http协议区别

RPC调用 RPC是远程过程调用(Remote Procedure Call)的缩写形式。SAP系统RPC调用的原理其实很简单,有一些类似于三层构架的C/S系统,第三方的客户程序通过接口调用SAP内部的标准或自定义函数,获得函数返回的数据进行处理…

RPC——RPC协议介绍及原理详解

common wx:CodingTechWork 介绍 RPC框架 概念 RPC(Remote Procedure Call Protocol) 远程过程调用协议。RPC是一种通过网络从远程计算机程序上请求服务,不需要了解底层网络技术的协议。RPC主要作用就是不同的服务间方法调用就…

RPC协议简述

RPC是指远程过程调用,也就是说两台服务器,一个应用部署在其中一台服务器上,想要调用另外一台服务器上应用提供的函数(方法),由于不在一个内存空间,不能直接调用,需要通过网络来表达调…

一文带你搞懂HTTP和RPC协议的异同

1 什么是RPC协议 1.1 简介 这是老生常谈的协议了,RPC即远程过程调用(Remote Procedure Call), RPC协议是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。 1.2 原理及模型 RPC协议广泛的…

关于RPC协议的通俗理解

根据网上搜索的一些资料摘抄汇总的,如果有误,欢迎斧正。 作者:肖继潮 链接:http://www.zhihu.com/question/25536695/answer/31046384 来源:知乎 著作权归作者所有,转载请联系作者获得授权。 早期单机时代&…

NLP之中文命名实体识别

在MUC-6中首次使用了命名实体(named entity)这一术语,由于当时关注的焦点是信息抽取(information extraction)问题,即从报章等非结构化文本中抽取关于公司活动和国防相关活动的结构化信息,而人名…

命名实体识别(biLSTM+crf)

本文是翻译的github这个项目的博客https://guillaumegenthial.github.io/sequence-tagging-with-tensorflow.html。 为什么要用biLSTM?为了使特征提取自动化。当使用CRF工具来进行命名实体识别时,需要自定义模板(或者使用默认的模板)。 任…

命名实体识别(NER)算法

文章目录 标注方案问题建模评价指标常用的NER方法深度学习方法(in survey)输入的分布式表示上下文编码解码器**先说MLPsoftmax和CRF**softmax 延伸至多标签解码 **RNN**Pointer Networks 实践Bert SoftmaxBert CRF 参考 之前做了NER的相关工作&#xf…

命名实体识别(NER):BiLSTM-CRF原理介绍+Pytorch_Tutorial代码解析

本文较全面的介绍了命名实体识别(NER),包括NER定义、BiLSTM-CRF模型、Pytorch代码实现,未来将继续完善本文,以求涵盖NER众多方面。 文章目录 命名实体识别任务(NER)定义BiLSTM-CRF模型模型输入L…

命名实体识别代码阅读

中文命名实体识别 BERT中文任务实战 18分钟快速实战_哔哩哔哩_bilibili 注意注释 from transformers import AutoTokenizer import time # 时间start time.time() #加载分词器 tokenizer AutoTokenizer.from_pretrained(hfl/rbt6) #中文bertprint(tokenizer)#分词测试&am…

命名实体识别详解

1.命名实体识别定义 例如: 2.常用开源的中英文NER工具 这些工具的缺点是:只提供通用型的实体类别如 人名,地方,组织,时间等,对于特定领域,可能很难提取出你需要的实体。 2.1 代码实践 代码来…

命名实体识别(NER – Named-entity recognition) 总结

1. 什么是命名实体识别? 命名实体识别(Named Entity Recognition,简称NER),又称作“专名识别”,是指识别文本中具有特定意义的实体,主要包括人名、地名、机构名、专有名词等。简单的讲&#xf…