文档

快速入门

qianmoQqianmoQ· 更新于 2026-10-05· 阅读 21 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

快速开始

阅读快速开始以了解构建步骤,并试用 示例。

构建

brpc 更倾向于静态链接依赖,这样运行该应用的每台机器都不必安装这些依赖。

brpc 依赖以下包:

  • gflags:被大量使用,用于定义全局选项。
  • protobuf:消息的序列化、服务的接口定义。
  • leveldb:/rpcz 需要它来记录 RPC 以便追踪。

支持的环境

Ubuntu/LinuxMint/WSL

准备依赖

安装依赖:

sudo 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/堆性能分析器(profiler):

sudo apt-get install -y libgoogle-perftools-dev

如果需要运行测试,请安装并编译 libgtest-dev(该包默认尚未编译):

sudo apt-get install -y cmake libgtest-dev && cd /usr/src/gtest && sudo cmake . && sudo make && sudo mv lib/libgtest* /usr/lib/ && cd -

gtest 源码目录可能已经变化,若 /usr/src/gtest 不存在,请尝试 /usr/src/googletest/googletest。

使用 config_brpc.sh 编译 brpc

git clone brpc,进入仓库目录并运行

$ sh config_brpc.sh --headers=/usr/include --libs=/usr/lib
$ make

若要将编译器改为 clang,请添加 --cxx=clang++ --cc=clang。

若要不链接调试符号,请添加 --nodebugsymbols,编译出的二进制文件体积会小很多。

若要与 glog 一起使用 brpc,请添加 --with-glog。

若要启用 thrift 支持,请先安装 thrift,然后添加 --with-thrift。

运行示例

$ cd example/echo_c++
$ make
$ ./echo_server &
$ ./echo_client

示例静态链接 brpc,如需链接共享版本,make clean 和 LINK_SO=1 make

运行测试

$ cd test
$ make
$ sh run_tests.sh

使用 cmake 编译 brpc

cmake -B build && cmake --build build -j6

为了帮助 VSCode 或 Emacs(LSP) 正确理解代码,添加 -DCMAKE_EXPORT_COMPILE_COMMANDS=ON 以生成 compile_commands.json。

要将编译器改为 clang,请将环境变量 CC 和 CXX 分别覆盖为 clang 和 clang++。

要不链接调试符号,请移除 build/CMakeCache.txt,并使用 -DWITH_DEBUG_SYMBOLS=OFF 进行 cmake。

要将 brpc 与 glog 一起使用,请使用 -DWITH_GLOG=ON 进行 cmake。

要启用 thrift 支持,请先安装 thrift,然后使用 -DWITH_THRIFT=ON 进行 cmake。

使用 cmake 运行示例

$ cd example/echo_c++
$ cmake -B build && cmake --build build -j4
$ ./echo_server &
$ ./echo_client

示例默认将 brpc 静态链接,如需链接共享库版本,请移除 CMakeCache.txt 并使用 -DLINK_SO=ON 进行 cmake

运行测试

$ mkdir build && cd build && cmake -DBUILD_UNIT_TESTS=ON .. && make && make test

Fedora/CentOS

准备依赖

CentOS 通常需要安装 EPEL 仓库,否则许多软件包默认不可用。

sudo yum install epel-release

安装依赖:

sudo yum install git gcc-c++ make openssl-devel gflags-devel protobuf-devel protobuf-compiler leveldb-devel

如果你需要在示例中启用 cpu/heap 性能分析器:

sudo yum install gperftools-devel

如果需要运行测试,请先安装并编译 gtest-devel(该组件尚未编译):

sudo yum install gtest-devel

使用 config_brpc.sh 编译 brpc

克隆 brpc 仓库,进入该仓库目录并运行

$ sh config_brpc.sh --headers=/usr/include --libs=/usr/lib64
$ make

要改用 clang 编译器,添加 --cxx=clang++ --cc=clang。

要不链接调试符号,添加 --nodebugsymbols,编译出的二进制文件会小很多。

要配合 glog 使用 brpc,添加 --with-glog。

要启用 thrift 支持,请先安装 thrift,然后添加 --with-thrift。

运行示例

$ cd example/echo_c++
$ make
$ ./echo_server &
$ ./echo_client

