【grpc】2.上下文 metadata
- 在 gRPC 中,可以使用上下文(Context)来传递一些请求相关的元数据,如请求的 deadline、用户的身份认证信息等。客户端和服务端都可以通过 Context 传递这些信息。
- 上下文信息的传递使用的是go中的 context 包,每个请求都会创建一个 context。当一个请求被处理时,可以将上下文信息与请求一起传递到下一个处理器中。如果没有下一个处理器,那么这个上下文信息就会被丢弃。
- 在 gRPC 中,上下文信息的传递是通过 metadata(元数据)来实现的。metadata 是一个键值对,它包含了一些请求相关的信息,例如请求的 deadline、用户的身份认证信息等。在 gRPC 中,metadata 可以在客户端和服务端之间传递。
# 官方实现
https://pkg.go.dev/google.golang.org/grpc/metadata
- 包名:google.golang.org/grpc/metadata
- 详细方法见:https://pkg.go.dev/google.golang.org/grpc/metadata
# 代码示例(go)
server.go
package main import ( "context" "fmt" "net" "google.golang.org/grpc" ) type server struct{} func (s *server) SayHello(ctx context.Context, in *HelloRequest) (*HelloReply, error) { name, ok := ctx.Value("name").(string) if !ok { return nil, fmt.Errorf("failed to get name from context") } return &HelloReply{Message: "Hello " + name}, nil } func main() { lis, err := net.Listen("tcp", ":50051") if err != nil { log.Fatalf("failed to listen: %v", err) } s := grpc.NewServer() RegisterGreeterServer(s, &server{}) if err := s.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26服务端代码
ctx := context.Background() // 使用context创建ctx上下文 ctx = context.WithValue(ctx, "name", "world") // 使用grpc/metadata创建ctx上下文 ctx = metadata.NewIncomingContext(ctx, metadata.New(map[string]string{"token":"test-token"})) r, err := client.SayHello(ctx, &HelloRequest{Name: "world"})
1
2
3
4
5
6- 使用context创建ctx上下文
- 使用grpc/metadata创建ctx上下文
上次更新: 2023/05/04, 15:30:48