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) }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!