RPC简介
RPC(Remote Procedure Call),即远程过程调用。它允许像调用本地服务一样调用远程服务。RPC是一种服务器-客户端(Client/Server)模式,经典实现是一个通过发送请求-接受回应进行信息交互的系统。首先与RPC(远程过程调用)相对应的是本地调用。本地调用实例如下:
import "fmt"
func add(x, y int)int{
return x + y
}
func main(){
// 调用本地函数add
a := 10
b := 20
ret := add(x, y)
fmt.Println(ret)
}
将上述程序编译运行,会输出结果30。
以上流程,可以理解为以下四个步骤:
- 将变量 a 和 b 的值分别压入堆栈上
- 执行 add 函数,从堆栈中获取 a 和 b 的值,并将它们分配给 x 和 y
- 计算 x + y 的值并将其保存到堆栈中
- 退出 add 函数并将 x + y 的值赋给 ret
RPC设计组成
RPC技术在架构设计上有四部分组成,分别是:客户端、客户端存根、服务端、服务端存根。
客户端和服务端属于程序设计架构的一种方式,在现代的计算机软件程序架构设计上,大方向上分为两种方向,分别是:B/S架构、C/S架构。B/S架构指的是浏览器到服务器交互的架构方式,另外一种是在计算机上安装一个单独的应用,称之为客户端,与服务器交互的模式。
由于在服务的调用过程中,有一方是发起调用方,另一方是提供服务方。因此,我们把服务发起方称之为客户端,把服务提供方称之为服务端。以下是对RPC的四种角色的解释和说明:
- 客户端(Client): 服务调用发起方,也称为服务消费者。
- 客户端存根(Client Stub): 该程序运行在客户端所在的计算机机器上,主要用来存储要调用的服务器的地址,另外,该程序还负责将客户端请求远端服务器程序的数据信息打包成数据包,通过网络发送给服务端Stub程序;其次,还要接收服务端Stub程序发送的调用结果数据包,并解析返回给客户端。
- 服务端(Server): 远端的计算机机器上运行的程序,其中有客户端要调用的方法。
- 服务端存根(Server Stub): 接收客户Stub程序通过网络发送的请求消息数据包,并调用服务端中真正的程序功能方法,完成功能调用;其次,将服务端执行调用的结果进行数据处理打包发送给客户端Stub程序。