gRPC para C++: bibliotecas, exemplos e guia prático
gRPC é um ambiente moderno e de alto desempenho para chamada de procedimento remoto (RPC), desenvolvido pelo Google. Ele permite que aplicativos cliente e servidor em diferentes linguagens (incluindo C++, Python, Go, Java) se comuniquem entre si com a mesma facilidade de chamadas de funções locais. Para C++, o gRPC fornece uma interface poderosa e fortemente tipada baseada em Protocol Buffers (protobuf), tornando-o a escolha ideal para criar microsserviços e sistemas distribuídos.
Neste artigo, abordaremos as principais bibliotecas, o processo de instalação e criaremos um exemplo completo de servidor e cliente gRPC em C++.
Principais bibliotecas para gRPC em C++
Para trabalhar com gRPC em C++, você precisará dos seguintes componentes:
- grpc (libgrpc++) — a biblioteca principal do gRPC. Contém a implementação da camada de transporte (HTTP/2), canais, servidores e pilhas assíncronas.
- protobuf (libprotobuf) — biblioteca para serialização de dados estruturados. Define o formato das mensagens (arquivos .proto) e gera código C++.
- grpc++ (libgrpc++_unsecure ou libgrpc++_reflection) — wrapper C++ de alto nível para gRPC. Fornece API síncrona e assíncrona para serviços.
- grpc_cpp_plugin — plugin para o compilador protobuf (
protoc), que gera código C++ para servidores e clientes gRPC. - abseil-cpp — biblioteca do Google usada pelo gRPC para strings, threads e sincronização (geralmente incluída automaticamente).
Instalação e configuração
A forma recomendada de instalação é compilar a partir do código-fonte ou usar o gerenciador de pacotes vcpkg/conan. Mostraremos a instalação via vcpkg:
# Instalação do vcpkg (se ainda não estiver instalado)git clone https://github.com/Microsoft/vcpkg.gitcd vcpkg./bootstrap-vcpkg.sh
# Instalação do gRPC com suporte a C++./vcpkg install grpc[ssl]Após a instalação, conecte as bibliotecas no 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)
# Geração de arquivos 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)Criação do arquivo .proto
Primeiro, definimos o serviço e as mensagens no arquivo hello.proto:
syntax = "proto3";
package hello;
// Requisição: enviamos um nomemessage HelloRequest { string name = 1;}
// Resposta: recebemos uma saudaçãomessage HelloReply { string message = 1;}
// Definimos o serviço gRPCservice Greeter { // Unary RPC (uma requisição — uma resposta) rpc SayHello (HelloRequest) returns (HelloReply);}Implementação do servidor em C++
Criaremos o arquivo se
Também na biblioteca
Trabalhando com YAML em Node.js: bibliotecas js-yaml e yaml
Processamento JSON em Swift: Codable, Foundation e SwiftyJSON para iOS/macOS
Aprendizado de Máquina em C# (.NET): visão geral das bibliotecas ML.NET, Accord.NET, TensorFlow.NET