gRPC 用于 C++:库、示例和实践指南
gRPC 是一个由 Google 开发的现代、高性能的远程过程调用(RPC)框架。它允许不同语言(包括 C++、Python、Go、Java)的客户端和服务器应用程序像本地函数调用一样轻松地进行通信。对于 C++,gRPC 基于 Protocol Buffers (protobuf) 提供了一个强大、强类型化的接口,使其成为构建微服务和分布式系统的理想选择。
在本文中,我们将介绍关键库、安装过程,并编写一个完整的 C++ gRPC 服务器和客户端示例。
C++ 中 gRPC 的关键库
要在 C++ 中使用 gRPC,您需要以下组件:
- grpc (libgrpc++) — gRPC 核心库。包含传输层(HTTP/2)、通道、服务器和异步栈的实现。
- protobuf (libprotobuf) — 用于序列化结构化数据的库。定义消息格式(.proto 文件)并生成 C++ 代码。
- grpc++ (libgrpc++_unsecure 或 libgrpc++_reflection) — gRPC 的高级 C++ 封装。为服务提供同步和异步 API。
- grpc_cpp_plugin — protobuf 编译器 (
protoc) 的插件,用于为 gRPC 服务器和客户端生成 C++ 代码。 - abseil-cpp — Google 的库,gRPC 用于字符串、线程和同步(通常自动引入)。
安装和配置
推荐的安装方式是从源码编译或使用包管理器 vcpkg/conan。下面展示通过 vcpkg 安装:
# 安装 vcpkg(如果尚未安装)git clone https://github.com/Microsoft/vcpkg.gitcd vcpkg./bootstrap-vcpkg.sh
# 安装支持 C++ 的 gRPC./vcpkg install grpc[ssl]安装后,在 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)
# 生成 proto 文件set(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 "从 proto 文件生成 gRPC 代码")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)创建 .proto 文件
首先,在 hello.proto 文件中定义服务和消息:
syntax = "proto3";
package hello;
// 请求:发送名字message HelloRequest { string name = 1;}
// 响应:接收问候语message HelloReply { string message = 1;}
// 定义 gRPC 服务service Greeter { // Unary RPC(一个请求 — 一个响应) rpc SayHello (HelloRequest) returns (HelloReply);}用 C++ 实现服务器
创建文件 se