当前位置:网站首页>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
边栏推荐
- [speech processing] speech signal denoising and denoising based on MATLAB low-pass filter [including Matlab source code 1709]
- Element positioning of Web Automation
- Commonly used probability distributions: Bernoulli distribution, binomial distribution, polynomial distribution, Gaussian distribution, exponential distribution, Laplace distribution and Dirac delta d
- Openresty ngx Lua regular expression
- Double pointeur de liste liée (pointeur rapide et lent, pointeur séquentiel, pointeur de tête et de queue)
- PLC编程基础之数据类型、变量声明、全局变量和I/O映射(CODESYS篇 )
- [secretly kill little buddy pytorch20 days] - [Day2] - [example of picture data modeling process]
- 一文搞定class的微观结构和指令
- d3dx9_ How to repair 31.dll_ d3dx9_ 31. Solution to missing DLL
- [untitled]
猜你喜欢
第十七周作业
audiopolicy
2022 R2 mobile pressure vessel filling review simulation examination and R2 mobile pressure vessel filling examination questions
audiopolicy
Marginal probability and conditional probability
Selenium+Pytest自动化测试框架实战
Element operation and element waiting in Web Automation
openresty ngx_ Lua request response
The method and principle of viewing the last modification time of the web page
Double pointeur de liste liée (pointeur rapide et lent, pointeur séquentiel, pointeur de tête et de queue)
随机推荐
Simple and beautiful method of PPT color matching
openresty ngx_ Lua regular expression
Global and Chinese market of water treatment technology 2022-2028: Research Report on technology, participants, trends, market size and share
Request preview display of binary data and Base64 format data
基于STM32的ADC采样序列频谱分析
Use the rewrite rule to rewrite all accesses to the a domain name to the B domain name
Commonly used probability distributions: Bernoulli distribution, binomial distribution, polynomial distribution, Gaussian distribution, exponential distribution, Laplace distribution and Dirac delta d
Registration of Electrical Engineering (elementary) examination in 2022 and the latest analysis of Electrical Engineering (elementary)
2022 registration examination for safety management personnel of hazardous chemical business units and simulated reexamination examination for safety management personnel of hazardous chemical busines
fibonacci search
两数之和、三数之和(排序+双指针)
Exponential weighted average and its deviation elimination
终于搞懂什么是动态规划的
Metasploit(msf)利用ms17_010(永恒之蓝)出现Encoding::UndefinedConversionError问题
Element positioning of Web Automation
[untitled]
VOT Toolkit环境配置与使用
Thinkphp5.1 cross domain problem solving
Using LNMP to build WordPress sites
Yiwen gets rid of the garbage collector