C++:是否可以在单个proto文件中添加多个gRPC服务定义

zte4gxcn  于 2023-06-07  发布在  其他
关注(0)|答案(1)|浏览(250)

如果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添加类似服务的方法是什么??(或者服务器应如何定义和运行服务有任何限制)
感谢阅读,等待回复!!

igetnqfo

igetnqfo1#

我通常会建议为不同的服务创建单独的proto文件,只是为了使其更加模块化,但我看不出有什么理由不能这样做。我只是尝试添加另一个服务定义,它工作了。
是否可以将多个gRPC服务类派生到单个类中以实现其服务方法?这可能不是最好的方法,但我的意思是,从技术上讲,应该可以覆盖和实现来自2个不同服务接口(每个接口1个)的gRPC虚拟方法。
我认为你只是遇到了多重继承的问题,因为1)两个类都将导出同名的方法,2)菱形继承问题。在这里,我只是建议您更喜欢组合而不是多重继承。创建两个单独的服务实现(一个用于RouteGuide,一个用于RouteGuidev2),并在单独的类中包含实际的业务逻辑。

相关问题