RPC框架 | 青训营笔记

70 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 13 天

RPC框架

定义

远程过程调用(Remote Procedure Call,缩写 RPC)是一个请求-响应协议,允许允许于一台计算机的程序调用另一台计算机的子程序,而无需开发人员额外地为这个交互作用编程。RPC 是一个客户端-服务端(C/S)的例子,总是由客户端对服务器发出一个执行若干过程请求,并携带服务端所需的参数;服务端使用客户端提供的参数处理请求,将执行结果返回给客户端。

流程

  1. client调用client stub,本地过程调用,参数以正常方式压入堆栈
  2. client stub 将参数打包成一个消息,然后发送这个消息。这个打包过程也称为marshalling
  3. client所在的操作系统将消息发送给server
  4. server所在的操作系统将收到的包传给server stub
  5. server stub解包得到参数。解包也称作unmarshalliing
  6. 最后server stub执行服务程序。反方向同样步骤将结果返回给客户端

示例

Go 官方提供一个标准 RPC库: net/rpc。 Golang 的 rpc 支持三个级别的 RPC: TCP、HTTP、JSONRPC。但 Go 的 RPC 包只支持 Go 开发的服务器与客户端之间的交互,因为内部采用 Gob 来编码。 Go RPC 服务端通过注册对象,使用对象的类型名暴露服务。服务端可以注册多个不同类型的对象,不能注册相同类型的多个对象。并且对象的方法需要被远程访问,必须满足以下的条件:

  • 方法的类型是可输出的 (the method’s type is exported)
  • 方法本身也是可输出的 (the method is exported)
  • 方法必须由两个参数,必须是输出类型或者是内建类型 (the method has two arguments, both exported or builtin types)
  • 方法的第二个参数必须是指针类型 (the method’s second argument is a pointer)
  • 方法返回类型为 error (the method has return type error)