当前位置:网站首页>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][]string
When 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
边栏推荐
- Global and Chinese markets for children's amusement facilities 2022-2028: Research Report on technology, participants, trends, market size and share
- openresty ngx_lua请求响应
- Yiwen gets rid of the garbage collector
- Selenium+pytest automated test framework practice
- 视频标准二三事
- Methods modified by static
- Business introduction of Zhengda international futures company
- Getting started stm32--gpio (running lantern) (nanny level)
- Data type, variable declaration, global variable and i/o mapping of PLC programming basis (CoDeSys)
- Nangou Gili hard Kai font TTF Download with installation tutorial
猜你喜欢
Douban scoring applet Part-2
Ieventsystemhandler event interface
Starting from 1.5, build a micro Service Framework -- log tracking traceid
Registration and skills of hoisting machinery command examination in 2022
The method and principle of viewing the last modification time of the web page
[secretly kill little buddy pytorch20 days] - [Day2] - [example of picture data modeling process]
audiopolicy
2022 registration examination for safety management personnel of hazardous chemical business units and simulated reexamination examination for safety management personnel of hazardous chemical busines
Yiwen gets rid of the garbage collector
一文搞定JVM的内存结构
随机推荐
Global and Chinese markets of tantalum heat exchangers 2022-2028: Research Report on technology, participants, trends, market size and share
Unity Max and min constraint adjustment
Paddle Serving v0.9.0 重磅发布多机多卡分布式推理框架
Record several frequently asked questions (202207)
Negative sampling
2.13 summary
Three.JS VR看房
leecode-学习笔记
APK加固技术的演变,APK加固技术和不足之处
Usage Summary of scriptable object in unity
Composition of interface
Boring boring
Google Maps case
两数之和、三数之和(排序+双指针)
Vision Transformer (ViT)
Metasploit (MSF) uses MS17_ 010 (eternal blue) encoding:: undefined conversionerror problem
The code generator has deoptimised the styling of xx/typescript. js as it exceeds the max of 500kb
Expectation, variance and covariance
openresty ngx_ Lua regular expression
Leetcode daily question 1189 The maximum number of "balloons" simple simulation questions~