客户端的gRPC上下文

时间:2017-12-01 18:34:38

标签: go grpc

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

我在服务器端的上下文中使用metadata来承载来自客户端的身份验证数据,这非常有效。

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

以下是serverclient的代码。

1 个答案:

答案 0 :(得分:6)

我终于找到了自己的方式: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"}))