gRPC Metadata 使用核心指南
一元 RPC (Unary RPC)
客户端发送 Metadata
// 创建初始 Metadata
md := metadata.Pairs("client-id", "12345", "auth-token", "bearer xyz")
// 方式1: 创建新上下文
ctx := metadata.NewOutgoingContext(context.Background(), md)
// 方式2: 向现有上下文追加
ctx = context.Background()
ctx = metadata.AppendToOutgoingContext(ctx, "client-id", "12345")
ctx = metadata.AppendToOutgoingContext(ctx, "auth-token", "bearer xyz")
// 发起调用
response, err := client.UnaryRPC(ctx, request)
服务器接收 Metadata
func (s *server) UnaryRPC(ctx context.Context, req *pb.Request) (*pb.Response, error) {
// 获取客户端 Metadata
md, ok := metadata.FromIncomingContext(ctx)
if ok {
// 获取特定值
clientID := md.Get("client-id")
authToken := md.Get("auth-token")
}
// 发送 Header Metadata
header := metadata.Pairs("server-header", "value")
grpc.SendHeader(ctx, header)
// 设置 Trailer Metadata
trailer := metadata.Pairs("server-trailer", "value")
grpc.SetTrailer(ctx, trailer)
return response, nil
}
客户端接收 Metadata
response, err := client.UnaryRPC(ctx, request)
// 接收 Header
header, err := grpc.Header(ctx)
// 接收 Trailer
trailer := grpc.Trailer(ctx)
流式 RPC (Streaming RPC)
客户端发送 Metadata
// 创建带 Metadata 的上下文
md := metadata.Pairs("stream-id", "stream-001")
ctx := metadata.NewOutgoingContext(context.Background(), md)
// 创建流
stream, err := client.StreamRPC(ctx)
// 追加额外 Metadata
ctx = metadata.AppendToOutgoingContext(ctx, "additional-data", "extra")