Client

Example: function

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

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

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

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

下面有一个例子。

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

  1. // server.go
  2. type Args struct {
  3. A int
  4. B int
  5. }
  6. type Reply struct {
  7. C int
  8. }
  9. func mul(ctx context.Context, args *Args, reply *Reply) error {
  10. reply.C = args.A * args.B
  11. return nil
  12. }
  13. func main() {
  14. flag.Parse()
  15. s := server.NewServer()
  16. s.RegisterFunction("a.fake.service", mul, "")
  17. s.Serve("tcp", *addr)
  18. }

客户端可以通过服务名和函数名来调用服务:

  1. // client.go
  2. d := client.NewPeer2PeerDiscovery("tcp@"+*addr, "")
  3. xclient := client.NewXClient("a.fake.service", client.Failtry, client.RandomSelect, d, client.DefaultOption)
  4. defer xclient.Close()
  5. args := &example.Args{
  6. A: 10,
  7. B: 20,
  8. }
  9. reply := &example.Reply{}
  10. err := xclient.Call(context.Background(), "mul", args, reply)
  11. if err != nil {
  12. log.Fatalf("failed to call: %v", err)
  13. }
  14. log.Printf("%d * %d = %d", args.A, args.B, reply.C)