gRPC para C++: bibliotecas, ejemplos y guía práctica
gRPC es un entorno moderno y de alto rendimiento para llamadas a procedimientos remotos (RPC), desarrollado por Google. Permite que aplicaciones cliente y servidor en diferentes lenguajes (incluyendo C++, Python, Go, Java) se comuniquen entre sí tan fácilmente como si fueran llamadas a funciones locales. Para C++, gRPC proporciona una interfaz potente y fuertemente tipada basada en Protocol Buffers (protobuf), lo que lo convierte en la elección ideal para crear microservicios y sistemas distribuidos.
En este artículo, analizaremos las bibliotecas clave, el proceso de instalación y escribiremos un ejemplo completo de un servidor y cliente gRPC en C++.
Bibliotecas clave para gRPC en C++
Para trabajar con gRPC en C++, necesitará los siguientes componentes:
- grpc (libgrpc++) — la biblioteca principal de gRPC. Contiene la implementación de la capa de transporte (HTTP/2), canales, servidores y pilas asíncronas.
- protobuf (libprotobuf) — biblioteca para la serialización de datos estructurados. Define el formato de los mensajes (archivos .proto) y genera código C++.
- grpc++ (libgrpc++_unsecure o libgrpc++_reflection) — envoltorio de alto nivel de C++ para gRPC. Proporciona una API síncrona y asíncrona para los servicios.
- grpc_cpp_plugin — complemento para el compilador de protobuf (
protoc), que genera código C++ para servidores y clientes gRPC. - abseil-cpp — biblioteca de Google utilizada por gRPC para cadenas, hilos y sincronización (a menudo se incluye automáticamente).
Instalación y configuración
La forma recomendada de instalación es compilar desde el código fuente o usar el gestor de paquetes vcpkg/conan. Mostraremos la instalación a través de vcpkg:
# Instalación de vcpkg (si aún no está instalado)git clone https://github.com/Microsoft/vcpkg.gitcd vcpkg./bootstrap-vcpkg.sh
# Instalación de gRPC con soporte para C++./vcpkg install grpc[ssl]Después de la instalación, enlace las bibliotecas en 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)
# Generación de archivos 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 "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)Creación del archivo .proto
Primero, definamos el servicio y los mensajes en el archivo hello.proto:
syntax = "proto3";
package hello;
// Solicitud: enviamos un nombremessage HelloRequest { string name = 1;}
// Respuesta: recibimos un saludomessage HelloReply { string message = 1;}
// Definimos el servicio gRPCservice Greeter { // Unary RPC (una solicitud — una respuesta) rpc SayHello (HelloRequest) returns (HelloReply);}Implementación del servidor en C++
Creemos el archivo se
También en la biblioteca
Migraciones de bases de datos en Swift: herramientas y enfoques para iOS/macOS
Apache HttpClient para Java: guía completa con ejemplos
Trabajo con Excel en Kotlin: bibliotecas Apache POI y Apache POI para Kotlin
Biblioteca estándar de JavaScript (Node.js): revisión completa