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)
}
复制代码

 

posted @   JaydenQiu  阅读(105)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示