metadata机制
- metadata类似于http的header,可以在每次rpc调用的时候携带上信息,常用来进行传递一些和业务无关的数据,如token放到metadata中进行传递
- metadata在go中是一个map[string][]string 的结构
客户端代码示例
func main() {
dial, err := grpc.Dial("127.0.0.1:8080", grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
panic(err)
}
h := proto.NewHelloClient(dial)
md := metadata.Pairs("token", "123456")
ctx := metadata.NewOutgoingContext(context.Background(), md)
helloRes, err := h.SayHello(ctx, &proto.HelloRequest{Name: "grpc"})
if err != nil {
panic(err)
}
fmt.Println(helloRes.Reply)
}
服务端代码
func (h *Hello) SayHello(ctx context.Context, request *proto.HelloRequest) (*proto.HelloResponse, error) {
md, ok := metadata.FromIncomingContext(ctx)
if !ok {
fmt.Println("没有传md")
}
for k, v := range md {
fmt.Println(k, v)
}
return &proto.HelloResponse{
Reply: "hello " + request.Name,
}, nil
}
打印结果
- grpc默认也会在metadata中传递一些信息,如下除了token的值其他都是grpc默认进行传递的
:authority [127.0.0.1:8080]
content-type [application/grpc]
user-agent [grpc-go/1.61.0]
token [123456]