快速入门
快速开始
阅读快速开始以了解构建步骤,并试用 示例。
构建
brpc 更倾向于静态链接依赖,这样运行该应用的每台机器都不必安装这些依赖。
brpc 依赖以下包:
支持的环境
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 testFedora/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++
$ makeMonterey 版本的 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() 之前崩溃或死锁,例如:

遇到此问题时,请使用相同的 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)
评论
登录后参与评论
KnowForge