【问题标题】:How to create a generic GRPC server start function in Go如何在 Go 中创建通用 GRPC 服务器启动函数
【发布时间】:2019-04-22 21:25:57
【问题描述】:

我正在尝试抽象 GRPC 服务器的启动

原来的main函数如下:

func main() {
    lis, err := net.Listen("tcp", port)
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }

    s := grpc.NewServer()
    pb.RegisterCollectionServer(s, &server.Server{})
    // Register reflection service on gRPC server.
    reflection.Register(s)
    if err := s.Serve(lis); err != nil {
        log.Fatalf("failed to serve: %v", err)
    }
}

我的目标是拥有这样的东西:

func startService(sr func(*grpc.Server, interface{}), srv interface{}) error {
    lis, err := net.Listen("tcp", port)
    if err != nil {
        return err
    }
    s := grpc.NewServer()
    sr(s, srv)
    reflection.Register(s)
    return s.Serve(lis)
}

func main() {
    err := startService(pb.RegisterCollectionServer, &server.Server{})

    if err != nil {
        log.Fatalf("failed to start Service: %v", err)
    }
}

但这给了我以下错误:

cannot use collection_api.RegisterCollectionServer (type func(*grpc.Server, collection_api.CollectionServer)) as type func(*grpc.Server, interface {}) in argument to startServicego

似乎collection_api.CollectionServer 不是有效的interface{} 类型。

知道如何进行这项工作吗?

【问题讨论】:

  • pb.RegisterCollectionServer 必须有完全 func(*grpc.Server, interface {}) 类型。这与特定函数参数的类型兼容性无关:整个函数签名必须匹配。

标签: go grpc grpc-go


【解决方案1】:

在您的设置中,collector_api.RegisterCollectionServer 的函数签名必须与 func(*grpc.Server, interface{}) 完全匹配,Go 中没有其他语言中的“is-kind-of”。

如果您想让startService 函数独立于collection_api 类型,您可以在main() 中使用匿名函数。如果您知道您所注册的内容始终依赖于匿名函数的实现(在本例中为 &server.Server{}),那么您可以将此细节从 startService 的函数签名中删除,并将其放入匿名函数:

func startService(sr func(*grpc.Server)) error {
    lis, err := net.Listen("tcp", port)
    if err != nil {
        return err
    }
    s := grpc.NewServer()
    sr(s)
    reflection.Register(s)
    return s.Serve(lis)
}

func main() {
    err := startService(func(grpcServer *grpc.Server) {
            pb.RegisterCollectionServer(grpcServer, &server.Server{})
        }, &server.Server{})

    if err != nil {
        log.Fatalf("failed to start Service: %v", err)
    }
}

【讨论】:

    猜你喜欢
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 2021-04-27
    相关资源
    最近更新 更多