【问题标题】:gRPC context on the client side客户端的 gRPC 上下文
【发布时间】:2018-05-15 22:05:04
【问题描述】:

我正在构建一个客户端/服务器系统,使用 gRPC 和 protobuf(以及一个到 REST 的 gRPC 网关)。

我在服务器端的上下文中使用metadata 来携带来自客户端的身份验证数据,效果很好。

现在,我希望服务器设置一些元数据键/值,以便客户端可以获取它们以及响应。我怎样才能做到这一点?使用SetHeaderSendHeader?理想情况下,我希望服务器的每个响应都集成该元数据(可以看作某种UnaryInterceptor,但在响应而不是请求上?)

这是serverclient 的代码。

【问题讨论】:

    标签: go grpc


    【解决方案1】:

    我终于找到了方向:https://github.com/grpc/grpc-go/blob/master/Documentation/grpc-metadata.md

    所以基本上,grpc.SetHeader() + grpc.SendHeader()grpc.SetTrailer() 完全是我想要的。在客户端,需要将grpc.Header()grpc.Trailer()函数传递给RPC调用,它们的参数是要填充的metadata.MD对象。

    在客户端,定义您的接收元数据:

    var header, trailer metadata.MD
    

    然后,将其传递给 SomeRPCCall() 一元 RPC:

    response, err := client.SomeRPCCall(
        context.Background(),
        proto.MyMessage{},
        grpc.Header(&header),
        grpc.Trailer(&trailer),
    )
    

    现在,您可以检查元数据中的内容了:

    for key, value := range header {
        fmt.Printf("%s => %s", key, value)
    }
    
    for key, value := range trailer {
        fmt.Printf("%s => %s", key, value)
    }
    

    在服务器端,您可以:

    • 强制在收到 RPC 之后(但在处理之前)立即发送数据:

      grpc.SendHeader(ctx, metadata.New(map[string]string{"my-key": "my-value"}))

    • 或在 RPC 进程结束时设置并发送元数据(连同Status):

      grpc.SetTrailer(ctx, metadata.New(map[string]string{"my-key": "my-value"}))

    【讨论】:

      猜你喜欢
      • 2020-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多