Files
apache--brpc/docs/cn/getting_started.md
T
2026-07-13 13:29:29 +08:00

402 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
[English version](../en/getting_started.md)
# 构建
brpc鼓励静态链接依赖,以便于每个运行brpc服务的机器不必再安装依赖。
brpc有如下依赖:
* [gflags](https://github.com/gflags/gflags): Extensively used to define global options.
* [protobuf](https://github.com/google/protobuf): Serializations of messages, interfaces of services.
* [leveldb](https://github.com/google/leveldb): Required by [rpcz](rpcz.md) to record RPCs for tracing.
# 支持的环境
* [Ubuntu/LinuxMint/WSL](#ubuntulinuxmintwsl)
* [Fedora/CentOS](#fedoracentos)
* [自己构建依赖的Linux](#自己构建依赖的Linux)
* [MacOS](#macos)
* [docker](#docker)
## Ubuntu/LinuxMint/WSL
### 依赖准备
安装依赖:
```shell
sudo apt-get install -y git g++ make libssl-dev libgflags-dev libprotobuf-dev libprotoc-dev protobuf-compiler libleveldb-dev
```
如果你需要静态链接leveldb
```shell
sudo apt-get install -y libsnappy-dev
```
如果你需要通过源码编译生成 leveldb 静态库:
```shell
git clone --recurse-submodules https://github.com/google/leveldb.git
mkdir -p build && cd build
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_POSITION_INDEPENDENT_CODE=ON .. && cmake --build .
sudo cp -r ../include/leveldb /usr/include/ && sudo cp libleveldb.a /usr/lib/
```
如果你要在样例中启用cpu/heap的profiler
```shell
sudo apt-get install -y libgoogle-perftools-dev
```
如果你要运行测试,那么要安装并编译libgtest-dev(它没有被默认编译):
```shell
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克隆brpc,进入到项目目录,然后运行
```shell
$ sh config_brpc.sh --headers=/usr/include --libs=/usr/lib
$ make
```
修改编译器为clang,添加选项`--cxx=clang++ --cc=clang`
不想链接调试符号,添加选项`--nodebugsymbols`,然后编译将会得到更轻量的二进制文件。
使用glog版的brpc,添加选项`--with-glog`
要启用 [thrift 支持](../en/thrift.md),首先安装thrift并且添加选项`--with-thrift`
**运行样例**
```shell
$ cd example/echo_c++
$ make
$ ./echo_server &
$ ./echo_client
```
上述操作会链接brpc的静态库到样例中,如果你想链接brpc的共享库,请依次执行:`make clean``LINK_SO=1 make`
**运行测试**
```shell
$ cd test
$ make
$ sh run_tests.sh
```
### 使用cmake编译brpc
```shell
mkdir build && cd build && cmake .. && cmake --build . -j6
```
对于 cmake 3.13+ 也可以使用如下命令进行编译:
```shell
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 支持](../en/thrift.md),先安装thrift,然后用`-DWITH_THRIFT=ON`选项执行cmake。
**用cmake运行样例**
```shell
$ cd example/echo_c++
$ cmake -B build && cmake --build build -j4
$ cd build
$ ./echo_server &
$ ./echo_client
```
上述操作会链接brpc的静态库到样例中,如果你想链接brpc的共享库,请先移除`CMakeCache.txt`,然后用`-DLINK_SO=ON`选项重新执行cmake。
**运行测试**
```shell
$ mkdir build && cd build && cmake -DBUILD_UNIT_TESTS=ON .. && make && make test
```
## Fedora/CentOS
### 依赖准备
CentOS一般需要安装EPEL,否则很多包都默认不可用。
```shell
sudo yum install epel-release
```
安装依赖:
```shell
sudo yum install git gcc-c++ make openssl-devel gflags-devel protobuf-devel protobuf-compiler leveldb-devel
```
如果你要在样例中启用cpu/heap的profiler
```shell
sudo yum install gperftools-devel
```
如果你要运行测试,那么要安装ligtest-dev:
```shell
sudo yum install gtest-devel
```
### 使用config_brpc.sh编译brpc
git克隆brpc,进入项目目录然后执行:
```shell
$ sh config_brpc.sh --headers="/usr/include" --libs="/usr/lib64 /usr/bin"
$ make
```
修改编译器为clang,添加选项`--cxx=clang++ --cc=clang`
不想链接调试符号,添加选项`--nodebugsymbols` 然后编译将会得到更轻量的二进制文件。
想要让brpc使用glog,添加选项:`--with-glog`
要启用 [thrift 支持](../en/thrift.md),先安装thrift,然后添加选项:`--with-thrift`
**运行样例**
```shell
$ cd example/echo_c++
$ make
$ ./echo_server &
$ ./echo_client
```
上述操作会链接brpc的静态库到样例中,如果你想链接brpc的共享库,请依次执行:`make clean``LINK_SO=1 make`
**运行测试**
```shell
$ cd test
$ make
$ sh run_tests.sh
```
### 使用cmake编译brpc
参考[这里](#使用cmake编译brpc)
### 使用vcpkg编译brpc
[vcpkg](https://github.com/microsoft/vcpkg) 是一个全平台支持的包管理器,你可以使用以下步骤vcpkg轻松编译brpc:
```shell
$ git clone https://github.com/microsoft/vcpkg.git
$ ./bootstrap-vcpkg.bat # 使用 powershell
$ ./bootstrap-vcpkg.sh # 使用 bash
$ ./vcpkg install brpc
```
## 自己构建依赖的Linux
### 依赖准备
brpc默认会构建出静态库和共享库,因此它也需要依赖有静态库和共享库两个版本。
以[gflags](https://github.com/gflags/gflags)为例,它默认不构建共享库,你需要给`cmake`指定选项去改变这一行为:
```shell
$ cmake . -DBUILD_SHARED_LIBS=1 -DBUILD_STATIC_LIBS=1
$ make
```
### 编译brpc
还以gflags为例,`../gflags_dev`表示gflags被克隆的位置。
git克隆brpc。进入到项目目录然后运行:
```shell
$ 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 支持](../en/thrift.md),首先安装thrift并且添加选项`--with-thrift`
```shell
$ ls my_dev
gflags_dev protobuf_dev leveldb_dev brpc_dev
$ cd brpc_dev
$ sh config_brpc.sh --headers=.. --libs=..
$ make
```
### 使用cmake编译brpc
参考[这里](#使用cmake编译brpc)
## MacOS
注意:在相同硬件条件下,MacOS版brpc的性能可能明显差于Linux版。如果你的服务是性能敏感的,请不要使用MacOS作为你的生产环境。
### Apple Silicon
master HEAD已支持M1系列芯片,M2未测试过。欢迎通过issues向我们报告遗留的warning/error。
### 依赖准备
安装依赖:
```shell
brew install ./homebrew-formula/protobuf.rb
brew install openssl git gnu-getopt coreutils gflags leveldb
```
如果你要在样例中启用cpu/heap的profiler
```shell
brew install gperftools
```
如果你要运行测试,需安装gtest。先运行`brew install googletest`看看homebrew是否支持(老版本没有),没有的话请下载和编译googletest:
```shell
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
Monterey中openssl的安装位置可能不再位于`/usr/local/opt/openssl`,很可能会在`/opt/homebrew/Cellar`目录下,如果编译时报告找不到openssl:
* 先运行`brew link openssl --force`看看`/usr/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克隆brpc,进入到项目目录然后运行:
```shell
$ sh config_brpc.sh --headers=/usr/local/include --libs=/usr/local/lib --cc=clang --cxx=clang++
$ make
```
MacOS Monterey下的brew安装路径可能改变,如有路径相关的错误,可考虑设置如下:
```shell
$ sh config_brpc.sh --headers=/opt/homebrew/include --libs=/opt/homebrew/lib --cc=clang --cxx=clang++
$ make
```
不想链接调试符号,添加选项`--nodebugsymbols`,然后编译将会得到更轻量的二进制文件。
使用glog版的brpc,添加选项`--with-glog`
要启用[thrift 支持](../en/thrift.md),首先安装thrift并且添加选项`--with-thrift`
**运行样例**
```shell
$ cd example/echo_c++
$ make
$ ./echo_server &
$ ./echo_client
```
上述操作会链接brpc的静态库到样例中,如果你想链接brpc的共享库,请依次执行:`make clean``LINK_SO=1 make`
**运行测试**
```shell
$ cd test
$ make
$ sh run_tests.sh
```
### 使用cmake编译brpc
参考[这里](#使用cmake编译brpc)
## Docker
使用docker 编译brpc
```shell
$ 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
**推荐 8.2 及以上版本。**
默认启用 c++11,以去除对 boost 的依赖(比如 atomic)。
理论支持 c++11 的编译器都应可以,但部分编译器版本对 c++11 的支持存在问题。目前 GCC 4.8 可支持编译的最高版本为 1.5.0。
GCC7中over-aligned的问题暂时被禁止。
使用其他版本的gcc可能会产生编译警告,请联系我们予以修复。
请在makefile中给cxxflags增加`-D__const__=__unused__`选项以避免[gcc4+中的errno问题](thread_local.md).
## Clang: 3.5-4.0
无已知问题。
## glibc: 2.12-2.25
无已知问题。
## protobuf: 3.0-5.29
bRPC 中使用了 protobuf 内部 API,上游不保证相关 API 的兼容性,目前测试可以支持到 v29(5.29),如有问题欢迎[反馈](https://github.com/apache/brpc/issues)。
[1.8.0](https://github.com/apache/brpc/releases/tag/1.8.0) 中 [#2406](https://github.com/apache/brpc/pull/2406) 和 [#2493](https://github.com/apache/brpc/pull/2493)引入了部分 proto3 语法,所以目前 bRPC 不再兼容 protobuf 2.x 版本。如果你希望使用 2.x 版本,可以使用 1.8.0 之前的 bRPC 版本。
## gflags: 2.1-2.2.2
2.1.1 中存在一处已知问题,需要[补丁](https://github.com/gflags/gflags/commit/408061b46974cc8377a8a794a048ecae359ad887)。
## openssl: 0.97-1.1
被https功能需要。
## tcmalloc: 1.7-2.5
brpc默认**不**链接 [tcmalloc](http://goog-perftools.sourceforge.net/doc/tcmalloc.html)。用户按需要链接tcmalloc。
和glibc内置的ptmalloc相比,tcmalloc通常能提升性能。然而不同版本的tcmalloc可能表现迥异。例如:tcmalloc 2.1与 tcmalloc 1.7和2.5相比,可能会让brpc的多线程样例性能显著恶化(tcmalloc中的一个自旋锁导致的)。甚至不同的小版本号之间变现也可能不同。当你的程序表现不符合预期的时候,移除tcmalloc然后尝试其他版本。
用gcc4.8.2编译然后链接更早版本GCC编译的tcmalloc,可能会让程序中main()函数之前挂掉或者死锁,例如:
![img](../images/tcmalloc_stuck.png)
当你遇到这个问题的时候,请用同一个GCC重新编译tcmalloc。
另外一个使用tcmalloc的常见问题是,它不会像 ptmalloc一样及时地归还内存给系统。因此当有一个无效的内存访问的时候,程序可能不会直接挂掉,取而代之的是它可能在一个不相关的地方挂掉,或者甚至一直不挂掉。当你的程序出现怪异的内存问题的时候,尝试移除tcmalloc。
如果你要使用[cpu profiler](cpu_profiler.md)或[heap profiler](heap_profiler.md),要链接`libtcmalloc_and_profiler.a`。这两个 profiler都是基于tcmalloc的。而[contention profiler](contention_profiler.md)不需要tcmalloc。
当你移除tcmalloc的时候,不仅要移除tcmalloc的链接,也要移除宏`-DBRPC_ENABLE_CPU_PROFILER`
## glog: 3.3+
brpc实现了一个默认的[日志功能](../../src/butil/logging.h)它和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
无已知问题。
## libunwind: 1.3-1.8.1
bRPC默认**不**链接 [libunwind](https://github.com/libunwind/libunwind)。用户需要追踪bthread功能则链接libunwind,可以给config_brpc.sh增加`--with-bthread-tracer`选项或者给cmake增加`-DWITH_BTHREAD_TRACER=ON`选项,如果是用 bazel 构建,请添加 `--define with_bthread_tracer=true` 选项。
建议使用最新版本的libunwind。
# 实例追踪
我们提供了一个程序去帮助你追踪和监控所有brpc实例。 只需要在某处运行 [trackme_server](https://github.com/apache/brpc/tree/master/tools/trackme_server/) 然后再带着 -trackme_server=SERVER参数启动需要被追踪的实例。trackme_server将从实例周期性地收到ping消息然后打印日志。您可以从日志中聚合实例地址,并调用实例的内置服务以获取更多信息。