C++ gRPC 超详细实战教程|核心用途、安装部署、业务场景、完整可运行代码
摘要:gRPC 是 Google 开源、基于 HTTP/2 + Protobuf 的工业级跨语言 RPC 框架(官网:https://grpc.io),是目前 C++ 后端微服务、高性能跨服务通信的标准方案。本文从零讲解 gRPC 核心用途、企业级使用场景、Linux 环境完整安装流程,全程手写纯 C++ 服务端/客户端实战代码,无冗余废话,可直接编译上线。
一、gRPC 是什么?核心定位与用途
区别于小众自研 crpc,gRPC 是业界通用标准,大厂全覆盖、生态成熟、长期维护,生产环境首选。
-
跨服务高性能通信:替代 HTTP 接口,二进制传输,吞吐更高、延迟更低
-
标准化接口管理:通过 Protobuf 定义接口,自动生成多语言代码,杜绝接口不一致
-
云原生标配:K8s、微服务、云服务、中间件底层默认通信协议
-
HTTP 基于文本 JSON,序列化慢、包体冗余;gRPC 二进制 Protobuf,压缩率高、解析极速
-
HTTP 无强接口约束;gRPC 接口强校验、自动代码生成,减少线上BUG
二、gRPC 企业级真实使用场景
场景1:C++高性能微服务内部通信
网关服务、业务核心服务、存储服务之间内网互通,替代 HTTP 接口,提升整体服务吞吐与响应速度,是 C++ 后端微服务标准化方案。
场景2:大数据/数据库中间件交互
分布式缓存、数据库代理、数据同步服务,通过 gRPC 实现高并发、低延迟数据读写与同步。
场景3:实时流式数据传输
日志采集、监控指标上报、设备实时上报、音视频流传输,利用 gRPC 流式能力实现持续数据推送。
场景4:跨语言服务对接
C++底层高性能服务 + Java/Go 业务服务组合架构,通过 gRPC 统一接口调用,各司其职。
场景5:云服务、容器生态通信
K8s 组件、云原生服务、微服务网格 Istio 底层默认使用 gRPC 通信。
三、Linux 环境 gRPC C++ 完整安装部署
3.1 安装依赖
sudo apt update
sudo apt install -y build-essential cmake git libssl-dev
3.2 拉取官方 gRPC 源码(最新稳定版)
git clone https://github.com/grpc/grpc.git
cd grpc
git submodule update --init --recursive
3.3 编译安装 gRPC + Protobuf
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)
sudo make install
安装完成后,系统全局拥有 gRPC 编译工具、Protobuf 编译器、C++ 依赖库。
四、C++ gRPC 完整实战项目(可直接编译运行)
我们从零实现:Protobuf 接口定义 → 自动生成 C++ 代码 → gRPC 服务端实现 → gRPC 客户端调用,纯原生 C++,无第三方封装。
4.1 项目结构
grpc_demo/
├── hello.proto # 接口定义文件
├── server.cpp # C++服务端
├── client.cpp # C++客户端
└── CMakeLists.txt# 编译配置
4.2 编写 proto 接口文件(hello.proto)
gRPC 所有接口、参数、返回值均通过 proto 定义,自动生成 C++ 代码:
syntax = "proto3";
package demo;
// 定义RPC服务
service HelloService {
// 简单单向RPC接口
rpc SayHello (HelloRequest) returns (HelloReply);
}
// 请求参数
message HelloRequest {
string username = 1;
int32 age = 2;
}
// 响应参数
message HelloReply {
int32 code = 1;
string msg = 2;
string data = 3;
}
4.3 CMake 编译配置(CMakeLists.txt)
cmake_minimum_required(VERSION 3.13)
project(grpc_cpp_demo)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 查找gRPC与Protobuf
find_package(Protobuf REQUIRED)
find_package(GRPC REQUIRED)
include_directories(${PROTOBUF_INCLUDE_DIRS})
# proto文件自动生成代码
set(PROTO_FILE hello.proto)
set(GENERATED_PROTO
${CMAKE_CURRENT_BINARY_DIR}/hello.pb.cc
${CMAKE_CURRENT_BINARY_DIR}/hello.pb.h
${CMAKE_CURRENT_BINARY_DIR}/hello.grpc.pb.cc
${CMAKE_CURRENT_BINARY_DIR}/hello.grpc.pb.h
)
add_custom_command(
OUTPUT ${GENERATED_PROTO}
COMMAND protoc
ARGS --grpc_out=${CMAKE_CURRENT_BINARY_DIR}
--plugin=protoc-gen-grpc=`which grpc_cpp_plugin`
--cpp_out=${CMAKE_CURRENT_BINARY_DIR}
${PROTO_FILE}
DEPENDS ${PROTO_FILE}
)
# 编译服务端
add_executable(server server.cpp ${GENERATED_PROTO})
target_link_libraries(server grpc grpc++ ${PROTOBUF_LIBRARIES} pthread)
# 编译客户端
add_executable(client client.cpp ${GENERATED_PROTO})
target_link_libraries(client grpc grpc++ ${PROTOBUF_LIBRARIES} pthread)
4.4 C++ gRPC 服务端完整代码(server.cpp)
#include <iostream>
#include <memory>
#include <string>
#include <grpcpp/grpcpp.h>
#include "hello.grpc.pb.h"
using grpc::Server;
using grpc::ServerBuilder;
using grpc::ServerContext;
using demo::HelloService;
using demo::HelloRequest;
using demo::HelloReply;
// 实现自定义RPC服务
class HelloServiceImpl final : public HelloService::Service {
// 实现SayHello接口
grpc::Status SayHello(ServerContext* context,
const HelloRequest* request,
HelloReply* reply) override {
// 读取客户端参数
std::string name = request->username();
int age = request->age();
std::cout << "服务端接收请求:name=" << name << ", age=" << age << std::endl;
// 封装响应数据
reply->set_code(200);
reply->set_msg("success");
reply->set_data("Hello gRPC C++ Demo, welcome " + name);
return grpc::Status::OK;
}
};
// 启动RPC服务
void RunServer() {
std::string server_address("0.0.0.0:9000");
HelloServiceImpl service;
ServerBuilder builder;
// 监听端口,不开启SSL加密(测试环境)
builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
// 注册服务实现
builder.RegisterService(&service);
// 启动服务
std::unique_ptr<Server> server(builder.BuildAndStart());
std::cout << "gRPC C++服务启动成功,监听端口:" << server_address << std::endl;
// 阻塞运行
server->Wait();
}
int main(int argc, char** argv) {
RunServer();
return 0;
}
4.5 C++ gRPC 客户端完整代码(client.cpp)
#include <iostream>
#include <memory>
#include <string>
#include <grpcpp/grpcpp.h>
#include "hello.grpc.pb.h"
using grpc::Channel;
using grpc::ClientContext;
using grpc::Status;
using demo::HelloService;
using demo::HelloRequest;
using demo::HelloReply;
// gRPC客户端封装
class HelloClient {
public:
HelloClient(std::shared_ptr<Channel> channel)
: stub_(HelloService::NewStub(channel)) {}
// 调用远程SayHello接口
std::string SayHello(const std::string& user, int age) {
HelloRequest request;
HelloReply reply;
ClientContext context;
request.set_username(user);
request.set_age(age);
// 同步调用RPC接口
Status status = stub_->SayHello(&context, request, &reply);
if (status.ok()) {
return "code:" + std::to_string(reply.code())
+ " msg:" + reply.msg()
+ " data:" + reply.data();
} else {
return status.error_message();
}
}
private:
std::unique_ptr<HelloService::Stub> stub_;
};
int main(int argc, char** argv) {
// 连接本地9000端口gRPC服务
HelloClient greeter(grpc::CreateChannel(
"localhost:9000", grpc::InsecureChannelCredentials()));
// 发起RPC调用
std::string result = greeter.SayHello("C++开发者", 25);
std::cout << "客户端接收响应:" << result << std::endl;
return 0;
}
五、编译 & 完整运行测试流程
5.1 编译命令
mkdir build && cd build
cmake ..
make -j4
5.2 运行服务端与客户端
终端1(启动服务端):
./server
输出:gRPC C++服务启动成功,监听端口:0.0.0.0:9000
终端2(启动客户端):
./client
客户端成功调用服务端,完成跨函数远程通信。
六、gRPC C++ 高阶能力简述
6.1 超时控制
客户端可单独设置 RPC 超时时间,避免接口卡死:
context.set_deadline(std::chrono::system_clock::now() + std::chrono::milliseconds(500));
6.2 异步调用
gRPC 原生支持异步非阻塞调用,超高并发场景必备,不阻塞业务线程。
6.3 流式通信
支持客户端流、服务端流、双向流,适配大文件传输、实时数据推送场景。
七、gRPC 生产环境最佳实践
-
生产环境开启 SSL 加密通信,禁止使用 Insecure 不安全模式
-
统一设置 RPC 超时,防止服务雪崩
-
复用 Channel 连接,避免频繁创建销毁连接
-
结合日志、监控、链路追踪做全局可观测性
-
高并发场景优先使用异步 gRPC 接口
八、总结
gRPC(gRPC)是 Google 官方标准 RPC 框架,也是 C++ 分布式服务、微服务通信的工业级首选方案。对比小众自研框架,gRPC 生态完善、性能强悍、跨语言互通、能力全面。
拓展学习:gRPC 异步调用、双向流式通信、SSL 加密部署、gRPC 负载均衡实战
更多推荐




所有评论(0)