RPC
远程过程调用(英语:Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一个地址空间(通常为一个开放网络的一台计算机)的子程序,而程序员就像调用本地程序一样,无需额外地为这个交互作用编程(无需关注细节)。
RPC是一种服务器-客户端(Client/Server)模式,经典实现是一个通过发送请求-接受回应进行信息交互的系统。 接口定义语言 (IDL) - 用于描述软件组件的应用程序编程接口 (API) 的规范语言 - 常用于远程过程调用软件。在这种情况下,IDL 在链路两端的机器之间提供了一座桥梁,这些机器可能使用不同的操作系统 (OS) 和计算机语言。
RPC让远程调用就像本地调用一样。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E8V5Rulv-1653544511206)(C:\Users\阿达西\Desktop\picgo-master\rpc.png)]
- 服务调用方(client)以本地调用方式调用服务;
- client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;
- client stub找到服务地址,并将消息发送到服务端;
- server 端接收到消息;
- server stub收到消息后进行解码;
- server stub根据解码结果调用本地的服务;
- 本地服务执行并将结果返回给server stub;
- server stub将返回结果打包成能够进行网络传输的消息体;
- 按地址将消息发送至调用方;
- client 端接收到消息;
- client stub收到消息并进行解码;
- 调用方得到最终结果。
使用RPC框架的目标是只需要关心第1步和最后1步,中间的其他步骤统统封装起来,让使用者无需关心。例如社区中各式RPC框架(grpc、thrift等)就是为了让RPC调用更方便。
gRPC
gRPC
是一种现代化开源的高性能RPC框架,能够运行于任意环境之中。最初由谷歌进行开发。它使用HTTP/2
作为传输协议。
gRPC
客户端和服务端可以在多种环境中运行和交互,例如用yava
写一个服务端,可以用go
语言写客户端调用。
数据在进行网络传输的时候,需要进行序列化,序列化协议有很多种,比如xml、json、protobuf 等。gRPC默认使用protocol buffers
,这是google开源的一套成熟的结构数据序列化机制。
序列化:将数据结构或对象转换成二进制串的过程。
反序列化:将在序列化过程中所产生的二进制转换成数据结构或对象的过程。
protocol buffers
protobuf
是一种高效的数据格式,平台无关、语言无关、可扩展,可用于 RPC 系统和持续数据存储系统。
Protobuf
全称 Protocol Buffer
,是 Google 公司于2008年开源的一种语言无关、平台无关、可扩展的用于序列化结构化数据——类似于XML,但比XML更小、更快、更简单,它可用于(数据)通信协议、数据存储等。你只需要定义一次你想要的数据结构,然后你就可以使用特殊生成的源代码来轻松地从各种数据流和各种语言中写入和读取你的结构化数据。目前 Protobuf 被广泛用作微服务中的通信协议。
protobuf优势
- 序列化后体积相比较
Json
和XML
很小,适合网络传输 - 支持跨平台多语言
- 序列化反序列化速度很快
protobuf使用
protobuf
是一个与语言无关的一个数据协议,所以我们需要先编写IDL文件然后借助专用工具生成指定语言的代码,从而实现数据的序列化与反序列化过程。
大致开发流程如下:
- IDL编写
- 生成指定语言的代码
- 序列化和反序列化
protoc 详细安装和使用用法:Go Protobuf 简明教程 | 快速入门 | 极客兔兔 (geektutu.com)