Как получить список методов из конкретной службы gRPC на C++?

У меня есть служба gRPC proto3 со следующими методами:

syntax = "proto3";

Service MyService
{
    rpc Foo (FooRequest) returns (FooResponse) {}
    rpc Bar (BarRequest) returns (BarResponse) {}
   // etc.
}    

Я хотел бы получить динамический доступ к этим методам в моем приложении на С++, например.

google::protobuf::ServiceDescriptor serviceDescriptor;
google::protobuf::MethodDescriptor* myMethod = serviceDescriptor.FindMethodByName("Foo");

Получить дескриптор сообщения с помощью google::protobuf::MessageDescriptor = myMessage.GetDescriptor(); несложно, но похоже, что для службы нет эквивалентного метода.

Как получить ServiceDescriptor для службы на C++?

Мне кажется, что для получения списка методов gRPC требуется получить ServiceDescriptor, но если есть другой способ сделать это, мне было бы также интересно.


person Harry Williams    schedule 21.07.2021    source источник
comment
Да, ServiceDescriptor дает вам MethodDescriptors, но вам нужно начать с корня FileDescriptor(?). Я не делал этого на Java, но Golang (новый Protobuf) SDK имеет полезный модуль protoreflect, который я использовал для подобных целей. См.: pkg.go.dev/google.golang.org/ протобуф/отражать/. Кажется, существует эквивалент Java: javadoc.io/static/io.grpc/grpc-services/1.15.1/io/grpc/protobuf/   -  person DazWilkin    schedule 22.07.2021


Ответы (1)


Если вы статически связываете сгенерированный Protobuf исходный файл (например, MyService.pb.cc), вы сможете получить ServiceDescriptor из generated_pool DescriptorPool.

#include <google/protobuf/descriptor.h>
int main(int argc, char** argv)
{
  const google::protobuf::DescriptorPool* p = google::protobuf::DescriptorPool::generated_pool();
  const google::protobuf::ServiceDescriptor* serviceDescriptor = p->FindServiceByName("MyService");
  const google::protobuf::MethodDescriptor* method = serviceDescriptor->FindMethodByName("Foo");
}

См. также создание объекта сообщения Protobuf по имени

Чтобы получить полный список методов службы, вы можете использовать int ServiceDescriptor::method_count() const и const MethodDescriptor* ServiceDescriptor::method(int index) const.

person Stefan v.K.    schedule 26.07.2021