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的透传。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值