在http请求当中我们可以设置header用来传递数据,grpc底层采用http2协议也是支持传递数据的,采用的是metadata。 Metadata 对于 gRPC 本身来说透明, 它使得 client 和 server 能为对方提供本次调用的信息。就像一次 http 请求的 RequestHeader 和 ResponseHeader,http header 的生命周期是一次 http 请求, Metadata 的生命周期则是一次 RPC 调用。
项目源代码路径:google.golang.org/grpc/metadata
项目文档路径:https://github.com/grpc/grpc-go/blob/master/Documentation/grpc-metadata.md
1、创建metadata
MD 类型实际上是map,key是string,value是string类型的slice。
type MD map[string][]string
创建的时候可以像创建普通的map类型一样使用new关键字进行创建:
md := metadata.New(map[string]string{“key1”: “val1”, “key2”: “val2”})
1
或者使用Pairs创建,相同的key值会被组合成slice。
md := metadata.Pairs(
“key1”, “val1”,
“key1”, “val1-2”, // “key1” will have map value []string{“val1”, “val1-2”}
“key2”, “val2”,
)
key不区分大小写,会被统一转成小写。
2、发送metadata
md := metadata.Pairs(“key”, “val”)
// 新建一个有 metadata 的 context
ctx := metadata.NewOutgoingContext(context.Background(), md)
// 单向 RPC
response, err := client.SomeRPC(ctx, someRequest)
3、接收metadata
利用函数 FromIncomingContext从context中获取metadata:
func (s server) SomeRPC(ctx context.Context, in *pb.SomeRequest) (pb.SomeResponse, err) {
md, ok := metadata.FromIncomingContext(ctx)
// do something with metadata
}
https://blog.csdn.net/hjxzb/article/details/88980186