Golang 實現 RPC

go RPC 包文檔

通過 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)
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章