通过 go 自带的 net/rpc
包可以很容易实现 RPC。go 官方文档对 RPC 服务端方法的要求如下:
- 方法是导出的
- 方法有两个参数,都是导出类型或内建类型
- 方法的第二个参数是指针
- 方法只有一个error接口类型的返回值
通过 net/rpc
包实现 RPC
Go 自带的 rpc 包,在编解码时使用了 Gob (Go binary)编码,导致无法跨平台。可以替换为通用的 Protobuf 或 JSON 格式,从而有更好的跨语言能力。
服务端
package main
import (
"net"
"net/http"
"net/rpc"
)
type Args struct {
A, B int
}
type MyStruct int
func (my *MyStruct) Test(args Args, reply *int) error {
*reply = args.A * args.B
return nil
}
func main() {
ms := new(MyStruct)
rpc.Register(ms)
rpc.HandleHTTP()
l, e := net.Listen("tcp", ":1234")
if e != nil {
panic(e)
}
http.Serve(l, nil)
}
客户端
package main
import (
"fmt"
"net/rpc"
)
type Args struct {
A, B int
}
func main() {
client, err := rpc.DialHTTP("tcp", ":1234")
if err != nil {
panic(err)
}
var reply int
err = client.Call("MyStruct.Test", &Args{2, 3}, &reply)
if err != nil {
panic(err)
}
fmt.Println(reply)
}