RPC框架在分布式系统中, 尤其是大型系统, 应用非常广泛, 它相对于http的系统调用更为效率高。本文主要介绍如何使用RPC以及golang 中的gorpc的使用。
什么是RPC?
RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
常见的RPC架构 (来自于: https://www.cs.rutgers.edu/~pxk/417/notes/03-rpc.html):
- 客户端函数向 client stub发送请求;
- client Stub调用本地socket进行数据传送;
- 从client端到server端网络间socket数据传输;
- Server端socket数据传送到server stub;
- server端调用函数进行服务处理;
- server端处理的结果发送到server stub;
- Server stub将响应数据调用系统sockert;
- 从server到client的scoket数据传输;
- client端scoket到client stub数据传送;
client stub到client调用端的数据接收;
gorpc
golang 的官方代码库里面, 默认带了”net/rpc”代码库, 它封装了RPC框架, 能够使我们很容易创建、使用RPC功能。
golang语言对RPC的支持有以下要求:
以对象形式注册RPC;
RPC函数必须是对象的公共函数,也就是首字母大写的函数;
RPC函数必须有2个参数,类型为公共类型,或go内嵌类型;
RPC函数第2个参数作为返回值,必须是指针类型;
RPC函数必须返回一个error类型的值;
RPC 注册函数的格式如下:
func (t *T) MethodName(argType T1, replyType *T2) error
第一个参数代表调用者(client)提供的参数;
第二个参数代表要返回给调用者的计算结果;
RPC底层的协议可以使用http或者 tcp, 也可以按照json encoding方式传递数据,如下链接里面有3种情况很好的例子:
https://www.cnblogs.com/jkko123/p/7039675.html
除非显示的设置codec,否则这个库默认使用包encoding/gob作为序列化框架。
如果要实现自定义的数据传入接收, RPC定义了如下的接口:
type ClientCodec interface {
WriteRequest(*Request, interface{}) error
ReadResponseHeader(*Response) error
ReadResponseBody(interface{}) error
Close() error
}