天天看点

go-zero实现metadata从当前RPC服务传递到下游RPC服务上下文context前言编写拦截器使用总结

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...)
}
           

使用

代码如下:

go-zero实现metadata从当前RPC服务传递到下游RPC服务上下文context前言编写拦截器使用总结

总结

查看源码,看下go-zero对链路追踪的拦截实现,然后实现自己的metadata的透传。