В соответствии с документацией Google Protocol Buffers в ' Определение сервисов ' они говорят, что
также возможно использовать буферы протокола с вашей собственной реализацией RP C.
Насколько я понимаю, Protocol Buffers не реализует RP C изначально. Вместо этого они предоставляют серию абстрактных интерфейсов, которые должны быть реализованы пользователем (это я!). Поэтому я хочу реализовать эти абстрактные интерфейсы, используя ZeroMQ для сетевого взаимодействия.
Я пытаюсь создать реализацию RP C с использованием ZeroMQ, потому что проект, над которым я работаю, уже реализует ZeroMQ для базовых c сообщений (следовательно, я не используя gRP C, как рекомендует документация).
После тщательного изучения документации к прототипу я обнаружил, что мне нужно реализовать абстрактные интерфейсы RpcChannel и RpcController для моей собственной реализации.
Я построил минимизированный пример того, где я сейчас нахожусь с моей реализацией RP C
.proto file : Пропущенная схема SearchRequest и SearchResponse для краткости
service SearchService {
rpc Search (SearchRequest) returns (SearchResponse);
}
SearchServiceImpl.h :
class SearchServiceImpl : public SearchService {
public:
void Search(google::protobuf::RpcController *controller,
const SearchRequest *request,
SearchResponse *response,
google::protobuf::Closure *done) override {
// Static function that processes the request and gets the result
SearchResponse res = GetSearchResult(request);
// Call the callback function
if (done != NULL) {
done->Run();
}
}
}
};
MyRPCController.h :
class MyRPCController : public google::protobuf::RpcController {
public:
MyRPCController();
void Reset() override;
bool Failed() const override;
std::string ErrorText() const override;
void StartCancel() override;
void SetFailed(const std::string &reason) override;
bool IsCanceled() const override;
void NotifyOnCancel(google::protobuf::Closure *callback) override;
private:
bool failed_;
std::string message_;
};
MyRPCController. cpp - На основании this
void MyRPCController::Reset() { failed_ = false; }
bool MyRPCController::Failed() const { return failed_; }
std::string MyRPCController::ErrorText() const { return message_; }
void MyRPCController::StartCancel() { }
void MyRPCController::SetFailed(const std::string &reason) {
failed_ = true;
message_ = reason;
}
bool MyRPCController::IsCanceled() const { return false; }
void MyRPCController::NotifyOnCancel(google::protobuf::Closure *callback) { }
MyRPCController::ChiRpcController() : RpcController() { Reset(); }
MyRpcChannel.h :
class MyRPCChannel: public google::protobuf::RpcChannel {
public:
void CallMethod(const google::protobuf::MethodDescriptor *method, google::protobuf::RpcController *controller,
const google::protobuf::Message *request, google::protobuf::Message *response,
google::protobuf::Closure *done) override;
};
Вопросы, которые у меня есть с моим примером до сих пор:
- Где я могу вписать ZeroMQ в это?
- Похоже, что он должен идти в RPCChannel, потому что в примерах, которые я вижу (см. 3-й кодовый блок здесь ), они передают строку, к которой привязаны порты (т.е.
MyRpcChannel channel("rpc:hostname:1234/myservice");
)
- Меня интересует моя реализация RPCController, она кажется слишком простой. Должно ли больше идти сюда?
- Как реализовать RPCChannel, похоже, он очень похож на SearchServiceImpl. Виртуальная функция 1 в этих классах имеет очень похожую сигнатуру метода, за исключением ее обобщенной c.
Вот еще несколько вопросов о переполнении стека, с которыми я сталкивался и которые содержат полезную информацию по топи c:
- Protobuf- Net: внедряющий сервер, контроллер rp c и канал rp c - Здесь я нашел пример для реализации RPCController.
- Использование буферов протокола для реализации RP C в ZeroMQ - Этот ответ интересен тем, что в верхнем ответе кажется, что он рекомендует не использовать Protobufs, встроенные в RP C форматирование для .proto файла.
- Я также заметил то же самое понятие в этом файле, в хранилище под названием libpbrp c, которое выглядело хорошим источником для примера кода
- Могу ли я / должен ли я использовать существующую реализацию, такую как RPCZ ?
Спасибо за вашу помощь. Надеюсь, я дал достаточно информации и понял, что я ищу. Пожалуйста, дайте мне знать, если что-то неясно или не хватает информации. Я был бы рад отредактировать вопрос соответствующим образом.