摘要: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 负载均衡实战

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