通過 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)
}