gRPC für C++: Bibliotheken, Einrichtung und Codebeispiele

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einführung in gRPC für C++

\n\n

gRPC ist ein modernes Framework für entfernte Prozeduraufrufe (RPC), entwickelt von Google. Es verwendet Protocol Buffers (protobuf) zur Datenserialisierung und HTTP/2 als Transportprotokoll. Für die Sprache C++ bietet gRPC native Bibliotheken, mit denen Sie leistungsstarke Microservices und verteilte Systeme erstellen können.

\n\n

In diesem Artikel werden wir die wichtigsten Bibliotheken, die Einrichtung der Umgebung besprechen und ein vollständiges Beispiel einer Client-Server-Anwendung in C++ schreiben.

\n\n

Wichtige gRPC-Bibliotheken für C++

\n\n

Für die Arbeit mit gRPC in C++ müssen mehrere Komponenten installiert werden:

\n\n
    \n
  • grpc — die Hauptbibliothek, die Implementierungen von Server und Client enthält.
  • \n
  • grpc++ — C++-Wrapper um gRPC, der eine praktische API bereitstellt.
  • \n
  • protobuf — Bibliothek für die Arbeit mit Protocol Buffers (Generierung von Klassen, Serialisierung/Deserialisierung).
  • \n
  • grpc_cpp_plugin — Plugin für den Compiler protoc, der C++-Code aus .proto-Dateien generiert.
  • \n
\n\n

Möglicherweise werden auch Abhängigkeiten benötigt: abseil-cpp, openssl, zlib und c-ares.

\n\n

Installation von gRPC und protobuf

\n\n

Die empfohlene Methode ist die Kompilierung aus den Quellen mit CMake. Beispiel für Linux/macOS:

\n\n
git clone --recurse-submodules -b v1.60.0 https://github.com/grpc/grpc\ncd grpc\nmkdir build && cd build\ncmake .. -DgRPC_INSTALL=ON -DCMAKE_INSTALL_PREFIX=/usr/local\nmake -j$(nproc)\nsudo make install
\n\n

Überprüfen Sie nach der Installation die Verfügbarkeit des protobuf-Compilers und des Plugins:

\n\n
protoc --version\nwhich grpc_cpp_plugin
\n\n

Definition des Dienstes über die .proto-Datei

\n\n

Erstellen wir eine Datei example.proto:

\n\n
syntax = "proto3";\n\npackage example;\n\nservice Greeter {\n  rpc SayHello (HelloRequest) returns (HelloReply);\n}\n\nmessage HelloRequest {\n  string name = 1;\n}\n\nmessage HelloReply {\n  string message = 1;\n}
\n\n

Generieren wir den C++-Code:

\n\n
protoc --cpp_out=. --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` example.proto
\n\n

Als Ergebnis erscheinen die Dateien: example.pb.h, example.pb.cc, example.grpc.pb.h, example.grpc.pb.cc.

\n\n

Implementierung des Servers in C++

\n\n

Erstellen Sie eine Datei server.cc:

\n\n
#include <iostream>\n#include <memory>\n#include <string>\n\n#include <grpcpp/grpcpp.h>\n#include "example.grpc.pb.h"\n\nusing grpc::Server;\nusing grpc::ServerBuilder;\nusing grpc::ServerContext;\nusing grpc::Status;\nusing example::Greeter;\nusing example::HelloRequest;\nusing example::HelloReply;\n\nclass GreeterServiceImpl final : public Greeter::Service {\n  Status SayHello(ServerContext* context,\n                  const HelloRequest* request,\n                  HelloReply* reply) override {\n    std::string prefix("Hello, ");\n    reply->set_message(prefix + request->name());\n    return Status::OK;\n  }\n};\n\nvoid RunServer() {\n  std::string server_address("0.0.0.0:50051");\n  GreeterServiceImpl service;\n\n  ServerBuilder builder;\n  builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());\n  builder.RegisterService(&service);\n\n  std::unique_ptr<Server> server(builder.BuildAndStart());\n  std::cout << "Server listening on " << server_address << std::endl;\n  server->Wait();\n}\n\nint main() {\n  RunServer();\n  return 0;\n}
\n\n

Implementierung des Clients in C++

\n\n

Erstellen Sie eine Datei client.cc:

\n\n
#include <iostream>\n#include <memory>\n#include <string>\n\n#include <grpcpp/grpcpp.h>\n#include "example.grpc.pb.h"\n\nusing grpc::Channel;\nusing grpc::ClientContext;\nusing grpc::Status;\nusing example::Gree                    

Empfehlungen