客户端
例程:function
一般情况下,我们把方法注册为服务的方法。方法必须遵循以下规则:
- 导出类型的导出方法
- 三个参数,第一个是context.Context,两个导出类型
- 第三个参数是一个指针
- 一个返回值,返回error类型
rpcx也支持注册原生函数作为服务,这种函数必须遵循以下规则:
- 函数可以导出也可不必导出
- 三个参数,第一个是context.Context,两个导出类型
- 第三个参数是一个指针
- 一个返回值,返回error类型
这里有一个示例。
服务器必须使用RegisterFunction
来注册一个函数,同时还需要提供一个服务名。
// go server.go
type Args struct {
A int
B int
}
type Reply struct {
C int
}
func mul(ctx context.Context, argsArgs, replyReply) error {
reply.C = args.A * args.B
return nil
}
func main() {
flag.Parse()
s := server.NewServer()
s.RegisterFunction("a.fake.service", mul, "")
s.Serve("tcp", *addr)
}
客户端使用服务名和函数名来访问:
// go client.go
d := client.NewPeer2PeerDiscovery("tcp@"+*addr, "")
xclient := client.NewXClient("a.fake.service", client.Failtry, client.RandomSelect, d, client.DefaultOption)
defer xclient.Close()
args := &example.Args{
A: 10,
B: 20,
}
reply := &example.Reply{}
err := xclient.Call(context.Background(), "mul", args, reply)
if err != nil {
log.Fatalf("failed to call: %v", err)
}
log.Printf("%d * %d = %d", args.A, args.B, reply.C)