trpc-cpp服务启动失败的主因是main()中未调用trpc::run(),导致框架初始化后立即退出;需在main末尾显式调用该函数以启动运行时、加载配置并阻塞等待信号。

trpc-cpp 服务启动失败:main() 里漏了 trpc::Run()
绝大多数新手卡在第一步——服务进程启动后立刻退出,日志里连监听端口都没打出来。根本原因是没调用框架的主循环入口。
trpc-cpp 不是“写完 handler 就自动跑”,它依赖显式启动运行时。你得在 main() 最后一行塞上 trpc::Run(),否则框架初始化完就返回了。
-
trpc::Run()会接管线程、加载配置、启动 server、阻塞等待信号 - 如果用了
trpc::CreateServer()却没调trpc::Run(),server 对象只是被构造出来,根本没 bind/listen - 常见错误现象:
ps aux | grep your_app看到进程秒退;日志无Starting server on 0.0.0.0:8000类提示
定义 RPC 接口:别手写 pb 文件,用 trpc_proto_plugin 自动生成
trpc-cpp 强依赖 Protocol Buffers,但它的代码生成不是标准 protoc 能直接搞定的——必须走腾讯定制插件 trpc_proto_plugin,否则生成的 stub 缺关键元信息,RegisterServiceMethod() 会静默失败。
正确流程是:写好 helloworld.proto → 用 protoc --plugin=protoc-gen-trpc=trpc_proto_plugin 生成 helloworld.trpc.pb.h/cc → 在 service 类里继承生成的 TrpcHelloService 基类。
- 生成命令里
--cpp_out和--trpc_out必须同时指定,缺一不可 - 生成的
.trpc.pb.h里有RegisterServiceMethod()的模板特化,这是 trpc 运行时识别 method 的唯一依据 - 如果只用原生
protoc --cpp_out,编译能过,但 runtime 注册时 method 列表为空,客户端调用直接报TRPC-CLIENT-0001: method not found
Client 调用超时:默认 1s 太短,SetTimeout() 必须在 Stub 构造后立即设
trpc-cpp client 默认超时是 1 秒,对本地开发或压测几乎必然失败。但很多人把 SetTimeout() 写在发起 Call() 之前却无效——因为 Stub 是值语义对象,每次拷贝都会重置配置。
正确做法是在创建 Stub 实例后、任何调用前,立刻调用其成员函数设置超时。且注意:这个 timeout 是 per-call 的,不是全局连接池级的。
- 错误写法:
auto stub = MakeStub<helloservice>(); stub.SetTimeout(5000); stub.SayHello(...)</helloservice>——MakeStub返回临时对象,stub是拷贝体,SetTimeout修改的是临时对象 - 正确写法:
auto stub = MakeStub<helloservice>(); stub->SetTimeout(5000); stub->SayHello(...)</helloservice>(返回指针)或auto& stub = MakeStub<helloservice>(); stub.SetTimeout(5000); ...</helloservice> - 不设超时 + 网络抖动 → 客户端卡住 1s 后报
TRPC-CLIENT-0002: timeout,服务端其实已处理完
配置文件加载失败:trpc.yaml 必须放在当前工作目录,且不能靠 setenv("TRPC_CONFIG_PATH",...) 覆盖
trpc-cpp 启动时硬编码查找 ./trpc.yaml,不读 ~/.trpc.yaml,也不认环境变量改路径。很多同学把配置放错位置,结果服务用的全是默认值(比如监听 0.0.0.0:80,而不是你写的 8000)。
更隐蔽的问题是:CMake 构建的可执行文件运行时工作目录常是 build/ 下,不是源码根目录。所以 trpc.yaml 得复制到 build/ 目录下,或者用 cd 切到源码目录再运行。
- 验证是否加载成功:启动时看日志有没有
Load config from ./trpc.yaml success - 想换路径?只能改源码重编译
trpc::config::kDefaultConfigPath,没有运行时开关 - 配置里
server.service_name必须和代码中RegisterService()传入的 name 完全一致,否则服务注册不上,客户端发现不了
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











