如何在 Go 中创建一个通用的 GRPC 服务器启动函数
How to create a generic GRPC server start function in Go
我正在尝试抽象 GRPC 服务器的启动
原主函数如下:
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{}
类型。
知道如何进行这项工作吗?
在您的设置中,collector_api.RegisterCollectionServer
的函数签名必须与 func(*grpc.Server, interface{})
完全匹配,Go 中没有 "is-kind-of",而在其他语言中有。
如果要使 startService
函数独立于 collection_api
类型,可以在 main()
中使用匿名函数。如果您知道您要注册的内容总是依赖于匿名函数的实现(在本例中为 &server.Server{}),那么您可以将此细节从 [=13= 的函数签名中删除] 并放入匿名函数中:
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)
}
}
我正在尝试抽象 GRPC 服务器的启动
原主函数如下:
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{}
类型。
知道如何进行这项工作吗?
在您的设置中,collector_api.RegisterCollectionServer
的函数签名必须与 func(*grpc.Server, interface{})
完全匹配,Go 中没有 "is-kind-of",而在其他语言中有。
如果要使 startService
函数独立于 collection_api
类型,可以在 main()
中使用匿名函数。如果您知道您要注册的内容总是依赖于匿名函数的实现(在本例中为 &server.Server{}),那么您可以将此细节从 [=13= 的函数签名中删除] 并放入匿名函数中:
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)
}
}