Última actualización:2026-10-12
Pequeño proyecto gRPC en C++¶
C++那些事: pequeña Demo de grpc¶
Entre los rpc más populares de github están grpc y brpc, además del potente trpc interno de Tencent, etc.; estos rpc dan soporte a distintos lenguajes y plataformas. Hoy hablaremos de cómo usar grpc partiendo de una demo sencilla; todo el proyecto se construye con CMake, una gestión de proyecto rpc totalmente estándar; todo el código ya está actualizado en la comunidad 星球 y la forma de obtenerlo está en el código QR del final.
1. Entorno, paso a paso¶
Si tu ordenador es mac, lo siento: de momento no puedes usar la última versión de grpc, ya que esta emplea abseil y la compilación da problemas; la solución oficial aún no ha llegado. Si alguien sabe cómo resolverlo, puede dejar un comentario; por mi parte, todavía no he encontrado la manera.
Así que recomiendo instalar una versión inferior de grpc en tu mac, o instalar directamente en linux, donde sí puedes usar la última versión de grpc: una sola instalación y ningún problema.
Forma de instalación:
Después inicializa el submodule
Compilación e instalación con cmake:
cd cmake
mkdir build
cd build
cmake -DgRPC_INSTALL=ON -DgRPC_BUILD_TESTS=OFF -DCMAKE_INSTALL_PREFIX=/usr/local/grpc ../..
make -j8
make -j8 install // root 权限
Podéis cambiar el directorio de instalación anterior; nótese que al instalar se necesitan permisos de root.
Tras la instalación, añade tu directorio bin al path; por ejemplo:
2. Demo de inversión de cadenas¶
Con el entorno listo, ya podemos ponernos manos a la obra.
2.1 Protocolo¶
Lo primero es fijar el protocolo rpc:
syntax = "proto3";
package stringreverse;
service StringReverse {
rpc sendRequest (StringRequest) returns (StringReply) {}
}
message StringRequest {
string original = 1;
}
message StringReply {
string reversed = 1;
}
Un protocolo muy sencillo: se envía una cadena y se devuelve una cadena.
2.2 Cliente¶
Construye la cadena de la petición rpc y luego llama a la interfaz sendRequest para enviarla.
std::string str = "hello world grpc!";
std::cout << "Original string: " << str << std::endl;
StringRequest request;
StringReply reply;
ClientContext context;
request.set_original(str);
Status status = stub->sendRequest(&context, request, &reply);
if (status.ok()) {
std::cout << "Reversed string: " << reply.reversed() << std::endl;
}
// do something
2.3 Servidor¶
Implementa la lógica de inversión de cadenas heredando de Service.
class ReverseServiceImplementation final : public StringReverse::Service {
Status sendRequest(ServerContext* context, const StringRequest* request,
StringReply* reply) override {
// 反转逻辑
}
}
Por último, basta con registrar el service:
builder.RegisterService(&service);
std::unique_ptr<Server> server(builder.BuildAndStart());
std::cout << "Server listening on port: " << server_address << std::endl;
3. Ejecución¶
Crea el directorio de compilación:
mkdir build
cmake ..
# 输出
-- The C compiler identification is GNU 10.2.1
-- The CXX compiler identification is GNU 10.2.1
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /opt/rh/devtoolset-10/root/usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /opt/rh/devtoolset-10/root/usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE
-- Found Protobuf: /usr/local/grpc/bin/protoc-23.4.0 (found version "23.4.0")
-- Using protobuf
-- Using gRPC 1.57.0
-- Configuring done
-- Generating done
-- Build files have been written to: /code/stringreverse/build
Compilación con make:
[ 10%] Generating stringreverse.pb.cc, stringreverse.pb.h, stringreverse.grpc.pb.cc, stringreverse.grpc.pb.h
Scanning dependencies of target server
[ 20%] Building CXX object CMakeFiles/server.dir/server.cc.o
[ 30%] Building CXX object CMakeFiles/server.dir/stringreverse.pb.cc.o
[ 40%] Building CXX object CMakeFiles/server.dir/stringreverse.grpc.pb.cc.o
[ 50%] Linking CXX executable server
[ 50%] Built target server
Scanning dependencies of target client
[ 60%] Building CXX object CMakeFiles/client.dir/client.cc.o
[ 70%] Building CXX object CMakeFiles/client.dir/stringreverse.pb.cc.o
[ 80%] Building CXX object CMakeFiles/client.dir/stringreverse.grpc.pb.cc.o
[ 90%] Linking CXX executable client
[100%] Built target client
Ejecuta el server:
Ejecuta el client:
[light@i-i339drlk build]$ ./client
Original string: hello world grpc!
Reversed string: !cprg dlrow olleh
Temas relacionados¶
- Implementando C++ FnOnce a mano | C++那些事
- Comunicación entre procesos en C++ en la práctica | C++那些事
- Demo de servicio de URL cortas en C++ | C++那些事
- C++17 y SQLite para medir el tamaño de directorios | C++那些事
- Pruebas de rendimiento con Google Benchmark | C++那些事
- Servidor HTTP con corrutinas de C++20 | C++那些事
- Serialización ZeroCopy con Protobuf | C++那些事
- Acelerar Python con pybind11 | C++那些事
- Diseño de una calculadora de pila en C++ | C++那些事