gRPC pour C++ : bibliothèques, exemples et guide pratique
gRPC est un environnement moderne et haute performance d'appel de procédure distante (RPC), développé par Google. Il permet aux applications clientes et serveur dans différents langages (dont C++, Python, Go, Java) de communiquer entre elles aussi facilement que s'il s'agissait d'appels de fonctions locaux. Pour C++, gRPC fournit une interface puissante et fortement typée basée sur Protocol Buffers (protobuf), ce qui en fait un choix idéal pour créer des microservices et des systèmes distribués.
Dans cet article, nous allons examiner les bibliothèques clés, le processus d'installation et écrire un exemple complet de serveur et de client gRPC en C++.
Bibliothèques clés pour gRPC en C++
Pour travailler avec gRPC en C++, vous aurez besoin des composants suivants :
- grpc (libgrpc++) — la bibliothèque principale de gRPC. Elle contient l'implémentation de la couche de transport (HTTP/2), les canaux, les serveurs et les piles asynchrones.
- protobuf (libprotobuf) — la bibliothèque de sérialisation de données structurées. Elle définit le format des messages (fichiers .proto) et génère le code C++.
- grpc++ (libgrpc++_unsecure ou libgrpc++_reflection) — une surcouche C++ de haut niveau pour gRPC. Elle fournit une API synchrone et asynchrone pour les services.
- grpc_cpp_plugin — un plugin pour le compilateur protobuf (
protoc), qui génère le code C++ pour les serveurs et clients gRPC. - abseil-cpp — une bibliothèque de Google utilisée par gRPC pour les chaînes, les threads et la synchronisation (souvent incluse automatiquement).
Installation et configuration
La méthode d'installation recommandée est la compilation à partir des sources ou l'utilisation du gestionnaire de paquets vcpkg/conan. Nous montrons l'installation via vcpkg :
# Installation de vcpkg (si pas encore installé)git clone https://github.com/Microsoft/vcpkg.gitcd vcpkg./bootstrap-vcpkg.sh
# Installation de gRPC avec support C++./vcpkg install grpc[ssl]Après l'installation, connectez les bibliothèques dans CMakeLists.txt :
cmake_minimum_required(VERSION 3.15)project(GrpcExample CXX)
set(CMAKE_CXX_STANDARD 17)find_package(gRPC CONFIG REQUIRED)find_package(Protobuf CONFIG REQUIRED)
# Génération des fichiers protoset(PROTO_FILE proto/hello.proto)set(GENERATED_PROTO_SRC ${CMAKE_CURRENT_BINARY_DIR}/hello.pb.cc)set(GENERATED_PROTO_HDR ${CMAKE_CURRENT_BINARY_DIR}/hello.pb.h)set(GENERATED_GRPC_SRC ${CMAKE_CURRENT_BINARY_DIR}/hello.grpc.pb.cc)set(GENERATED_GRPC_HDR ${CMAKE_CURRENT_BINARY_DIR}/hello.grpc.pb.h)
add_custom_command( OUTPUT ${GENERATED_PROTO_SRC} ${GENERATED_PROTO_HDR} ${GENERATED_GRPC_SRC} ${GENERATED_GRPC_HDR} COMMAND protobuf::protoc ARGS --grpc_out ${CMAKE_CURRENT_BINARY_DIR} --cpp_out ${CMAKE_CURRENT_BINARY_DIR} --plugin=protoc-gen-grpc=$<TARGET_FILE:gRPC::grpc_cpp_plugin> -I ${CMAKE_CURRENT_SOURCE_DIR}/proto ${CMAKE_CURRENT_SOURCE_DIR}/${PROTO_FILE} DEPENDS ${PROTO_FILE} COMMENT "Génération du code gRPC à partir des fichiers proto")add_library(generated_proto ${GENERATED_PROTO_SRC} ${GENERATED_GRPC_SRC})target_include_directories(generated_proto PUBLIC ${CMAKE_CURRENT_BINARY_DIR})target_link_libraries(generated_proto gRPC::grpc++ protobuf::libprotobuf)Création du fichier .proto
Définissons d'abord le service et les messages dans le fichier hello.proto :
syntax = "proto3";
package hello;
// Requête : on envoie un nommessage HelloRequest { string name = 1;}
// Réponse : on reçoit un message de salutationmessage HelloReply { string message = 1;}
// Définition du service gRPCservice Greeter { // RPC Unary (une requête — une réponse) rpc SayHello (HelloRequest) returns (HelloReply);}Implémentation du serveur en C++
Créons le fichier se