GRPC 的拦截器
开源拦截器 go-grpc-middleware
服务端拦截器实现
func main() { // 拦截器逻辑 interceptor := func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) { fmt.Println("接收到一个请求") res,err := handler(ctx,req) fmt.Println("请求已完成") return res,err } // 生成拦截器 opt := grpc.UnaryInterceptor(interceptor) // 实例化server时,传入拦截器 s := grpc.NewServer(opt) // 监听端口 lis,err := net.Listen("tcp",PORT) if err != nil { panic(err) } // 注册服务 proto.RegisterGreeterServer(s,&server{}) // 开启服务 err = s.Serve(lis) if err != nil { log.Fatalf("failed to serve: %v", err) } }
客户端拦截器实现
func main() { // 拦截器逻辑 interceptor := func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { start := time.Now() err := invoker(ctx,method,req,reply,cc,opts...) fmt.Printf("耗时%s\n",time.Since(start)) return err } // 实例化拦截器 opt := grpc.WithUnaryInterceptor(interceptor) // 连接前将拦截器传入 conn,err := grpc.Dial(":50053",grpc.WithInsecure(),opt) if err != nil { panic(err) } defer conn.Close() c := proto.NewGreeterClient(conn) // 执行服务端的方法 res,_ := c.SayHello(context.Background(),&proto.StreamReqData{Data: "hi"}) fmt.Println(res) }
client端,通过拦截器添加 metadata
type customCredential struct { } func (c customCredential) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { return map[string]string{ "authorization":"haha", },nil } // RequireTransportSecurity indicates whether the credentials requires // transport security. func (c customCredential) RequireTransportSecurity() bool { return false } func main() { // 实例化拦截器 opt := grpc.WithPerRPCCredentials(customCredential{}) // 连接前将拦截器传入 conn,err := grpc.Dial(":50053",grpc.WithInsecure(),opt) if err != nil { panic(err) } defer conn.Close() c := proto.NewGreeterClient(conn) // 执行服务端的方法 res,_ := c.SayHello(context.Background(),&proto.StreamReqData{Data: "hi"}) fmt.Println(res) }

浙公网安备 33010602011771号