示例将 brpc 静态链接,如果需要链接共享库版本,请 make clean 和 LINK_SO=1 make

运行测试

$ cd test
$ make
$ sh run_tests.sh

使用 cmake 编译 brpc

与此处]相同

Linux 下使用自行构建的依赖

准备依赖

brpc 默认会同时构建静态库和共享库,因此也需要构建依赖的静态库和共享库。

以 gflags] 为例,它默认不会构建共享库,你需要向 cmake 传递选项来改变这一行为:

$ cmake . -DBUILD_SHARED_LIBS=1 -DBUILD_STATIC_LIBS=1
$ make

编译 brpc

继续使用 gflags 的示例,令 ../gflags_dev 为 gflags 被克隆到的位置。

git clone brpc。进入该仓库目录并运行

$ sh config_brpc.sh --headers="../gflags_dev /usr/include" --libs="../gflags_dev /usr/lib64"
$ make

这里我们向 --headers 和 --libs 传入多个路径,以便脚本在多个位置中进行搜索。你也可以把所有依赖和 brpc 放到同一个目录中,然后将该目录传给 --headers/--libs,这两个选项会递归搜索其所有子目录,从而找到所需的文件。

要将编译器改为 clang,请添加 --cxx=clang++ --cc=clang。

若不想链接调试符号,请添加 --nodebugsymbols,这样编译出的二进制文件会小很多。

要与 glog 一起使用 brpc,请添加 --with-glog。

要启用 thrift 支持,请先安装 thrift,然后添加 --with-thrift。

$ ls my_dev
gflags_dev protobuf_dev leveldb_dev brpc_dev
$ cd brpc_dev
$ sh config_brpc.sh --headers=.. --libs=..
$ make

使用 cmake 编译 brpc

同 此处

MacOS

注意:在相同环境下,MacOS 版本的性能比 Linux 版本差。如果你的服务对性能敏感,请不要将 MacOS 作为生产环境。

Apple Silicon

master HEAD 上的代码已经支持 M1 系列芯片。M2 系列尚未测试。如有遗留的警告或错误,请随时通过 issues 反馈给我们。

准备依赖

安装依赖:

brew install openssl git gnu-getopt coreutils gflags protobuf leveldb

如果需要在示例中启用 CPU/堆性能分析器:

brew install gperftools

如果需要运行测试,则必须安装 googletest。先运行 brew install googletest 看看是否可用。如果不可用(旧版 Homebrew 没有 googletest),你可以自行下载并编译 googletest:

git clone https://github.com/google/googletest -b release-1.10.0 && cd googletest/googletest && mkdir build && cd build && cmake -DCMAKE_CXX_FLAGS="-std=c++11" .. && make

编译完成后,将 include/ 和 lib/ 分别复制到 /usr/local/include 和 /usr/local/lib 中,以便让所有应用都能使用 gtest

OpenSSL

Monetary 中安装的 openssl 可能不在 /usr/local/opt/openssl,而可能位于 /opt/homebrew/Cellar 下。如果编译器找不到 openssl:

  • 先运行 brew link openssl --force,检查是否出现 /user/local/opt/openssl。
  • 如果上述命令无效,可以考虑使用 sudo ln -s /opt/homebrew/Cellar/openssl@3/3.0.3 /usr/local/opt/openssl 创建软链接。注意,上述命令中安装的 openssl 在不同环境下可能位于不同位置,可通过运行 brew info openssl 查看。

使用 config_brpc.sh 编译 brpc

git clone 获取 brpc,进入仓库目录并运行

$ sh config_brpc.sh --headers=/usr/local/include --libs=/usr/local/lib --cc=clang --cxx=clang++
$ make

Monterey 版本的 Homebrew 可能会将软件安装到与之前不同的目录。如果报告了路径相关的错误,请尝试按如下方式设置头文件/库的路径:

$ sh config_brpc.sh --headers=/opt/homebrew/include --libs=/opt/homebrew/lib --cc=clang --cxx=clang++
$ make

要不链接调试符号,请添加 --nodebugsymbols,编译生成的二进制文件会小得多。

要配合 glog 使用 brpc,请添加 --with-glog。

