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)
}
发布了295 篇原创文章 · 获赞 158 · 访问量 101万+

猜你喜欢

转载自blog.csdn.net/kikajack/article/details/105753811
今日推荐