本文已参与「新人创作礼」活动,一起开启掘金创作之路。
版本 Kratos v2@v2.3.0
gRPC双向流,想通过Kratos的metadata传递信息,发现服务端收不了。
同样的方法单向流又可以接收。
尝试用原生的方法区挂载context,服务端又可以接收到。
最后定位到客户端的发送上面,调试才发现双向流不经过Kratos的中间件。
所以无法将metadata转换为context
这个中间件会将metadata转换为context
在grpc里面会获取这个mdOutgoingKey类型的取出来。
不经过转换就过不去。
而服务端
grpc.Middleware(
metadata.Server(),
),
这个中间件也不能触发(取不到x-md-global-这种格式的context)
所以通过Kratos的metadata也是取不到信息的。
if md, ok := metadata.FromServerContext(conn.Context()); ok {
extra := md.Get("x-md-global-extra")
s.log.Infof("Conversations x-md-global-extra %v", extra)
extra2 := md.Get("x-md-global-extra2")
s.log.Infof(extra2)
}
双向流要用的context的话:
客户端:
import (
grpcmeta "google.golang.org/grpc/metadata"
)
header := grpcmeta.New(map[string]string{"authorization": "this is nick", "x-md-global-extra": "example", "x-md-local-custom": "nick"})
ctx = grpcmeta.NewOutgoingContext(ctx, header)
服务端:
md, _ := grpcmeta.FromIncomingContext(conn.Context())
fmt.Printf("Conversations md %v \n", md)