客户端的 gRPC 上下文

gRPC context on the client side

我正在使用 gRPC 和 protobuf(以及通往 REST 的 gRPC 网关)构建一个 client/server 系统。

我在服务器端的上下文中使用 metadata 从客户端传输身份验证数据,效果非常好。

现在,我希望服务器设置一些元数据 keys/values 以便客户端可以获取它们以及响应。我怎样才能做到这一点?使用 SetHeader and SendHeader? Ideally, I'd like every single response from the server to integrate that metadata (can be seen as some kind of UnaryInterceptor,但基于响应而不是请求?)

这是 server and for the client 的代码。

我终于找到了方法: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"}))