RPC编程
RPC编程简介
RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。构建于TCP,UDP或者HTTP,允许开发者直接调用另一台计算机上的的程序,而开发者无需额外的为这个调用过程编写网络通信相关代码,使得开发网络分布是程序在内的应用程序更加便捷。
RPC采用客户机/服务器模式。请求程序就是一个客户端,而服务提供程序就是一个服务器。首先,客户端调用进程发送一个有进程参数的调用信息到服务端,然后等待服务端响应。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行并继续进行。
客户机对服务器的RPC调用,其内部操作大致有如下十步:
- 调用客户端句柄;执行传送参数
- 调用本地系统内核发送网络消息
- 消息传送到远程主机
- 服务器句柄得到消息并取得参数
- 执行远程过程
- 执行的过程将结果返回服务器句柄
- 服务器句柄返回结果,调用远程系统内核
- 消息传回本地主机
- 客户句柄由内核接收消息
- 客户接收句柄返回的数据
GO语言中RPC的支持于与处理
go语言标准库提供net/rpc包实现了RPC协议需要的相关细节,该包允许RPC客户端程序通过网络或者其他I/O连接调用一个远端对象的公开方法(必须大写字母开头,可外部调用的)。在RPC服务端可以将一个对象注册为可访问的服务,之后该对象的公开方法就能够以远程的方式提供访问。一个RPC可以注册多个不同类型的对象,但是不可以注册一个类型的多个对象。
一个对象只有满足以下条件才可以被RPC服务注册为可远程访问:
- 必须是在对象外部可公开调用的方法(首字母大写)
- 必须有两个参数,且参数类型必须是包外部可以访问的类型或者是Go内建支持的类型
- 第二个参数必须是一个指针
- 必须返回一个error类型的值
以上四点可用如下代码来表示:
func (t * T)MethodName(argType T1,replyType * T2)error
- 该方法第一个参数表示的是由RPC客户端传入的参数,第二个参数表示要返回给RPC客户端的结果,返回一个error类型的值。在RPC客户端中,net/rpc提供了rpc.Dail()及rpc.DialHTTP()方法来于指定的RPC服务端建立连接。
- 建立连接后有同步和异步两种方式接受RPC服务端的处理结果。 调用RPC客户端的Call()方法则进行同步处理,调用RPC客户端的Go()方法则进行异步处理。
- 无论两种方法的哪一种都必须指定要调用的服务及其方法名称,以及传入一个客户端参数的引用,还有一个用于接受处理结果参数的指针。
- 如果没有指定RPC传输使用何种编解码器,默认将使用Go标准库提供的encoding/gob包进行数据传输。如果使用跨语言交互,则使用JSON编解码器进行交互。