gRPC pour C++ : bibliothèques, configuration et exemples de code

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction à gRPC pour C++

\n\n

gRPC est un framework moderne d'appel de procédure à distance (RPC) développé par Google. Il utilise Protocol Buffers (protobuf) pour la sérialisation des données et HTTP/2 comme protocole de transport. Pour le langage C++, gRPC fournit des bibliothèques natives permettant de créer des microservices haute performance et des systèmes distribués.

\n\n

Dans cet article, nous allons examiner les bibliothèques principales, la configuration de l'environnement et écrire un exemple complet d'application client-serveur en C++.

\n\n

Bibliothèques principales de gRPC pour C++

\n\n

Pour travailler avec gRPC en C++, plusieurs composants doivent être installés :

\n\n
    \n
  • grpc — la bibliothèque principale contenant les implémentations du serveur et du client.
  • \n
  • grpc++ — une surcouche C++ pour gRPC offrant une API pratique.
  • \n
  • protobuf — la bibliothèque pour travailler avec Protocol Buffers (génération de classes, sérialisation/désérialisation).
  • \n
  • grpc_cpp_plugin — le plugin pour le compilateur protoc qui génère du code C++ à partir des fichiers .proto.
  • \n
\n\n

Des dépendances peuvent également être nécessaires : abseil-cpp, openssl, zlib et c-ares.

\n\n

Installation de gRPC et protobuf

\n\n

La méthode recommandée est la compilation à partir des sources via CMake. Exemple pour 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

Après l'installation, vérifiez la disponibilité du compilateur protobuf et du plugin :

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

Définition du service via un fichier .proto

\n\n

Créons un fichier 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

Générons le code C++ :

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

En conséquence, les fichiers suivants apparaissent : example.pb.h, example.pb.cc, example.grpc.pb.h, example.grpc.pb.cc.

\n\n

Implémentation du serveur en C++

\n\n

Créez un fichier 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

Implémentation du client en C++

\n\n

Créez un fichier 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                    

Recommendations