golang grpc的metadata机制

本文详细介绍了gRPC中的Metadata机制,展示了如何在客户端和服务器之间使用metadata携带业务无关但重要的数据,如token。通过代码示例,解释了如何设置和获取metadata,以及默认metadata的行为。
摘要由CSDN通过智能技术生成

metadata机制

  • metadata类似于http的header,可以在每次rpc调用的时候携带上信息,常用来进行传递一些和业务无关的数据,如token放到metadata中进行传递
  • metadata在go中是一个map[string][]string 的结构

客户端代码示例

func main() {
	dial, err := grpc.Dial("127.0.0.1:8080", grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		panic(err)
	}
	h := proto.NewHelloClient(dial)
	// 设置metadata
	//md := metadata.New(map[string]string{
	//	"token": "123456",
	//})
	// 创建metadata的第二种方式
	md := metadata.Pairs("token", "123456")
	ctx := metadata.NewOutgoingContext(context.Background(), md)
	helloRes, err := h.SayHello(ctx, &proto.HelloRequest{Name: "grpc"})
	if err != nil {
		panic(err)
	}
	fmt.Println(helloRes.Reply)
}

服务端代码

func (h *Hello) SayHello(ctx context.Context, request *proto.HelloRequest) (*proto.HelloResponse, error) {
	// 取出metadata
	md, ok := metadata.FromIncomingContext(ctx)
	if !ok {
		fmt.Println("没有传md")
	}
	// 打印出md
	for k, v := range md {
		fmt.Println(k, v)
	}
	return &proto.HelloResponse{
		Reply: "hello " + request.Name,
	}, nil
}

打印结果

  • grpc默认也会在metadata中传递一些信息,如下除了token的值其他都是grpc默认进行传递的
:authority [127.0.0.1:8080]
content-type [application/grpc]
user-agent [grpc-go/1.61.0]
token [123456]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值