当前位置:网站首页>Use of metadata in golang grpc
Use of metadata in golang grpc
2022-07-05 23:01:00 【sweey_ lff】
gRPC Let's implement remote calls like local calls , For every time RPC in call , There may be some in header Data passed in , And these data can be passed through metadata To pass on .
metadata In order to key-value Storage of data in the form of , among key yes string type ,value yes []string type , That is, a string slice type .metadata bring client and server It can provide the other party with some information about this call , It's like once http Requested RequestHeader and ResponseHeader equally .http in header The life cycle of is a http request , that metadata The life cycle of is once RPC call .
1. go Use in metadata
Project source code path :https://github.com/grpc/grpc-go/tree/master/metadata
Project documentation :https://github.com/grpc/grpc-go/blob/master/Documentation/grpc-metadata.md
The use of go package :"google.golang.org/grpc/metadata"
1) newly build metadata
MD The type is actually map,key yes string,value yes string Type of slice.
type MD map[string][]stringWhen creating, you can create ordinary map Use the same type new Keyword to create :
// The first way
md := metadata.New(map[string]string{"key1": "val1", "key2": "val2"})
// The second way key Case insensitive , Will be uniformly converted to lowercase
md := metadata.Pairs(
"key1", "val1",
"key1", "val1-2", // "key1" will have map value []string{"val1", "val1-2"}
"key2", "val2",
)2) send out metadata
md := metadata.Pairs("key", "val")
// A new one with metadata Of context
ctx := metadata.NewOutgoingContext(context.Background(), md)
// A one-way RPC
response, err := client.SomeRPC(ctx, someRequest)3) receive metadata
func (s *server) SomeRPC(ctx context.Context, in *pb.SomeRequest) (*pb.SomeResponse, err) {
md, ok := metadata.FromIncomingContext(ctx)
// do something with metadata
}2.gRPC Use in metadata
1)proto
syntax = "proto3";
option go_package = "./;proto";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}Execute the command to compile the file , Generate .pb.go file :protoc -I . test.proto --go_out=plugins=grpc:.
2)client
package main
import (
"context"
"fmt"
"go-class/rpc/07metadata/proto"
"google.golang.org/grpc"
"google.golang.org/grpc/metadata"
)
func main() {
conn, err := grpc.Dial(":8083", grpc.WithInsecure())
if err != nil {
panic(err)
}
defer conn.Close()
c := proto.NewGreeterClient(conn)
// write in metadata***********
md := metadata.New(map[string]string{
"name": "lff",
"password": "123456",
})
ctx := metadata.NewOutgoingContext(context.Background(), md)
r, err := c.SayHello(ctx, &proto.HelloRequest{Name: "lff111"})
if err != nil {
panic(err)
}
fmt.Println(r.Message)
}3)server
package main
import (
"context"
"fmt"
"net"
"google.golang.org/grpc"
"google.golang.org/grpc/metadata"
"go-class/rpc/07metadata/proto"
)
type Server struct {}
func (s *Server) SayHello(ctx context.Context, req *proto.HelloRequest) (*proto.HelloReply, error) {
// obtain header*********
md, ok := metadata.FromIncomingContext(ctx)
if ok {
fmt.Println("get metadata error")
}
for key, val := range md {
fmt.Println(key, val)
}
// obtain header Medium name*********
//if nameSlice, ok := md["name"]; ok {
// fmt.Println(nameSlice)
// for i, e := range nameSlice {
// fmt.Println(i, e)
// }
//}
return &proto.HelloReply{
Message: "Hello " + req.Name,
}, nil
}
func main(){
g := grpc.NewServer()
proto.RegisterGreeterServer(g, &Server{})
lis, err := net.Listen("tcp", "127.0.0.1:8083")
if err != nil {
panic("failed to listen:" + err.Error())
}
err = g.Serve(lis)
if err != nil {
panic("failed to start grpc:" + err.Error())
}
}Start... First server, Start up client End , As a result, I saw the printed header

边栏推荐
- TOPSIS code part of good and bad solution distance method
- Nanjing: full use of electronic contracts for commercial housing sales
- Hcip day 12 (BGP black hole, anti ring, configuration)
- 媒体查询:引入资源
- 透彻理解JVM类加载子系统
- Selenium+pytest automated test framework practice
- Metasploit (MSF) uses MS17_ 010 (eternal blue) encoding:: undefined conversionerror problem
- 【Note17】PECI(Platform Environment Control Interface)
- APK加固技术的演变,APK加固技术和不足之处
- Vcomp110.dll download -vcomp110 What if DLL is lost
猜你喜欢

openresty ngx_lua请求响应

Douban scoring applet Part-2

d3dx9_ How to repair 31.dll_ d3dx9_ 31. Solution to missing DLL

SPSS analysis of employment problems of college graduates

Editor extensions in unity

Codeforces Global Round 19

Ultrasonic sensor flash | LEGO eV3 Teaching

Common model making instructions

VOT toolkit environment configuration and use

Arduino 测量交流电流
随机推荐
Simple and beautiful method of PPT color matching
Spectrum analysis of ADC sampling sequence based on stm32
【Note17】PECI(Platform Environment Control Interface)
鏈錶之雙指針(快慢指針,先後指針,首尾指針)
3 find the greatest common divisor and the least common multiple
查看网页最后修改时间方法以及原理简介
Starting from 1.5, build a micro Service Framework -- log tracking traceid
[screen recording] how to record in the OBS area
Global and Chinese markets of industrial pH meters 2022-2028: Research Report on technology, participants, trends, market size and share
[untitled]
Three.js-01 入门
Binary tree (II) -- code implementation of heap
openresty ngx_ Lua regular expression
Media query: importing resources
LeetCode102. Sequence traversal of binary tree (output by layer and unified output)
My experience and summary of the new Zhongtai model
Business introduction of Zhengda international futures company
透彻理解JVM类加载子系统
[speech processing] speech signal denoising and denoising based on Matlab GUI low-pass filter [including Matlab source code 1708]
APK加固技术的演变,APK加固技术和不足之处