brpc学习(一)
2018年12月22日 星期六, 发表于 深圳
如果你对本文有任何的建议或者疑问, 可以在 这里给我提 Issues, 谢谢! :)
brpc库是baidu开源的一套rpc框架(本来想学习一下分布式算法paxos,无奈paxos太难,先了解一下raft,刚好百度开源了一套braft代码库,而braft又依赖于brpc,先学习一下brpc)
如果文章有任何冒犯之处,如侵权或者未标明引用,请邮件联系,
brpc在github上已经开源,其中文介绍文档在 https://github.com/brpc/brpc/blob/master/README_cn.md
1. brpc下载安装
brpc 库在github上开源,可以直接使用git下载
git clone https://github.com/brpc/brpc.git
参考官方文档安装getting_started
先安装依赖项:pb,leveldb,snappy,gperf,gtest
sudo apt-get install git g++ make libssl-dev
sudo apt-get install libgflags-dev libprotobuf-dev libprotoc-dev protobuf-compiler libleveldb-dev
sudo apt-get install libsnappy-dev
sudo apt-get install libgoogle-perftools-dev
sudo apt-get install libgtest-dev && cd /usr/src/gtest && sudo cmake . && sudo make && sudo mv libgtest* /usr/lib/ && cd -
使用脚本安装:
sh config_brpc.sh --headers=/usr/include --libs=/usr/lib
make
使用Ubuntu18安装起来,相当便捷
编译完库之后,编译一下测试用例,测试一下:
cd example/echo_c++
make
./echo_server &
./echo_client
2. brpc源码阅读
我学习brpc库主要有几个目的:
- 了解brpc的基本使用方式,为后续阅读braft打下基础;
- 学习其中的基础类库,看一下能够为后续工作复用;
- 学习其中rpc的设计模式,提升自己对较复杂系统的设计能力;
在开始代码阅读之前,先看一下brpc的整体结构,因为google上关于brpc上的介绍文章并不是很多,所以直接按照官方目录看,也可以按照这篇文字来学习 如何看懂源代码–(分析源代码方法)
ubuntu@ubuntu:~/learning/$ tree -L 2 -P brpc/
.
└── brpc
├── bazel
├── cmake
├── docs
├── example
├── java
├── python
├── src
├── test
└── tools
其中 python和java都是TBD(TO BE DONE),bazel和cmake是编译相关,不管,重点关注 docs,example,src,test,tools, 五个目录
2.1 brpc之butil
因为我学习brpc的主要目的之二,就是学习brpc中的基础类库,所以首先先看看butil,我使用的代码阅读器是vs2012和understand
2.1.1 butil之build_config.h
build_config.h 这个头文件是从chromium项目中 拷贝过来的,用来添加各个平台的宏,目前支持的平台
操作系统:OS_WIN / OS_MACOSX / OS_LINUX / OS_POSIX (MACOSX or LINUX) /
OS_NACL (NACL_SFI or NACL_NONSFI) / OS_NACL_SFI / OS_NACL_NONSFI
编译器:COMPILER_MSVC / COMPILER_GCC
处理器:ARCH_CPU_X86 / ARCH_CPU_X86_64 / ARCH_CPU_X86_FAMILY (X86 or X86_64)
ARCH_CPU_32_BITS / ARCH_CPU_64_BITS
2.1.2 butil之compiler_specier.h
compiler_specier定义了各个编译器对应的一些宏,暂时先不关心
2.1.3 butil之macros.h
定义了一些常见的宏函数
宏 | 作用 | 实现原理浅析 | 用法 |
---|---|---|---|
BUTIL_DELETE_FUNCTION | 构造delete函数 | 类默认控制函数 | 后续使用 |
DISALLOW_COPY | 禁止类copy | delete 拷贝构造 | 放在类的private函数中 |
DISALLOW_ASSIGN | 禁止赋值 | delete 赋值 | 放在类的private函数中 |
DISALLOW_COPY_AND_ASSIGN | 上面两个 | delete 赋值or赋值 | 放在类的private函数中 |
DISALLOW_IMPLICIT_CONSTRUCTORS | 禁止隐式构造 | 删除构造函数 | 适用于仅包含 静态方法的类 |
BAIDU_CONCAT | 字符连接 | 宏连接符的作用 | |
arraysize | 返回数组的大小 | 数组大小 | |
BAIDU_CASSERT | 动态断言 | 编译期断言 | |
CR_DEFINE_STATIC_LOCAL | 定义静态局部变量 | 使用new操作取地址 | 有泄漏 |
container_of | 取结构体首地址 | 不懂看这里 | 内核代码中经常看到 |