客户端

例程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)

results matching ""

    No results matching ""