GRPC拦截器

本篇文章我来介绍一下gRPC拦截器的使用,拦截器主要用于在服务器端和客户端拦截 RPC. 拦截器可以在 gRPC 中拦截 RPC 的执行,来满足一些特殊的需求,如日志,认证,访问控制等。 gRPC 提供了简单的接口,用来在客户端和服务端的 gRPC 协议中添加拦截器。 根据所使用的 gRPC 通信模式的不同,主要分为2种拦截器:1)一元拦截器,2)流拦截器。 既可以在客户端使用拦截器,也可以在服务端使用拦截器。 接下来,我会依次介绍在服务端和客户端的使用。 服务端拦截器 当客户端调用 gRPC 的远程调用方法时,可以通过服务端拦截器,在执行一些方法前,执行一些通用的操作。如果希望在 Rpc 服务中添加服务端拦截器,只需实现该拦截器,并在创建服务端时注册进来。 下面依次介绍两种服务端拦截器:1)一元拦截器,2)流拦截器。 一元拦截器 如果想在服务端拦截 一元 RPC 调用时,需要在服务端实现相应的函数,此函数的签名为: type UnaryServerInterceptor func(ctx context.Context, req interface{}, info *UnaryServerInfo, handler UnaryHandler) (resp interface{}, err error) 我们在上一篇文章的代码中添加如下代码: func orderUnaryServerInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { log.Println("======= [Server Interceptor] ", info.FullMethod) log.Printf(" Pre Proc Message : %s", req) m, err := handler(ctx, req) if err != nil { log.Printf("Error : %v", err) } log.Printf(" Post Proc Message : %s", m) return m, err } func main() { initSampleData() lis, err := net.Listen("tcp", port) if err != nil { log.Fatalf("failed to listen: %v", err) } s := grpc.NewServer(grpc.UnaryInterceptor(orderUnaryServerInterceptor)) pb.RegisterOrderManagementServer(s, &server{}) // Register reflection service on gRPC server. // reflection.Register(s) if err := s.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) } } 一元拦截器的实现主要分为三个部分: 前置处理、调用 RPC 服务、后置处理。在前置处理阶段可以通过检查参数获得 RPC 的信息,比如 RPC 上下文、请求和服务端信息。 ...

十二月 11, 2021 · overstarry