前言
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)
fmt.Println(m2)
}
塞入content中
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);
}
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)
}
取出 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)
}
最终结果