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 @ 2022-01-03 18:52  JaydenQiu  阅读(124)  评论(0)    收藏  举报