如果1 proto file中定义了多个服务,我想了解gRPC服务是如何创建的,服务器是如何链接到它们的。(请原谅留言太长)
使用this文档中的示例,我创建了基本服务器(在1个proto文件中定义了1个服务),并能够运行客户端应用程序。route_services.proto
中服务定义
service RouteGuide {
rpc GetFeature(Point) returns (Feature) {}
}
message Feature {
// The name of the feature.
string name = 1;
// The point where the feature is detected.
Point location = 2;
}
route_guide_server.cc
中的示例服务器代码片段
class RouteGuideImpl : public RouteGuide::Service {
...
// implement the service GetFeature
...
}
然而,我想知道是否有可能在一个proto文件中有多个服务,并在服务器中实现它的接口,如下所示。route_services.proto
中更新服务定义(注意:RouteGuidanceV 2服务和NewFeature消息)
service RouteGuide {
rpc GetFeature(Point) returns (Feature) {}
}
message Feature {
// The name of the feature.
string name = 1;
// The point where the feature is detected.
Point location = 2;
}
/////////////////// Newly Added Service ///////////////////
service RouteGuideV2 {
rpc GetFeature(Point) returns (NewFeature) {}
}
message NewFeature {
// The point where the feature is detected.
Point location = 1;
}
route_guide_server.cc
中更新服务器代码段(注意:这里继承了RouteGuideV 2类)
class RouteGuideImpl : public RouteGuide::Service, public RouteGuideV2::Service {
...
// implement the service GetFeature (coming from RouteGuide interface)
// implement V2 service GetFeature (coming from RouteGuideV2 interface)
...
}
但是,我看到了这个错误:‘grpc::Service’ is an ambiguous base
。它发生在编译服务器文件时(特别是在我调用builder->RegisterService(this)
来注册我的类RouteGuideImpl
的行)
从protoc
编译器的Angular 来看,更新后的proto文件也是有效的,它生成服务器和客户端代码没有任何问题。
假设在1个proto文件中定义1个服务似乎是一种理想的方式,并且工作得很好,我想就这个主题问几个问题,以了解gRPC用户的常见做法。
1.是否可以将多个gRPC服务类派生到单个类中以实现其服务方法?这可能不是最好的方法,但我的意思是,从技术上讲,应该可以覆盖和实现来自2个不同服务接口(每个接口1个)的gRPC虚拟方法。
1.如果RouteGuideV 2服务GetFeature
在功能上与响应消息(Feature --> NewFeature)中的微小更改相同,那么在同一个proto文件route_guide.proto
中定义它而不是单独的route_guide_v2.proto
文件是否有意义?
1.如果定义多个服务是不正确的,那么recommended
添加类似服务的方法是什么??(或者服务器应如何定义和运行服务有任何限制)
感谢阅读,等待回复!!
1条答案
按热度按时间igetnqfo1#
我通常会建议为不同的服务创建单独的proto文件,只是为了使其更加模块化,但我看不出有什么理由不能这样做。我只是尝试添加另一个服务定义,它工作了。
是否可以将多个gRPC服务类派生到单个类中以实现其服务方法?这可能不是最好的方法,但我的意思是,从技术上讲,应该可以覆盖和实现来自2个不同服务接口(每个接口1个)的gRPC虚拟方法。
我认为你只是遇到了多重继承的问题,因为1)两个类都将导出同名的方法,2)菱形继承问题。在这里,我只是建议您更喜欢组合而不是多重继承。创建两个单独的服务实现(一个用于RouteGuide,一个用于RouteGuidev2),并在单独的类中包含实际的业务逻辑。