Introdução ao gRPC para C++
gRPC é um framework moderno para chamada remota de procedimentos (RPC), desenvolvido pelo Google. Ele utiliza Protocol Buffers (protobuf) para serialização de dados e HTTP/2 como protocolo de transporte. Para a linguagem C++, o gRPC fornece bibliotecas nativas que permitem criar microsserviços e sistemas distribuídos de alto desempenho.
Neste artigo, abordaremos as principais bibliotecas, a configuração do ambiente e escreveremos um exemplo completo de aplicação cliente-servidor em C++.
Principais bibliotecas gRPC para C++
Para trabalhar com gRPC em C++, é necessário instalar vários componentes:
- grpc — biblioteca principal, contendo implementações do servidor e do cliente.
- grpc++ — wrapper C++ sobre o gRPC, fornecendo uma API conveniente.
- protobuf — biblioteca para trabalhar com Protocol Buffers (geração de classes, serialização/desserialização).
- grpc_cpp_plugin — plugin para o compilador protoc, que gera código C++ a partir de arquivos .proto.
Também podem ser necessárias dependências: abseil-cpp, openssl, zlib e c-ares.
Instalação do gRPC e protobuf
A forma recomendada é a compilação a partir do código-fonte usando CMake. Exemplo para Linux/macOS:
git clone --recurse-submodules -b v1.60.0 https://github.com/grpc/grpccd grpcmkdir build && cd buildcmake .. -DgRPC_INSTALL=ON -DCMAKE_INSTALL_PREFIX=/usr/localmake -j$(nproc)sudo make installApós a instalação, verifique a disponibilidade do compilador protobuf e do plugin:
protoc --versionwhich grpc_cpp_pluginDefinição do serviço através do arquivo .proto
Criaremos o arquivo example.proto:
syntax = "proto3";
package example;
service Greeter { rpc SayHello (HelloRequest) returns (HelloReply);}
message HelloRequest { string name = 1;}
message HelloReply { string message = 1;}Geraremos o código C++:
protoc --cpp_out=. --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` example.protoComo resultado, surgirão os arquivos: example.pb.h, example.pb.cc, example.grpc.pb.h, example.grpc.pb.cc.
Implementação do servidor em C++
Crie o arquivo server.cc:
#include <iostream>#include <memory>#include <string>
#include <grpcpp/grpcpp.h>#include "example.grpc.pb.h"
using grpc::Server;using grpc::ServerBuilder;using grpc::ServerContext;using grpc::Status;using example::Greeter;using example::HelloRequest;using example::HelloReply;
class GreeterServiceImpl final : public Greeter::Service { Status SayHello(ServerContext* context, const HelloRequest* request, HelloReply* reply) override { std::string prefix("Hello, "); reply->set_message(prefix + request->name()); return Status::OK; }};
void RunServer() { std::string server_address("0.0.0.0:50051"); GreeterServiceImpl service;
ServerBuilder builder; builder.AddListeningPort(server_address, grpc::InsecureServerCredentials()); builder.RegisterService(&service);
std::unique_ptr<Server> server(builder.BuildAndStart()); std::cout << "Server listening on " << server_address << std::endl; server->Wait();}
int main() { RunServer(); return 0;}Implementação do cliente em C++
Crie o arquivo client.cc:
#include <iostream>#include <memory>#include <string>
#include <grpcpp/grpcpp.h>#include "example.grpc.pb.h"
using grpc::Channel;using grpc::ClientContext;using grpc::Status;using example::Gree Também na biblioteca
Biblioteca Padrão Java: visão geral completa e exemplos de código
Realm Kotlin: Guia completo com exemplos para Kotlin
Configuração de aplicações PHP: bibliotecas e abordagens
Validação de dados em PHP: Guia completo sobre ferramentas e bibliotecas