Kratos 双向流式gRPC 不支持中间件

560 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

版本 Kratos v2@v2.3.0

gRPC双向流,想通过Kratos的metadata传递信息,发现服务端收不了。

同样的方法单向流又可以接收。

尝试用原生的方法区挂载context,服务端又可以接收到。

最后定位到客户端的发送上面,调试才发现双向流不经过Kratos的中间件。

所以无法将metadata转换为context

这个中间件会将metadata转换为context

图片.png

在grpc里面会获取这个mdOutgoingKey类型的取出来。

图片.png

不经过转换就过不去。

而服务端

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)

图片.png