illx10000

青春不是年华,而是心境

brpc学习(一)

2018年12月22日 星期六, 发表于 深圳

如果你对本文有任何的建议或者疑问, 可以在 这里给我提 Issues, 谢谢! :)


brpc库是baidu开源的一套rpc框架(本来想学习一下分布式算法paxos,无奈paxos太难,先了解一下raft,刚好百度开源了一套braft代码库,而braft又依赖于brpc,先学习一下brpc)

1
如果文章有任何冒犯之处,如侵权或者未标明引用,请邮件联系,

brpc在github上已经开源,其中文介绍文档在 https://github.com/brpc/brpc/blob/master/README_cn.md

1. brpc下载安装

brpc 库在github上开源,可以直接使用git下载

1
 git clone https://github.com/brpc/brpc.git

参考官方文档安装getting_started

先安装依赖项:pb,leveldb,snappy,gperf,gtest

1
2
3
4
5
 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 -

使用脚本安装:

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

使用Ubuntu18安装起来,相当便捷

编译完库之后,编译一下测试用例,测试一下:

1
2
3
4
cd example/echo_c++
make
./echo_server &
./echo_client

2. brpc源码阅读

我学习brpc库主要有几个目的:

  1. 了解brpc的基本使用方式,为后续阅读braft打下基础;
  2. 学习其中的基础类库,看一下能够为后续工作复用;
  3. 学习其中rpc的设计模式,提升自己对较复杂系统的设计能力;

在开始代码阅读之前,先看一下brpc的整体结构,因为google上关于brpc上的介绍文章并不是很多,所以直接按照官方目录看,也可以按照这篇文字来学习 如何看懂源代码–(分析源代码方法)

1
2
3
4
5
6
7
8
9
10
11
12
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 取结构体首地址 不懂看这里 内核代码中经常看到