返回介绍

1.6 函数为服务

发布于 2020-10-24 07:04:29 字数 3273 浏览 950 评论 0 收藏 0

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()

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)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文