0

0

C++怎么使用gRPC_C++远程调用教程【高效】

冰火之心

冰火之心

发布时间:2026-02-23 15:39:10

|

195人浏览过

|

来源于php中文网

原创

grpc c++远程调用三大核心卡点是编译链配置、同步/异步api选型及channel生命周期管理;需用protoc与匹配版本grpc_cpp_plugin生成代码,正确链接库并管理channel与completionqueue的raii边界。

c++怎么使用grpc_c++远程调用教程【高效】

gRPC C++ 远程调用不是“配好就能跑”,核心卡点在编译链、同步/异步 API 选型、以及 Channel 生命周期管理——这三个地方出错,90% 的连接失败、超时、段错误都源于此。

怎么生成 C++ 客户端和服务端代码(protoc + grpc_cpp_plugin

你写的 .proto 文件不会自动变成 C++ 类;必须用官方插件生成,且顺序和路径不能错。

  • 确保安装的是匹配版本的 protocgrpc_cpp_plugin(比如 gRPC v1.60.x 要求 protoc ≥ 3.21.12)
  • 生成命令必须带 --grpc_out--plugin=protoc-gen-grpc,缺一不可:
    protoc -I . --cpp_out=. --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` helloworld.proto
  • 生成的 helloworld.pb.hhelloworld.grpc.pb.h 必须一起包含,后者才含 Stub 和服务基类
  • 常见错误现象:undefined reference to 'helloworld::Greeter::NewStub' → 通常漏了链接 libgrpc++ 或没编译 .grpc.pb.cc

Channel 创建后为什么立刻 Connect() 失败或卡住?

Channel 默认是懒连接(lazy),首次 RPC 才真正建连;但很多调试场景需要主动探测状态,不能靠“等第一次调用”。

  • grpc::ChannelArguments 显式开启健康检查:
    grpc::ChannelArguments args;<br>args.SetInt(GRPC_ARG_INITIAL_SEQUENCE_NUMBER, 1); // 不关键<br>args.SetInt(GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA, 0); // 防止被中间设备断连
  • 判断连接是否就绪,别用 channel->GetState(true) 循环轮询(会阻塞);改用 channel->WaitForConnected(...) 并设超时
  • 容易踩的坑:把 std::shared_ptr<:channel></:channel> 存在局部变量里,函数返回就析构 → 后续所有 RPC 报 Core is null

同步 vs 异步 API:什么时候该用 Stub::SayHello(),什么时候非得上 AsyncSayHello()

同步调用看着简单,但在高并发下线程数爆炸;异步写法绕,但吞吐翻倍。选错直接拖垮性能。

MyMap AI
MyMap AI

使用AI将想法转化为图表

下载

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

  • 同步 API(如 stub->SayHello(&context, request, &response))适合 CLI 工具、单次调试、或每秒请求
  • 异步 API 必须配合 CompletionQueue 使用;一个 CompletionQueue 可服务多个 RPC,但 Next() 是阻塞调用,别在主线程里独占它
  • 参数差异明显:同步传 grpc::ClientContext* 和响应对象引用;异步传 void* tag,靠 tag 区分回调上下文
  • 性能影响:1000 QPS 下,同步模型需 1000 线程;异步用 4 个线程 + 1 个 CompletionQueue 就能扛住

服务端 ServerBuilder 启动后收不到请求?查这三件事

不是防火墙问题,大概率是监听配置或线程模型没对上。

  • 确认 AddListeningPort() 返回值非 0:
    int port = server_builder.AddListeningPort("0.0.0.0:50051", grpc::InsecureServerCredentials());<br>if (port == 0) { /* 启动失败,可能是端口被占或证书路径错 */ }
  • ServerBuilder::BuildAndStart() 后,必须调用 server->Wait() —— 它不是阻塞等待连接,而是让主线程挂起并维持服务运行;不调就直接退出
  • 如果你用 RegisterService() 注册了多个服务,确保每个服务类的 Request* 方法(如 RequestSayHello)都在 HandleRpcs() 循环里被显式触发,否则请求进来了也没人处理

最常被忽略的是 ChannelCompletionQueue 的生命周期交叉:比如异步客户端里 CompletionQueue 被析构了,但还有未完成的 RPC tag 在排队,程序就崩在 ~Tag() 里。这种问题不会报明确错误,只随机段错误——盯住 RAII 边界,比调接口更重要。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

246

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

846

2024.03.01

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

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

1607

2023.10.19

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

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

463

2025.10.17

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

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

2300

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

40

2026.01.19

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

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

715

2023.08.10

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

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

715

2023.08.10

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

1127

2026.02.13

热门下载

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

精品课程

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

共94课时 | 10万人学习

C 教程
C 教程

共75课时 | 4.9万人学习

C++教程
C++教程

共115课时 | 19.1万人学习

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

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