要启用 thrift 支持,请先安装 thrift,然后添加 --with-thrift。

运行示例

$ cd example/echo_c++
$ make
$ ./echo_server &
$ ./echo_client

示例以静态方式链接 brpc,如果你需要链接共享库版本,请使用 make clean 和 LINK_SO=1 make

运行测试

$ cd test
$ make
$ sh run_tests.sh

使用 cmake 编译 brpc

同 此处

Docker

使用 docker 编译 brpc:

$ mkdir -p ~/brpc
$ cd ~/brpc
$ git clone https://github.com/apache/brpc.git
$ cd brpc
$ docker build -t brpc:master .
$ docker images
$ docker run -it brpc:master /bin/bash

支持的依赖

GCC:4.8-11.2

默认开启 c++11,以移除对 boost(atomic)的依赖。

GCC7 中的过度对齐(over-aligned)问题目前已被临时抑制。

使用其他版本的 gcc 可能会产生警告,遇到问题请联系我们修复。

在 makefile 的 cxxflags 中加入 -D__const__= 是必须的,以避免 gcc4+ 中的 errno 问题]。

Clang:3.5-4.0

无已知问题。

glibc:2.12-2.25

无已知问题。

protobuf:2.4+

同一份文件可同时兼容 pb 3.x 与 pb 2.x:不要使用 proto3 的新类型,并让 proto 文件以 syntax="proto2"; 开头。tools/add_syntax_equal_proto2_to_all.sh 可以为尚未添加的 proto 文件统一加上 syntax="proto2"。

pb 3.x 的 Arena 尚不支持。

gflags:2.0-2.2.1

无已知问题。

openssl:0.97-1.1

https 所需。

tcmalloc:1.7-2.5

brpc 默认不会链接 tcmalloc,由用户按需链接 tcmalloc。

与 glibc 内嵌的 ptmalloc 相比,tcmalloc 通常能提升性能。但不同版本的 tcmalloc 表现可能差异很大。例如,tcmalloc 2.1 可能使 brpc 的多线程示例性能明显变差(由于 tcmalloc 中的自旋锁),远不如使用 tcmalloc 1.7 和 2.5 时的表现。甚至不同的次版本号之间也可能存在差异。当程序行为异常时,请移除 tcmalloc 或换用其他版本。

用 gcc 4.8.2 编译、并链接到由更早版本 GCC 编译的 tcmalloc 的代码,可能在 main() 之前崩溃或死锁,例如:

img

遇到此问题时,请使用相同的 GCC 编译 tcmalloc。

tcmalloc 的另一个常见问题是,它不像 ptmalloc 那样及早将内存归还给系统。因此当发生非法内存访问时,程序可能不会立即崩溃,而是在无关的地方崩溃,甚至根本不崩溃。当程序出现奇怪的内存问题时,可以尝试移除 tcmalloc。

如果你需要使用 cpu profiler 或 heap profiler,请务必链接 libtcmalloc_and_profiler.a。这两个 profiler 都基于 tcmalloc。contention profiler 则不需要 tcmalloc。

移除 tcmalloc 时,不仅要移除与 tcmalloc 的链接,还要移除宏 -DBRPC_ENABLE_CPU_PROFILER。

glog:3.3+

brpc 实现了一个默认的 日志工具,与 glog 冲突。若要改用 glog,请在 config_brpc.sh 中加入 --with-glog,或在 cmake 中加入 -DWITH_GLOG=ON。

valgrind:3.8+

brpc 会自动检测 valgrind(并注册 bthread 的栈)。不支持较旧的 valgrind(例如 3.2)。

thrift:0.9.3-0.11.0

无已知问题。

追踪实例

我们提供了一个程序,帮助你追踪和监控所有 brpc 实例。只需在某处运行 trackme_server,并在需要被追踪的实例上加上 -trackme_server=SERVER 启动即可。trackme_server 会周期性地接收来自实例的 ping,并在收到时打印日志。你可以从日志中汇总实例地址,进而调用这些实例的内置服务以获取更多信息。

最后修改于 2023 年 7 月 13 日:docs: fix doc lint (devlive-community/knowforge#152) (d916d9252)

评论

登录后参与评论

正在加载评论…