Перейти к содержанию

Последнее обновление:2026-10-12

Небольшой проект на C++ gRPC

C++那些事: маленькое Demo по grpc

Самые популярные на github rpc — это grpc, brpc, а внутри Tencent есть мощный trpc и т.д.; эти rpc поддерживают разные языки и платформы. Сегодня поговорим о том, как использовать grpc, начав с простого demo; весь проект собирается с помощью CMake — это очень стандартное управление rpc-проектом, весь код уже выложен в закрытом сообществе; способ получения — по QR-коду в конце.

1. Окружение Step by Step

Если у вас mac — увы, пока не получится использовать последнюю версию grpc: в ней используется abseil, из-за которого возникают проблемы при компиляции, и официально это пока не решено. Если знаете, как это исправить, — пишите в комментариях; у меня решения пока нет.

Поэтому рекомендуется установить на mac более старую версию grpc либо ставить сразу на linux — там можно использовать последнюю версию grpc, всё ставится без проблем.

Способ установки:

git clone -b v1.57.0 git@github.com:grpc/grpc.git
Затем инициализируем submodule

git submodule update --init
Сборка и установка через 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 权限
Можно изменить каталог установки выше; обратите внимание, что для install нужны права root.

После установки добавьте ваш каталог bin в path, например:

export PATH=/usr/local/grpc/bin:$PATH

2. Demo: переворот строки

Когда окружение готово, можно приступать к делу.

2.1 Протокол

Первое дело — определить rpc-протокол:

syntax = "proto3";

package stringreverse;

service StringReverse {
    rpc sendRequest (StringRequest) returns (StringReply) {}
}

message StringRequest {
    string original = 1;
}

message StringReply {
    string reversed = 1;
}
Очень простой протокол: на вход строка, на выход строка.

2.2 Клиент

Формируем rpc-строку запроса и просто вызываем интерфейс sendRequest, чтобы отправить её.

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 Сервер

Реализуем логику переворота строки через наследование Service.

class ReverseServiceImplementation final : public StringReverse::Service {
    Status sendRequest(ServerContext* context, const StringRequest* request,
                     StringReply* reply) override {
    // 反转逻辑
  }             
}
В конце достаточно зарегистрировать service:

builder.RegisterService(&service);
std::unique_ptr<Server> server(builder.BuildAndStart());
std::cout << "Server listening on port: " << server_address << std::endl;

3. Запуск

Создаём каталог сборки:

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
Компиляция 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
Запуск server:

[light@i-i339drlk build]$ ./server 
Server listening on port: 0.0.0.0:5000
Запуск client:

[light@i-i339drlk build]$ ./client 
Original string: hello world grpc!
Reversed string: !cprg dlrow olleh

Похожие темы

Комментарии