• Client

    Client

    Example: function

    通常我们将方法注册为服务的方法,这些方法必须满足以下的要求:

    • 必须是可导出类型的方法
    • 接受3个参数,第一个是 context.Context类型,其他2个都是可导出(或内置)的类型。
    • 第3个参数是一个指针
    • 有一个 error 类型的返回值

    Rpcx 也支持将纯函数注册为服务,函数必须满足以下的要求:

    • 函数可以是可导出的或者不可导出的
    • 接受3个参数,第一个是 context.Context类型,其他2个都是可导出(或内置)的类型。
    • 第3个参数是一个指针
    • 有一个 error 类型的返回值

    下面有一个例子。

    服务端必须使用 RegisterFunction 来注册一个函数并且提供一个服务名。

    ```go server.go
    type Args struct {
    A int
    B int
    }

    type Reply struct {
    C int
    }

    func mul(ctx context.Context, args Args, reply Reply) error {
    reply.C = args.A * args.B
    return nil
    }

    func main() {
    flag.Parse()

    1. s := server.NewServer()
    2. s.RegisterFunction("a.fake.service", mul, "")
    3. s.Serve("tcp", *addr)

    }

    1. 客户端可以通过服务名和函数名来调用服务:
    2. ```go client.go
    3. d := client.NewPeer2PeerDiscovery("tcp@"+*addr, "")
    4. xclient := client.NewXClient("a.fake.service", client.Failtry, client.RandomSelect, d, client.DefaultOption)
    5. defer xclient.Close()
    6. args := &example.Args{
    7. A: 10,
    8. B: 20,
    9. }
    10. reply := &example.Reply{}
    11. err := xclient.Call(context.Background(), "mul", args, reply)
    12. if err != nil {
    13. log.Fatalf("failed to call: %v", err)
    14. }
    15. log.Printf("%d * %d = %d", args.A, args.B, reply.C)