gRPC für C++: Bibliotheken, Beispiele und praktische Anleitung
gRPC ist eine moderne, leistungsstarke Umgebung für entfernte Prozeduraufrufe (RPC), entwickelt von Google. Sie ermöglicht es Client- und Serveranwendungen in verschiedenen Sprachen (einschließlich C++, Python, Go, Java), miteinander zu kommunizieren, als wären es lokale Funktionsaufrufe. Für C++ bietet gRPC eine leistungsstarke, streng typisierte Schnittstelle basierend auf Protocol Buffers (protobuf), was es zur idealen Wahl für die Erstellung von Mikroservices und verteilten Systemen macht.
In diesem Artikel werden wir die wichtigsten Bibliotheken, den Installationsprozess besprechen und ein vollständiges Beispiel eines gRPC-Servers und -Clients in C++ schreiben.
Wichtige Bibliotheken für gRPC in C++
Für die Arbeit mit gRPC in C++ benötigen Sie die folgenden Komponenten:
- grpc (libgrpc++) — die Hauptbibliothek von gRPC. Enthält die Implementierung der Transportschicht (HTTP/2), Kanäle, Server und asynchrone Stacks.
- protobuf (libprotobuf) — Bibliothek zur Serialisierung strukturierter Daten. Definiert das Nachrichtenformat (.proto-Dateien) und generiert C++-Code.
- grpc++ (libgrpc++_unsecure oder libgrpc++_reflection) — High-Level C++-Wrapper für gRPC. Bietet eine synchrone und asynchrone API für Dienste.
- grpc_cpp_plugin — Plugin für den protobuf-Compiler (
protoc), das C++-Code für gRPC-Server und -Clients generiert. - abseil-cpp — Bibliothek von Google, die von gRPC für Zeichenketten, Threads und Synchronisation verwendet wird (wird oft automatisch eingebunden).
Installation und Konfiguration
Die empfohlene Installationsmethode ist die Kompilierung aus dem Quellcode oder die Verwendung des Paketmanagers vcpkg/conan. Wir zeigen die Installation über vcpkg:
# Installation von vcpkg (falls noch nicht installiert)git clone https://github.com/Microsoft/vcpkg.gitcd vcpkg./bootstrap-vcpkg.sh
# Installation von gRPC mit C++-Unterstützung./vcpkg install grpc[ssl]Nach der Installation binden Sie die Bibliotheken in CMakeLists.txt ein:
cmake_minimum_required(VERSION 3.15)project(GrpcExample CXX)
set(CMAKE_CXX_STANDARD 17)find_package(gRPC CONFIG REQUIRED)find_package(Protobuf CONFIG REQUIRED)
# Generierung der Proto-Dateienset(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 "Generating gRPC code from proto files")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)Erstellen einer .proto-Datei
Zuerst definieren wir den Dienst und die Nachrichten in der Datei hello.proto:
syntax = "proto3";
package hello;
// Anfrage: Senden eines Namensmessage HelloRequest { string name = 1;}
// Antwort: Empfangen einer Begrüßungmessage HelloReply { string message = 1;}
// Definition des gRPC-Dienstesservice Greeter { // Unary RPC (eine Anfrage — eine Antwort) rpc SayHello (HelloRequest) returns (HelloReply);}Implementierung des Servers in C++
Erstellen wir die Datei se
Auch in der Bibliothek
Java für Geolokalisierung und Karten: Bibliotheken, APIs und Beispiele
OAuth-Client für Kotlin: Ktor OAuth-Bibliothek für API-Authentifizierung
Arbeit mit S3 und Cloud-Speichern in TypeScript: Bibliotheken und Beispiele
Testen in C# (.NET): Vollständiger Überblick über Frameworks und Tools
GraphQL-Bibliothek für C++: API-Implementierung mit graphql-cpp