资讯动态

Apache bRPC 中文技术总览:工业级 C++ RPC 框架的多协议、高性能与可观测性实战指南

发布时间:2026/10/3 13:31:52 来源:尧图企业网站定制
【免费下载链接】brpcbrpc is an Industrial-grade RPC framework using C Language, which is often used in high performance system such as Search, Storage, Machine learning, Advertisement, Recommendation etc. brpc means better RPC.项目地址https://gitcode.com/gh_mirrors/brpc3/brpc点击查看免费下载Apache bRPCbetter RPC是使用 C 语言编写的工业级 RPC 框架常用于搜索、存储、机器学习、广告、推荐等高性能系统。本指南以仓库根目录下的 README_cn.md 为主体骨架结合src/brpc下的核心源码与example/echo_c完整示例系统讲解 bRPC 的单端口多协议能力、服务端同步/异步处理模型、客户端多种调用模式、内置调试服务与性能剖析工具并给出从编译到运行的完整实战路径。读完本文你将掌握 bRPC 的架构全貌、核心 API 的底层实现原理以及如何快速上手搭建并调试一个基于 bRPC 的高性能服务。一、bRPC 是什么better RPC 的工业级定位bRPC 是 Apache 软件基金会旗下的 C RPC 框架其名字 bRPC 的含义正是better RPC。它在百度内部有超过 100 万个实例不含 client和上千种服务长期运行经历了大规模生产环境的考验参见 docs/cn/overview.md。它的典型应用场景包括搜索索引与排序服务之间的高频调用存储table 存储、KV 访问等数据路径机器学习模型训练、高性能计算广告与推荐在线预测与特征服务bRPC 的核心设计哲学是把复杂留给自己把简单交给用户从源码结构看框架对外只暴露三个主要的用户类——Serversrc/brpc/server.h、Channelsrc/brpc/channel.h、Controllersrc/brpc/controller.h分别对应服务端、客户端与参数集合用户无需纠结底层组件如何组合、上下文如何流转。二、核心能力一个端口多协议共存bRPC 最具辨识度的能力是搭建一个能在同一个端口上支持多协议的服务或通过一个 Channel 访问各种不同协议的服务。服务端收到连接后会根据请求内容自动识别协议并分发处理客户端则在ChannelOptions.protocol中指定序列化协议。2.1 内置协议全景根据 README_cn.md 与协议注册源码 src/brpc/global.cppbRPC 内置支持以下协议协议说明客户端服务端restful http/https用 bRPC 的 HTTP 实现访问/提供服务比 libcurl 更友好支持从其他语言通过 HTTP/h2 json 访问基于 protobuf 的协议✅✅h2 / gRPCHTTP/2 及 gRPC 协议✅✅redis线程安全比官方 client 更方便✅✅memcached线程安全比官方 client 更方便✅✅rtmp / flv / hls可用于搭建流媒体服务✅✅hadoop_rpcHadoop 生态协议可能开源✅✅thriftApache Thrift 协议线程安全✅✅baidu_std百度内部标准协议✅✅streaming_rpc百度流式 RPC✅✅hulu_pbrpc / sofa_pbrpc / nova_pbrpc / public_pbrpc / ubrpc百度内部使用的各类 pbrpc 变体✅✅nshead 及其衍生协议基于 nshead 头的各种协议✅✅mongoMongoDB 有线协议仅服务端❌✅rdma支持通过 RDMA 而非 TCP 传输见 docs/cn/rdma.md✅✅协议枚举统一定义在 src/brpc/options.proto 的ProtocolType中如PROTOCOL_BAIDU_STD 1、PROTOCOL_HTTP 7、PROTOCOL_REDIS 10、PROTOCOL_THRIFT 6、PROTOCOL_H2 26连接类型枚举ConnectionType定义了SINGLE单连接、POOLED连接池、SHORT短连接三种基础类型取值按位独占可组合表示协议支持的多种连接方式。2.2 协议的注册与分发源码级原理bRPC 的每个协议都是一个描述其各处理阶段的协议描述符。核心结构Protocol定义在 src/brpc/protocol.h包含parse从二进制流切分消息、process_request/process_response处理请求/响应、serialize_request/pack_request序列化与打包、parse_server_address解析服务地址、verify请求校验等回调以及默认连接类型和协议名。在 src/brpc/global.cpp 中框架启动时会调用RegisterProtocol()把各协议描述符注册进全局协议表例如baidu_std、streaming_rpcCONNECTION_TYPE_SINGLEhttpCONNECTION_TYPE_POOLED_AND_SHORT回调为ParseHttpMessage/ProcessHttpRequesth2CONNECTION_TYPE_SINGLE回调为ParseH2MessagememcacheParseMemcacheMessage、redisParseRedisMessage、mongoParseMongoMessagenshead、thrift_binary_protocol、rtmp等正是这套注册制 描述符机制让服务端可以在一个监听端口上同时识别并处理多种协议同时 src/brpc/global.cpp 中还实现了 Dummy Server占位服务当需要启动一个不提供任何业务服务的进程时bRPC 会自动在本机随机端口启动一个最小服务并将端口号写入dummy_server.port文件供客户端访问详见 docs/cn/dummy_server.md。2.3 高可用基于 RAFT 构建分布式系统bRPC 还内置了对RAFT 一致性算法的工业级实现可用来搭建高可用分布式系统该实现已在独立的 braft 项目中开源仓库内相关协议见 src/brpc/options.proto。三、Server同步与异步两种处理模型bRPC 的 Server 既能同步也能异步处理请求两种方式的区别与写法详见 docs/cn/server.md。从 src/brpc/server.h 的class Server源码看服务端生命周期非常清晰AddService(service, ownership)注册一个 protobuf servicesrc/brpc/server.h。ownership决定 Server 是否接管 service 的销毁SERVER_OWNS_SERVICE表示 Server 负责删除SERVER_DOESNT_OWN_SERVICE表示用户自行管理。还可以通过带restful_mappings的重载把服务方法映射为 RESTful URL。Start(ip_port / port, options)启动监听。支持多种入参形式IP:端口字符串、EndPoint、整数端口、端口区间端口传0时由内核自动分配src/brpc/server.h。RunUntilAskedToQuit()阻塞等待 Ctrl-C 信号收到后自动 Stop 并 Joinsrc/brpc/server.h。注意调用该函数后程序中不要再自行调用signal(SIGINT, ...)。Stop()/Join()Stop()停止接收新连接与请求Join()等待在途请求处理完成。二者分离设计的目的在于可以先 Stop 多个 Server 再统一 Join使总等待时间收敛到最慢的那个 Joinsrc/brpc/server.h。Join()期间新请求会以ELOGOFF错误快速返回客户端看到该错误后应转向其他节点。3.1 完整示例echo_c仓库中的 example/echo_c 是一个可编译运行的完整示例其server.cpp展示了服务端核心写法example/echo_c/server.cppbrpc::Server server; example::EchoServiceImpl echo_service_impl; // 第二个参数service 在栈上用 SERVER_DOESNT_OWN_SERVICE 避免被 server 删除 if (server.AddService(echo_service_impl, brpc::SERVER_DOESNT_OWN_SERVICE) ! 0) { LOG(ERROR) Fail to add service; return -1; } ... if (server.Start(FLAGS_port, NULL) ! 0) { LOG(ERROR) Fail to start EchoServer; return -1; } server.RunUntilAskedToQuit();服务方法的实现体现了 bRPC 异步编程的要点example/echo_c/server.cppvirtual void Echo(google::protobuf::RpcController* cntl_base, const EchoRequest* request, EchoResponse* response, google::protobuf::Closure* done) { // ClosureGuard 以 RAII 方式保证 done-Run() 必然被调用 // 若需要异步处理可调用 done_guard.release() 延迟释放 brpc::ClosureGuard done_guard(done); brpc::Controller* cntl static_castbrpc::Controller*(cntl_base); // 通过 Controller 获取对端地址、请求附件等 LOG(INFO) Received request[log_id cntl-log_id() ] from cntl-remote_side() : request-message(); response-set_message(request-message()); // 附件直接按字节流写到网络上不经 protobuf 序列化 cntl-response_attachment().append(cntl-request_attachment()); }其中donegoogle::protobuf::Closure*是 bRPC 异步模型的开关若在函数返回前调用了done-Run()则该请求是同步处理的若把done保存下来、函数先返回则由其他线程稍后调用done-Run()完成回复即异步 service。ClosureGuard封装于 src/brpc/closure_guard.h。四、Client同步、异步、半同步与组合 ChannelClient 端支持同步访问、异步访问、半同步访问以及使用组合 ChannelsParallelChannel / PartitionChannel / SelectiveChannel声明式地简化复杂的分库或并发访问详见 docs/cn/client.md 与 docs/cn/combo_channel.md。4.1 Channel 初始化与 ChannelOptions 参数详解Channel是对服务通信线路的抽象线程安全可被所有线程共享。其Init系列方法定义在 src/brpc/channel.h// 方式一连接单个服务 int Init(butil::EndPoint server_addr_and_port, const ChannelOptions* options); int Init(const char* server_addr_and_port, const ChannelOptions* options); // 方式二通过命名服务 负载均衡连接一组服务 int Init(const char* naming_service_url, const char* load_balancer_name, const ChannelOptions* options);ChannelOptions结构体src/brpc/channel.h提供了丰富的可调参数关键项整理如下参数默认值说明connect_timeout_ms200建连超时毫秒-1 表示无限等待最大约 30 天timeout_ms500单次 RPC 超时上限-1 无限可被Controller.set_timeout_ms()覆盖backup_request_ms-1禁用超过该时长未完成则尽力发给另一台服务器的 backup request若 timeout_ms则永不触发backup request 不代表服务端取消max_retry3重试上限0表示不重试可被Controller.set_max_retry()覆盖protocol协议默认值序列化协议可填枚举或名称字符串如baidu_std、redis、h2connection_type协议默认值连接类型single、pooled、shortenable_circuit_breakerfalse节点错误率过高时全局隔离该节点进程内所有 Channel 生效见 docs/cn/circuit_breaker.mdsucceed_without_servertrue命名服务中无节点时Init是否成功use_rdmafalse使用 RDMA 而非 TCP 传输authNULL认证器参见 src/brpc/authenticator.hretry_policyNULL自定义可重试错误码策略参见 src/brpc/retry_policy.hns_filterNULL过滤命名服务产生的 ServerNode参见 src/brpc/naming_service_filter.hconnection_group相同connection_group的 Channel 共享连接4.2 命名服务与负载均衡Channel::Init的第一个参数是命名服务 URL采用协议://服务名的直观格式src/brpc/channel.hbns://node-nameBaidu Naming Service百度内使用file://file-path从本地文件加载地址列表list://addr1,addr2,...直接使用逗号分隔的地址http://url域名命名服务即 DNS负载均衡算法通过Init的第二个参数指定src/brpc/channel.h完整体系参见 docs/cn/load_balancing.mdrrround robin轮询选择下一台服务器random随机选择wr加权随机wrr加权轮询lalocality-aware本地优先见 docs/cn/lalb.mdc_murmurhash/c_md5基于 murmurhash3 / md5 的一致性哈希见 docs/cn/consistent_hashing.md或NULL把命名服务 URL 直接当作单个服务器地址处理若想给 Channel 提供自定义命名服务如 ZooKeeper、etcd可通过NamingService扩展点接入见 src/brpc/naming_service.h 与 docs/cn/load_balancing.md#命名服务。4.3 三种调用模式与 ControllerController是 Server 与 Channel 共用的参数集合按用途分为Client-side、Server-side与Both-side三段源码注释见 src/brpc/controller.h。Client 侧常用方法包括set_timeout_ms()、set_backup_request_ms()、set_max_retry()、set_log_id()等。example/echo_c/client.cpp 演示了同步调用的完整姿势brpc::Channel channel; brpc::ChannelOptions options; options.protocol FLAGS_protocol; // 协议如 baidu_std / redis / h2 options.connection_type FLAGS_connection_type; options.timeout_ms FLAGS_timeout_ms; // 毫秒 options.max_retry FLAGS_max_retry; if (channel.Init(FLAGS_server.c_str(), FLAGS_load_balancer.c_str(), options) ! 0) { LOG(ERROR) Fail to initialize channel; return -1; } example::EchoService_Stub stub(channel); // 由 Channel 构造 stub同样可跨线程共享 example::EchoRequest request; example::EchoResponse response; brpc::Controller cntl; request.set_message(hello world); cntl.set_log_id(log_id); cntl.request_attachment().append(FLAGS_attachment); // 附件直写网络绕过序列化 stub.Echo(cntl, request, response, NULL); // done 为 NULL 同步等待 if (!cntl.Failed()) { ... }done参数的三种取值对应三种调用模式同步done NULL阻塞直到响应返回或超时/出错异步done非 NULLCallMethod立即返回请求完成时回调done-Run()用户代码与 RPC 逻辑并行半同步基于异步接口 条件变量等待实现批量并发后统一收束类似并发等待的同步体验。此外还有 backup request见 docs/cn/backup_request.md在backup_request_ms设定的时间内 RPC 未完成会尽力把请求发往另一台服务器以对冲慢节点。五、内置服务与性能剖析HTTP 界面的可观测性bRPC 通过 HTTP 协议提供丰富的内置服务可直接用浏览器或 curl 访问http://server-addr:port/service服务器会根据 User-Agent 自动返回 HTML 或纯文本也可加?console1强制纯文本。详细介绍见 docs/cn/builtin_service.md其实现位于 src/brpc/builtin 目录从源码可见每个内置服务都是一个独立的 protobuf service 实现如StatusService、VarsService、ConnectionsService、FlagsService、RPCZService等与普通业务 service 一样注册进 Server。内置服务说明/status显示所有服务的主要状态docs/cn/status.md/vars展示所有曝光的 bvar 计数器可查看单个指标docs/cn/vars.md/connections所有连接的统计信息docs/cn/connections.md/flags所有 gflags 的状态支持动态修改docs/cn/flags.md/rpcz查看所有 RPC 的细节耗时、大小等用于 tracingdocs/cn/rpcz.md/version查看服务器版本可Server::set_version()自定义/health探测服务存活/protobufs查看程序中所有 protobuf 结构体/vlog查看当前可开启的 VLOG 开关对 glog 无效/dir、/threads默认关闭的敏感服务配合内置服务的三大性能剖析工具cpu profiler分析 CPU 热点docs/cn/cpu_profiler.mdheap profiler分析内存占用docs/cn/heap_profiler.mdcontention profiler分析锁竞争docs/cn/contention_profiler.md5.1 配套运维工具仓库 tools 目录提供了一系列可直接使用的命令行工具用法见 docs/cn 对应文档rpc_press向标准 brpc 服务发送压力请求评估性能docs/cn/rpc_press.mdrpc_replay重放 rpcz 记录的 RPC用于故障复现docs/cn/rpc_replay.mdrpc_view转发内置服务页面解决客户端无法直连服务端口的问题docs/cn/rpc_view.mdbenchmark_httpHTTP 压测工具docs/cn/benchmark_http.mdparallel_http并发 HTTP 压测工具docs/cn/parallel_http.mdpprof与 profiler 配套的符号化分析脚本六、编译构建与快速开始bRPC 鼓励静态链接依赖使运行服务的主机无需额外安装依赖。完整构建步骤见 docs/cn/getting_started.md这里给出两条主流路径。6.1 依赖准备Ubuntu/LinuxMint/WSLsudo apt-get install -y git g make libssl-dev libgflags-dev \ libprotobuf-dev libprotoc-dev protobuf-compiler libleveldb-dev # 需要静态链接 leveldb 时 sudo apt-get install -y libsnappy-dev # 样例中启用 cpu/heap profiler 时 sudo apt-get install -y libgoogle-perftools-dev核心依赖为gflags定义全局选项、protobuf消息序列化与 service 接口、leveldb供 rpcz 记录 RPC 用于追踪。6.2 方式一config_brpc.sh makesh config_brpc.sh --headers/usr/include --libs/usr/lib make常用选项--cxxclang --ccclang改用 clang 编译、--nodebugsymbols不链接调试符号、--with-glog使用 glog 版 bRPC、--with-thrift启用 thrift 支持需先安装 thrift。6.3 方式二cmakemkdir build cd build cmake .. cmake --build . -j6 # cmake 3.13 也可以 cmake -B build cmake --build build -j6常见开关-DCMAKE_EXPORT_COMPILE_COMMANDSON为 VSCode/Emacs LSP 生成compile_commands.json、-DWITH_DEBUG_SYMBOLSOFF去掉调试符号、-DWITH_GLOGON、-DWITH_THRIFTON。编译单元测试则用-DBUILD_UNIT_TESTSON。6.4 运行示例cd example/echo_c make # 或 cmake -B build cmake --build build -j4 ./echo_server ./echo_client示例程序位于 example 目录覆盖了众多典型场景asynchronous_echo_c异步、multi_threaded_echo_c多线程、http_cHTTP、grpc_cgRPC、redis_c、memcache_c、streaming_echo_c流式、parallel_echo_c并行、partition_echo_c分片、selective_echo_c、backup_request_c、cancel_c、nshead_extension_c、thrift_extension_c等可作为各协议的最佳入门参照。七、组件生态bvar、bthread 与基础库bRPC 还配套了若干可直接复用的高性能基础组件bvar多线程环境下的计数器类库利用 thread local 存储减少 cache bouncing读写开销极低bRPC 集成了 bvar/vars可查看所有曝光的指标docs/cn/bvar.md、docs/cn/bvar_c.md。注意bvar 把写竞争转移到了读读需合并各线程私有变量读多写多且依赖最新值做判断的场景不宜使用。bthreadM:N 线程库M 个 bthread 映射到 N 个 pthread一般 M 远大于 N核心是 work stealing 调度与 butex 同步原语让同步编程模型获得高并发与良好的 cache localitydocs/cn/bthread.md。bthread 不是协程N:1一个 bthread 卡住不会阻塞其他 bthread。普通用户通常不应直接调用 bthread 接口交给 bRPC 内部使用即可docs/cn/bthread_or_not.md。IOBuf零拷贝的二进制数据容器支持切片、拼接用于绕过序列化直接传输大块数据docs/cn/iobuf.md。Streaming Log可控量的流式日志docs/cn/streaming_log.md。FlatMap高性能 flat hash mapdocs/cn/flatmap.md。Execution Queue多生产者单消费者的高性能队列docs/cn/execution_queue.md。thread-local / session databthread 级与连接级的数据绑定能力docs/cn/thread_local.md、example/session_data_and_thread_local。八、扩展机制新协议、命名服务与定制组件bRPC 的协议描述符 注册制设计使得扩展非常轻量加入新协议实现Protocol结构体中的 parse/process/serialize 等回调注册进框架即可让 Server 与 Channel 支持新协议详细步骤与要求见 docs/cn/new_protocol.md参考实现可看 example/nshead_extension_c 与 example/nshead_pb_extension_c。定制命名服务实现NamingService接口接入 DNS、ZooKeeper、etcd 等docs/cn/load_balancing.md#命名服务。定制负载均衡接入 rr、random、consistent hashing 之外的算法docs/cn/load_balancing.md#负载均衡。九、深入 RPC 内核若想理解 bRPC 的高性能从何而来可沿以下文档逐层深入均位于 docs/cn 目录IO事件驱动 IO 与协议解析模型Threading Overviewbthread、pthread 与调度整体视图Atomic instructions原子指令与 cachelineMemory Management内存分配与复用Timer keeping定时器与超时管理bthread_idRPC 的异步完成原语Load Balancing、Locality-aware、Consistent Hashing负载均衡与路由策略baidu_std百度标准协议的字段布局Wireshark baidu_std用 Wireshark 抓包分析十、文档地图完整学习路径本文档是 bRPC 中文文档的总索引建议按以下路径系统学习入门概述 → 编译步骤 → 性能测试Client 端基础功能 → 错误码 → 组合 channels → 访问 http/h2 → 访问 gRPC → 访问 thrift → 访问 UB → Streaming RPC → 访问 redis → 访问 memcached → Backup request → Dummy serverServer 端基础功能 → 搭建 http/h2 服务 → 搭建 gRPC 服务 → 搭建 thrift 服务 → 搭建 Nshead 服务 → 高效率排查 server 卡顿 → 推送 → 雪崩 → 自适应限流 → json2pb观测内置服务 及 status、vars、connections、flags、rpcz、三个 profiler 文档生产案例百度内部实战百度地图 api 入口、联盟 DSP、ELF 学习框架、云平台代理服务培训材料bRPC 外功修炼宝典、搭建大型服务入门、bRPC 内功修炼宝典十一、贡献与社区贡献代码请遵循 CONTRIBUTING.md 中的规范中文说明见其中的 Chinese version 一节。bug、疑惑、修改建议可通过 GitHub Issues 提交订阅邮件列表dev-subscribebrpc.apache.org可获取项目最新信息。项目遵循 Apache 软件基金会的行为准则。综上所述bRPC 以单端口多协议的协议抽象、Server/Channel/Controller三个简洁用户类、同步/异步/半同步三种调用模型以及覆盖 status/vars/rpcz/profiler 的完整可观测性体系为搜索、存储、机器学习、广告、推荐等高性能场景提供了一个经过大规模生产验证的 C RPC 解决方案。建议读者在通读本文的基础上直接运行 example/echo_c 示例并结合 docs/cn 目录下的专题文档按图索骥、逐层深入。赞分享【免费下载链接】brpcbrpc is an Industrial-grade RPC framework using C Language, which is often used in high performance system such as Search, Storage, Machine learning, Advertisement, Recommendation etc. brpc means better RPC.项目地址https://gitcode.com/gh_mirrors/brpc3/brpc点击查看免费下载相关推荐brpcbetter RPC工业级 C RPC 框架全景指南单端口多协议、高性能与可观测性brpcbetter RPC工业级 C RPC 框架全景指南单端口多协议、高性能与可观测性 bRPCbetter RPC是百度开源的工业级 CRPC框架后端微服务网络通信brpc 概览工业级 RPC 框架的设计理念、多协议能力与高性能实现brpc 概览工业级 RPC 框架的设计理念、多协议能力与高性能实现 brpcbetter RPC是百度内部大规模使用并开源的工业级 C RPC后端RPC框架通信网络brpcApache bRPC工业级 C RPC 框架入门与实践指南brpcApache bRPC工业级 C RPC 框架入门与实践指南 bRPC 是百度开源的工业级 C RPC 框架以better RPC为设后端RPC框架通信网络上一篇MCP服务器安全漏洞案例Snyk Agent Scan如何检测与防范下一篇【亲测免费】 Ant Design Pro 使用教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