0

0

c++如何用gRPC和Protobuf c++构建微服务【实践】

冰火之心

冰火之心

发布时间:2025-12-29 17:47:03

|

825人浏览过

|

来源于php中文网

原创

c++kquote>C++实现gRPC微服务核心为三步:编写.proto定义接口、用protoc生成C++代码(含.pb和.grpc.pb文件)、在服务端继承Service类实现RPC方法并在客户端通过Channel/Stub调用;需注意环境配置、生命周期管理及生产安全配置。

c++如何用grpc和protobuf c++构建微服务【实践】

用 C++ 做 gRPC 微服务,核心是三步:写 .proto 定义接口、用 protoc 生成 C++ 代码、在服务端/客户端中调用生成的类和方法。不复杂,但容易卡在环境配置和生命周期管理上。

1. 环境准备与依赖安装

确保系统已安装:

  • Protobuf 编译器(protoc ≥ 3.20),建议从 GitHub 官方发布页 下载预编译二进制,避免源码编译踩坑
  • gRPC C++ 库(含 libgrpc, libgrpc++),推荐用 cmake + fetchcontent 在项目内拉取,避免系统级安装版本冲突
  • CMake ≥ 3.16,支持 find_package(gRPC CONFIG)

不建议用 apt/yum 直接装 grpc-dev —— Ubuntu 的包常滞后且缺 C++ 插件支持。

2. 编写 .proto 文件并生成代码

例如定义一个简单用户服务:

立即学习C++免费学习笔记(深入)”;

// user_service.proto
syntax = "proto3";
package example;

service UserService { rpc GetUser (UserRequest) returns (UserResponse); }

message UserRequest { int32 id = 1; }

message UserResponse { int32 id = 1; string name = 2; bool exists = 3; }

执行生成命令(需确保 protoc 能找到 gRPC 插件):

protoc -I . --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` user_service.proto
protoc -I . --cpp_out=. user_service.proto

会生成 user_service.pb.h/.ccuser_service.grpc.pb.h/.cc。注意:两个 .h 文件都要 include,否则编译报错。

Z Code
Z Code

智谱AI推出的轻量级AI代码编辑器

下载

3. 实现服务端(同步方式)

继承自生成的 UserService::Service 类,重写 RPC 方法:

class UserServiceImpl final : public example::UserService::Service {
public:
  Status GetUser(ServerContext* context, const UserRequest* request,
                 UserResponse* response) override {
    if (request->id() == 123) {
      response->set_id(123);
      response->set_name("Alice");
      response->set_exists(true);
    } else {
      response->set_exists(false);
    }
    return Status::OK;
  }
};

启动服务器时注意:

  • ServerBuilder 添加监听地址(如 "0.0.0.0:50051"
  • 注册服务实例(builder.RegisterService(&service)
  • 调用 builder.BuildAndStart() 后,服务即运行 —— 不需要手动 run() 循环
  • 记得保存返回的 std::unique_ptr,它控制生命周期;析构即关闭服务

4. 编写客户端调用

创建 Channel 和 Stub,再发起调用:

auto channel = grpc::CreateChannel("localhost:50051", grpc::InsecureChannelCredentials());
auto stub = example::UserService::NewStub(channel);

ClientContext context; UserRequest req; req.set_id(123); UserResponse resp;

Status status = stub->GetUser(&context, req, &resp); if (status.ok()) { std::cout << "Name: " << resp.name() << "\n"; } else { std::cerr << "RPC failed: " << status.error_message() << "\n"; }

关键点:

  • Channel 是线程安全的,可复用;Stub 不是,但通常每个线程一个或共享也没问题
  • InsecureChannelCredentials() 仅用于开发;生产务必用 ssl_credentials 并配置根证书
  • 同步调用会阻塞当前线程;如需异步,用 AsyncUnaryCall + CompletionQueue,但复杂度明显上升

整个流程跑通后,就可以加日志、健康检查(gRPC 自带 /healthz)、服务发现(配合 Consul/Etcd)、熔断(用 client-side interceptor 封装)了。C++ gRPC 性能高、控制强,适合对延迟和资源敏感的微服务场景。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

987

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

44

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

19

2025.12.29

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

466

2023.08.10

Golang channel原理
Golang channel原理

本专题整合了Golang channel通信相关介绍,阅读专题下面的文章了解更多详细内容。

238

2025.11.14

golang channel相关教程
golang channel相关教程

本专题整合了golang处理channel相关教程,阅读专题下面的文章了解更多详细内容。

320

2025.11.17

常见的linux系统有哪些
常见的linux系统有哪些

linux系统有Ubuntu、Fedora、CentOS、Debian、openSUSE、Arch Linux、Gentoo、Slackware、Linux Mint、Kali Linux。更多关于linux系统的文章详情请阅读本专题下面的文章。php中文网欢迎大家前来学习。

791

2023.10.27

ubunt上安装和配置vnc
ubunt上安装和配置vnc

安装方法:安装VNC服务器、启动VNC服务器、设置VNC密码等等。想了解更多ubuntu的相关内容,可以阅读本专题下面的文章。

407

2023.12.28

俄罗斯搜索引擎Yandex最新官方入口网址
俄罗斯搜索引擎Yandex最新官方入口网址

Yandex官方入口网址是https://yandex.com;用户可通过网页端直连或移动端浏览器直接访问,无需登录即可使用搜索、图片、新闻、地图等全部基础功能,并支持多语种检索与静态资源精准筛选。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1

2025.12.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 2.3万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.5万人学习

Git中文开发手册
Git中文开发手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号