当前位置:网站首页>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
边栏推荐
- 数据库基础知识(面试)
- Registration of Electrical Engineering (elementary) examination in 2022 and the latest analysis of Electrical Engineering (elementary)
- Paddle Serving v0.9.0 重磅发布多机多卡分布式推理框架
- 关于MySQL的30条优化技巧,超实用
- CJ mccullem autograph: to dear Portland
- Registration and skills of hoisting machinery command examination in 2022
- 第一讲:蛇形矩阵
- Global and Chinese markets for children's amusement facilities 2022-2028: Research Report on technology, participants, trends, market size and share
- PLC编程基础之数据类型、变量声明、全局变量和I/O映射(CODESYS篇 )
- Arduino measures AC current
猜你喜欢
随机推荐
媒体查询:引入资源
数据库基础知识(面试)
PLC编程基础之数据类型、变量声明、全局变量和I/O映射(CODESYS篇 )
链表之双指针(快慢指针,先后指针,首尾指针)
Use the rewrite rule to rewrite all accesses to the a domain name to the B domain name
openresty ngx_lua正则表达式
Metasploit(msf)利用ms17_010(永恒之蓝)出现Encoding::UndefinedConversionError问题
Metasploit (MSF) uses MS17_ 010 (eternal blue) encoding:: undefined conversionerror problem
2022 R2 mobile pressure vessel filling review simulation examination and R2 mobile pressure vessel filling examination questions
Common JVM tools and optimization strategies
Leetcode weekly The 280 game of the week is still difficult for the special game of the week's beauty team ~ simple simulation + hash parity count + sorting simulation traversal
如何快速理解复杂业务,系统思考问题?
One article deals with the microstructure and instructions of class
Record several frequently asked questions (202207)
30 optimization skills about mysql, super practical
Week 17 homework
LeetCode145. Post order traversal of binary tree (three methods of recursion and iteration)
2022.02.13 - SX10-30. Home raiding II
使用rewrite规则实现将所有到a域名的访问rewrite到b域名
Ultrasonic sensor flash | LEGO eV3 Teaching