Golang grpc metadata机制

前言
grpc metadata 元数据,存入content,需要时再从content获取数据,比较经典的就是用来传递token
创建 metadata
常用的两种方式创建 metadata
1.通过Pairs()方法创建,类似传入key,value
2.通过New()创建,传入map[string][string]
package main

import (
	"fmt"
	"google.golang.org/grpc/metadata"
)

func main() {
	m1 := metadata.Pairs("token", "xie_123456")

	m2 := metadata.New(map[string]string{
		"token": "xie_123456",
	})

	fmt.Println(m1) //map[token:[xie_123456]]
	fmt.Println(m2) //map[token:[xie_123456]]
}

塞入content中
proto 定义 和 生成
//path C:\Users\86173\GolandProject\Study\Seven\D.proto
syntax = "proto3";
import "google/protobuf/timestamp.proto";
option go_package = "Study/Seven/D;Dbp";

message Request {
  string Data = 1;
}

message Response {
  string Data = 1;
}

service http {
  rpc ping(Request) returns(Response);
}

# current path  C:\Users\86173\GolandProject\Study
protoc -I=./Seven --go_out=plugins=grpc,paths=source_relative:./Seven/D D.proto
通过 metadata.NewOutgoingContext(ctx context.Context, md MD) context.Context
将 metadata 塞入 context 中
package main

import (
	Dbp "Study/Seven/D"
	"context"
	"fmt"
	"google.golang.org/grpc"
	"google.golang.org/grpc/metadata"
)

func main() {
	dial, _ := grpc.Dial(":8083", grpc.WithInsecure())
	client := Dbp.NewHttpClient(dial)
	m1 := metadata.Pairs("token", "xie_123456", "age", "18")
	outgoingContext := metadata.NewOutgoingContext(context.Background(), m1)
	res, _ := client.Ping(outgoingContext, &Dbp.Request{
		Data: "abc",
	})
	fmt.Println(res.Data) //xie_123456
}

取出 metadata 的数据
使用 metadata.FromIncomingContext 从 context 中取出 metadata
由于 metadata 是 type MD map[string][]string,取具体数据需要 range 遍历
package main

import (
	Dbp "Study/Seven/D"
	"context"
	"google.golang.org/grpc"
	"google.golang.org/grpc/metadata"
	"net"
)

type Service struct{}

func (s Service) Ping(ctx context.Context, request *Dbp.Request) (*Dbp.Response, error) {
	var token string
	if incomingContext, ok := metadata.FromIncomingContext(ctx); ok {
		for k, v := range incomingContext {
			if k == "token" {
				token = v[0]
			}
		}
	}

	return &Dbp.Response{
		Data: token,
	}, nil
}

func main() {
	server := grpc.NewServer()
	Dbp.RegisterHttpServer(server, &Service{})
	listen, _ := net.Listen("tcp", ":8083")
	server.Serve(listen)
}

最终结果

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值