brpc(better RPC)框架全景指南:多协议、高性能与实战上手
【免费下载链接】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点击查看免费下载bRPC 是 Apache 基金会旗下的工业级 C RPC 框架被广泛用于搜索、存储、机器学习、广告、推荐等高性能系统。本文以仓库根目录的 README.md 为主体骨架结合src/brpc/源码实现、example/echo_c/完整示例与docs/en/getting_started.md构建文档系统梳理 bRPC 的能力地图、源码级原理与上手路径。读完本文你将掌握 bRPC 的协议生态、客户端/服务端编程模型、内置调试服务、性能设计思路以及从零编译并跑通第一个示例的完整方法。bRPC 是什么名字背后的理念bRPC 全称 better RPC是一个使用 C 语言编写、达到**工业级Industrial-grade**标准的 RPC远程过程调用框架常用于搜索、存储、机器学习、广告、推荐等对性能与稳定性要求极高的大规模系统。它来自 Apache 孵化项目在 README.md 中明确将其定位为better RPC即致力于让 RPC 在工程实践中更好用、更好扩展、更可靠。从项目概述文档可以看到它的背景RPC 需要解决序列化、连接复用、集群寻址、故障重试等一系列问题而 bRPC 将这些底层细节全部封装起来让用户像调用本地函数一样调用远程服务。bRPC 的 API 设计强调简单的事情简单做核心用户头文件只有三个src/brpc/server.h服务端、src/brpc/channel.h客户端、src/brpc/controller.h参数集合开发者无需关心组件如何组装、初始化管理器等繁琐问题。核心能力一单端口多协议服务bRPC 最突出的能力是搭建能在同一个端口上支持多种协议的服务也可以作为客户端访问各类异构服务。这一能力在源码层有清晰支撑src/brpc/policy/目录下为每一种支持的协议都提供了独立的协议实现文件。HTTP / HTTP2 / gRPCbRPC 原生支持 restful HTTP/HTTPS、h2 与 gRPC 协议。按照 README.md 的描述在 bRPC 中使用 HTTP/h2 比 libcurl 更加友好并且可以从其他语言通过 HTTP/h2 JSON 访问基于 protobuf 的协议。对应源码实现位于 src/brpc/policy/http_rpc_protocol.cpp、src/brpc/policy/http2_rpc_protocol.cpp 与 src/brpc/grpc.cpp。想搭建 HTTP 服务可参考 docs/en/http_service.md客户端访问 HTTP/h2 可参考 docs/en/http_client.md访问 gRPC 的细节见 docs/en/http_derivatives.md 中的 h2/gRPC 章节。Redis 与 MemcachedbRPC 提供线程安全、比官方客户端更方便的 Redis 与 Memcached 客户端对应的协议实现为 src/brpc/policy/redis_protocol.cpp 和 src/brpc/policy/memcache_binary_protocol.cpp相关高层 API 见 src/brpc/redis.h 与 src/brpc/memcache.h。使用文档分别为 docs/en/redis_client.md 与 docs/en/memcache_client.md。ThriftbRPC 支持 Apache Thrift 协议线程安全且比官方客户端更方便实现位于 src/brpc/policy/thrift_protocol.cpp配套的还有 src/brpc/thrift_message.cpp。客户端访问与服务端处理 thrift 请求的说明见 docs/en/thrift.md。流媒体协议RTMP/FLV/HLSbRPC 支持 RTMP/FLV/HLS可用于搭建流媒体服务配合社区项目 media-server。RTMP 的协议头与实现位于 src/brpc/rtmp.h 与 src/brpc/policy/rtmp_protocol.cpp。README 中还提到 hadoop_rpcmay be opensourced即可能开源当前仓库不包含实现属未承诺能力。百度内部协议族作为源自百度的框架bRPC 支持多种百度内部使用的协议baidu_std、streaming_rpc、hulu_pbrpc、sofa_pbrpc、nova_pbrpc、public_pbrpc、ubrpc 以及基于 nshead 的各种协议。对应的源码分布在src/brpc/policy/下例如baidu_std由 src/brpc/policy/baidu_rpc_protocol.cpp 实现协议格式见 docs/cn/baidu_std.mdstreaming_rpc见 docs/en/streaming_rpc.md其元数据定义在 src/brpc/streaming_rpc_meta.protosofa_pbrpc、hulu_pbrpc、nova_pbrpc、public_pbrpc、nshead 系列均能在src/brpc/policy/下找到对应实现文件如 src/brpc/policy/sofa_pbrpc_protocol.cpp、src/brpc/policy/nshead_protocol.cpp 等。RDMA 支持README 明确列出 bRPC 支持 RDMA远程直接内存访问源码目录 src/brpc/rdma/ 与文档 docs/en/rdma.md 提供了对应的实现与使用说明。高可用分布式能力RAFT 与 braftbRPC 可以基于工业级 RAFT 共识算法实现搭建高可用分布式系统该算法实现已在 braft 项目中开源。这为构建一致性存储、选主等场景提供了可靠基础。核心能力二服务端同步/异步处理bRPC 服务端既能同步处理请求也能异步处理请求见 docs/en/server.md。仓库中的 example/echo_c/server.cpp 是一个典型的最小服务端展示了关键编程模式#include brpc/server.h class EchoServiceImpl : public EchoService { public: virtual 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); cntl-set_after_rpc_resp_fn(...); // 响应发送后的回调可选 response-set_message(request-message()); // 填充响应 cntl-response_attachment().append(cntl-request_attachment()); // 附加二进制数据 } }; int main(int argc, char* argv[]) { GFLAGS_NS::ParseCommandLineFlags(argc, argv, true); brpc::Server server; example::EchoServiceImpl echo_service_impl; // SERVER_DOESNT_OWN_SERVICE 表示服务对象由调用方管理、Server 不负责删除 // 若希望 Server 接管生命周期使用 brpc::SERVER_OWNS_SERVICE。 server.AddService(echo_service_impl, brpc::SERVER_DOESNT_OWN_SERVICE); brpc::ServerOptions options; options.idle_timeout_sec FLAGS_idle_timeout_s; server.Start(butil::EndPoint(butil::IP_ANY, FLAGS_port), options); server.RunUntilAskedToQuit(); // 等待 Ctrl-C 后自动 Stop 并 Join }值得注意的实现细节均可在上述示例源码中确认服务方法通过donegoogle::protobuf::Closure*控制请求生命周期brpc::ClosureGuard保证在同步路径上安全释放cntl-set_after_rpc_resp_fn(...)可在响应已发送、cntl/req/res析构之前执行回调用于记录日志等后置操作request_attachment()/response_attachment()支持携带不经过 protobuf 序列化的二进制附加数据直接走网络通道idle_timeout_sec可配置空闲连接回收防止连接长时间无读写占用资源。服务端更多议题还包括推送docs/en/server_push.md、雪崩应对docs/cn/avalanche.md、自适应限流docs/cn/auto_concurrency_limiter.md与 JSON 互转docs/cn/json2pb.md。核心能力三客户端四种访问模式与组合 Channel客户端支持同步、异步、半同步三种调用方式并可用组合 channels简化分库或并发访问详见 docs/en/client.md 与 docs/en/combo_channel.md。example/echo_c/client.cpp 演示了同步调用的最小写法同时覆盖了 Channel 的核心配置项#include brpc/channel.h DEFINE_string(protocol, baidu_std, Protocol type. Defined in src/brpc/options.proto); DEFINE_string(connection_type, , Connection type. Available values: single, pooled, short); DEFINE_string(load_balancer, , The algorithm for load balancing); DEFINE_int32(timeout_ms, 100, RPC timeout in milliseconds); DEFINE_int32(max_retry, 3, Max retries(not including the first RPC)); brpc::Channel channel; brpc::ChannelOptions options; options.protocol FLAGS_protocol; // 协议类型 options.connection_type FLAGS_connection_type; // 连接类型single/pooled/short options.timeout_ms FLAGS_timeout_ms; // 超时毫秒 options.max_retry FLAGS_max_retry; // 最大重试次数不含首次 channel.Init(FLAGS_server.c_str(), FLAGS_load_balancer.c_str(), options); example::EchoService_Stub stub(channel); // 基于 Channel 构造 Stub stub.Echo(cntl, request, response, NULL); // done 传 NULL 即同步等待关键实践要点Channel 是线程安全的可被程序中所有线程共享Stub 同样可共享同步调用时done传NULL函数会一直阻塞到响应返回或超时/出错异步调用则传入回调半同步semi-synchronous结合二者见 docs/en/client.md 的对应章节connection_type支持single单连接复用、pooled连接池、short短连接对应 docs/en/overview.md 中的连接类型选择错误码体系参见 docs/en/error_code.mdBackup request 与 Dummy server 机制分别见 docs/en/backup_request.md 与 docs/en/dummy_server.md。核心能力四内置服务与调试/性能剖析bRPC 服务可以直接通过 HTTP 界面调试详见 docs/en/builtin_service.md。README 中列出的内置服务包括status查看服务状态docs/en/status.mdvars查看 bvar 统计指标docs/en/vars.mdconnections查看连接信息docs/cn/connections.mdflags查看/调整 gflags 配置项docs/cn/flags.mdrpczRPC 追踪记录docs/cn/rpcz.mdcpu_profiler / heap_profiler / contention_profiler分别用于分析 CPU 热点、堆分配与锁竞争见 docs/cn/cpu_profiler.md、docs/cn/heap_profiler.md、docs/cn/contention_profiler.md。配套工具有 rpc_press压测docs/cn/rpc_press.md、rpc_replay回放docs/cn/rpc_replay.md、rpc_view查看请求docs/cn/rpc_view.md、benchmark_httpdocs/cn/benchmark_http.md与 parallel_httpdocs/cn/parallel_http.md。核心能力五更低的延迟与更高的吞吐README 与 docs/en/overview.md 都强调 bRPC 在性能上的深层次投入性能对比数据见 docs/cn/benchmark.md。可以从源码结构与文档归纳出以下设计要点全并行 IO 与解析从不同 fd 读取并解析请求被完全并行化同一 fd 上的不同消息也能并行处理大消息不会阻塞同一连接上的其他消息。机制细节见 docs/en/io.md 的接收消息章节高并发写多个线程写同一 fd 时首个线程原地写其余线程以 wait-free 方式提交写请求docs/en/io.md 的发送消息章节给出单 fd 每秒可写 500 万条 16 字节消息的量级此为文档陈述的工程数据可作为参考具体以实测为准极简锁设计创建 bthread、设置超时、按响应查找 RPC 上下文、记录性能计数器等路径都高度并发相关原理分别见 docs/cn/memory_management.md内存管理、docs/cn/timer_keeping.md定时器、docs/cn/bthread_id.mdbthread_id与 docs/en/bvar.mdbvar 统计按负载自动调节线程数传统实现靠固定线程数bRPC 为每个请求新建一个 bthread、请求结束即销毁从而自动随负载伸缩bthread 机制见 docs/cn/bthread.md该不该用 bthread的取舍见 docs/cn/bthread_or_not.md。此外bRPC 还提供 IOBuf高效缓冲区docs/en/iobuf.md、Streaming Logdocs/en/streaming_log.md、FlatMapdocs/cn/flatmap.md等底层组件供上层使用。核心能力六可扩展性——快速接入新协议与定制组件bRPC 允许把组织内部使用的协议快速加入框架或定制各类组件详见 docs/en/new_protocol.md。README 明确点出的可定制组件包括命名服务Naming Servicedns、zk、etcd 等。源码层可以看到 src/brpc/policy/file_naming_service.cpp、src/brpc/policy/list_naming_service.cpp、src/brpc/policy/domain_naming_service.cpp、src/brpc/policy/baidu_naming_service.cpp、src/brpc/policy/consul_naming_service.cpp、src/brpc/policy/nacos_naming_service.cpp 等实现综合说明见 docs/cn/load_balancing.md 的命名服务章节负载均衡Load Balancinground-robin、random、consistent hashing 等。对应实现包括 src/brpc/policy/round_robin_load_balancer.cpp、src/brpc/policy/randomized_load_balancer.cpp、src/brpc/policy/consistent_hashing_load_balancer.cpp、src/brpc/policy/locality_aware_load_balancer.cpp 等详见 docs/cn/load_balancing.md 的负载均衡章节、docs/cn/consistent_hashing.md 与 docs/cn/lalb.md压缩算法源码中内置 gzip 与 snappy 压缩实现见 src/brpc/policy/gzip_compress.cpp 与 src/brpc/policy/snappy_compress.cpp限流器自适应限流、常量限流与超时限流见 src/brpc/policy/auto_concurrency_limiter.cpp、src/brpc/policy/constant_concurrency_limiter.cpp、src/brpc/policy/timeout_concurrency_limiter.cpp。这体现了 bRPC 协议即插件的架构理念所有协议实现以 policy 形式注册用户可按 docs/en/new_protocol.md 的步骤把自有协议挂接进来。上手实践编译与运行示例从零编译的完整步骤见 docs/en/getting_started.md中文版见 docs/cn/getting_started.md。bRPC 的依赖包括gflags全局选项、protobuf消息序列化与服务接口与leveldbrpcz 追踪所需。Ubuntu/LinuxMint/WSL 环境安装依赖含 gflags、protobuf、leveldbsudo apt-get install -y git g make libssl-dev libgflags-dev libprotobuf-dev libprotoc-dev protobuf-compiler libleveldb-dev可选依赖静态链接 leveldb 需要libsnappy-dev启用示例中的 CPU/堆 profiler 需要libgoogle-perftools-dev运行测试还需要 cmake 与 libgtest-devgtest 需先自行编译安装源码目录可能是/usr/src/gtest或/usr/src/googletest/googletest。方式一config_brpc.sh make$ sh config_brpc.sh --headers/usr/include --libs/usr/lib $ make常用编译选项换编译器为 clang--cxxclang --ccclang不链接调试符号二进制更小--nodebugsymbols配合 glog 使用--with-glog启用 thrift 支持先安装 thrift再加--with-thrift。方式二CMakemkdir build cd build cmake .. cmake --build . -j6CMake 3.13 也可以写为cmake -B build cmake --build build -j6对应选项生成compile_commands.json辅助 VSCode/EmacsLSP用-DCMAKE_EXPORT_COMPILE_COMMANDSON换 clang 用环境变量CC/CXX去调试符号删除build/CMakeCache.txt后用-DWITH_DEBUG_SYMBOLSOFFglog 用-DWITH_GLOGONthrift 用-DWITH_THRIFTON。运行 Echo 示例$ cd example/echo_c $ make # 或 cmake -B build cmake --build build -j4 $ ./echo_server $ ./echo_client示例默认静态链接 bRPC若需链接共享版make clean后以LINK_SO1 make或 CMake 下用-DLINK_SOON重新构建。运行测试$ cd test make sh run_tests.sh # 或 CMake 方式 $ mkdir build cd build cmake -DBUILD_UNIT_TESTSON .. make make test更多可运行示例位于仓库 example/ 目录包括 HTTPhttp_c、gRPCgrpc_c、redisredis_c、memcachememcache_c、并行/分区/选择性 channelparallel_echo_c、partition_echo_c、selective_echo_c、流式 RPCstreaming_echo_c、备份请求backup_request_c、异步asynchronous_echo_c与 thrift/nshead 扩展等可对照各自文档逐一体验。文档地图按主题直达README 提供了一份完整的能力/文档导航整理如下便于按需查阅主题入口概念与优势docs/en/overview.md编译入门docs/cn/getting_started.md性能基准docs/cn/benchmark.md统计组件 bvardocs/en/bvar.md、docs/cn/bvar_c.md调度组件 bthreaddocs/cn/bthread.md、docs/cn/bthread_or_not.md、docs/cn/thread_local.md、docs/cn/execution_queue.md客户端docs/en/client.md、docs/en/error_code.md、docs/en/combo_channel.md、docs/en/http_client.md、docs/en/backup_request.md服务端docs/en/server.md、docs/en/http_service.md、docs/en/server_push.md、docs/cn/server_debugging.md内置服务docs/en/builtin_service.md 及其子页面 status/vars/connections/flags/rpcz/profiler深入 RPCdocs/en/new_protocol.md、docs/en/io.md、docs/en/threading_overview.md、docs/cn/load_balancing.md、docs/cn/memory_management.md、docs/cn/timer_keeping.md、docs/cn/bthread_id.md培训材料docs/cn/brpc_intro.pptx、docs/en/tutorial_on_building_services.pptx、docs/en/brpc_internal.pptx参与贡献与社区贡献代码请阅读 CONTRIBUTING.md中文版章节见同文件内 Chinese version反馈与提问bug、疑问与建议可通过 GitHub Issues 提交订阅邮件列表dev-subscribebrpc.apache.org可获取项目最新动态行为准则项目遵循 Apache 软件基金会的行为准则。小结从 README.md 出发可以看到bRPC 是一套协议生态 工程完备性双全的工业级 RPC 框架同端口多协议HTTP/h2/gRPC、redis、memcached、thrift、流媒体、百度协议族与 nshead 系、同步/异步/半同步客户端、组合 channel、HTTP 内置调试与三大 profiler、bthread 调度与极致锁优化、RAFT 高可用以及可插拔的协议/命名服务/负载均衡扩展点均有源码与文档双重支撑。对于需要在 C 生态中构建高性能、高可用分布式服务的团队bRPC 是一个值得按本文所述步骤实际跑起来验证的框架。赞分享【免费下载链接】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框架后端微服务网络通信5分钟上手brpc高性能RPC框架实战指南5分钟上手brpc高性能RPC框架实战指南 brpc是百度开发的一套高性能RPC框架特点是支持多种协议、多语言、高并发等适用于需要高性能RPC服务的场景。后端RPC框架通信网络brpc 概览工业级 RPC 框架的设计理念、多协议能力与高性能实现brpc 概览工业级 RPC 框架的设计理念、多协议能力与高性能实现 brpcbetter RPC是百度内部大规模使用并开源的工业级 C RPC后端RPC框架通信网络上一篇【亲测免费】 SensitivityMatcher 使用教程下一篇Spring Cloud Config 部署指南Docker、Kubernetes 生产环境配置创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考