一、基本原理
远程过程调用(Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。 该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。
具体原理参考:
引用其中一图,本文就以此架构图对官方net/rpc库分析:
golang官方的net/rpc库使用encoding/gob
进行编解码,gob编码方式仅被Go所支持,因此net/rpc库只能用于Go内部的rpc调用,无法进行跨语言调用, 但可以使用基于json编码的net/rpc/jsonrpc包进行这项工作。net/rpc同时支持tcp
或http
数据传输方式。
本文将首先展示使用net/rpc包进行rpc调用的主要方法,随后对于net/rpc包的结构和流程进行具体分析。
二、使用方法:
1、在一个独立的包rpc_objects中新建类型及方法
新定义一个类型 Args
及其方法 Multiply,
该方法将Args类型的参数中的两个整形成员相乘后,赋值给引用类型的参数Reply。
此处,net/rpc包要求要注册的函数必需以error类型作为返回值,因此函数运行结果反映在按引用传递的参数中。
package rpc_objects
type Args struct{
N,M int
}
//要对外提供的远程调用方法Multiply
func (a *Args)Multiply(args *Args,reply *int)error{
*reply=args.M*args.N
return nil
}
2、定义服务提供方,即rpc协议下的服务器端rpc_server.go
依次进行了服务方法注册、http请求处理函数注册、http端口的监听和对外服务。
package main
import (
"../rpc_objects"
"log"
"net"
"net/http"
"net/rpc"
"time"
)
func main() {
calc := new(rpc_objects.Args) //新建Args类型实例
rpc.Register(calc) //调用rpc.Register()函数进行注册
rpc.HandleHTTP() //调用rpc.HandleHTTP()
listener, e := net.Listen("tcp", "localhost:1234") //使用net包监听端口
if e != nil {
log.Fatal("Starting RPC-server -listen error:", e)
}
go http.Serve(listener, nil) //新建协程提供对外服务
time.Sleep(1000e9)
}
3、新建rpc协议客户端rpc_client.go
向服务端进行客户端连接后,调用call()函数,传递服务函数名(类型名.函数名)和调用函数参数,完成服务调用。
package main
import(
"../rpc_objects"
"fmt"
"log"
"net/rpc"
)
const serverAddress