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