前言
最近需要使用go-zero实现基于etcd,rpc的微服务项目,需要在网关把相关数据放到rpc的metadata中,然后在RPC服务的context中使用。而RPC继续调用其他RPC服务时,需要继续传递metadata信息。编写拦截器
package rpc
import (
"context"
"google.golang.org/grpc"
"google.golang.org/grpc/metadata"
)
// 将元数据添加到OutgoingContext的拦截器
func MetadataAppendToOutgoingContextInterceptor(ctx context.Context, method string, req, reply interface{},
cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
// 获取ctx中客户端传过来的metadata
md, ok := metadata.FromIncomingContext(ctx)
if ok {
// 将md处理成[]string
var pairs []string
for k, v := range md {
for _, value := range v {
pairs = append(pairs,k,value)
}
}
// 将metadata增量添加到valuectx=mdOutgoingKey{}
// grpc底层会从mdOutgoingKey获取后放到rpc的metadata发送到下游rpc服务
ctx = metadata.AppendToOutgoingContext(ctx, pairs...)
}
return invoker(ctx, method, req, reply, cc, opts...)
}
使用
代码如下:
总结
查看源码,看下go-zero对链路追踪的拦截实现,然后实现自己的metadata的透传。