go-zero实现metadata从当前RPC服务传递到下游RPC服务上下文context
- 前言
- 编写拦截器
- 使用
- 总结
前言
最近需要使用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...)
}
使用
代码如下:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL5VERPJTS650dRpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxkTM0UTO1UTMzAjNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
总结
查看源码,看下go-zero对链路追踪的拦截实现,然后实现自己的metadata的透传。