2021SC@SDUSC BRPC源码分析(一) 项目综述

2021SC@SDUSC BRPC源码分析(一) 项目综述

2021SC@SDUSC BRPC源码分析(一) 项目综述

目录

  • 2021SC@SDUSC BRPC源码分析(一) 项目综述
  • 一、BRPC介绍
    • 1.1 RPC概述
    • 1.2 BRPC概述
      • 1.3 BRPC可以做什么?
  • 二、编译
    • 2.1 编译前置知识
    • 2.2 Ubuntu的依赖准备
    • 2.3 使用config_brpc.sh编译brpc
  • 三、项目分工

一、BRPC介绍

1.1 RPC概述

RPC是远程过程调用(Remote Procedure Call)的缩写形式。RPC调用的原理其实很简单,有一些类似于三层构架的C/S系统,第三方的客户程序通过接口调用SAP内部的标准或自定义函数,获得函数返回的数据进行处理后显示或打印。
2021SC@SDUSC BRPC源码分析(一) 项目综述_第1张图片
完整 RPC 架构图

1.2 BRPC概述

BRPC 即 Baidu-RPC ,是百度开源的 RPC 框架,在百度内部被大量采用,同时BRPC也有better RPC的含义。

1.3 BRPC可以做什么?

  • 搭建能在一个端口支持多协议的服务, 或访问各种服务
    • restful http/https,h2/gRPC。使用brpc的http实现比libcurl方便多了。从其他语言通过HTTP/h2+json访问基于protobuf的协议.
    • redis和memcached, 线程安全,比官方client更方便
    • rtmp/flv/hls, 可用于搭建流媒体服务
    • hadoop_rpc(可能开源)
    • 支持rdma(即将开源)
    • 支持thrift , 线程安全,比官方client更方便
    • 各种百度内使用的协议: baidu_std, streaming_rpc, hulu_pbrpc, sofa_pbrpc,nova_pbrpc, public_pbrpc, ubrpc和使用nshead的各种协议
    • 基于工业级的RAFT算法实现搭建高可用分布式系统,已在braft开源
  • Server能同步异步处理请求。
  • Client支持同步异步半同步,或使用组合channels简化复杂的分库或并发访问。
  • 通过http界面调试服务, 使用cpu,heap, contention profilers
  • 获得更好的延时吞吐
  • 把你组织中使用的协议快速地加入brpc,或定制各类组件,包括命名服务 (dns, zk, etcd), 负载均衡 (rr, random, consistent hashing)

二、编译

2.1 编译前置知识

brpc鼓励静态链接依赖,以便于每个运行brpc服务的机器不必再安装依赖。

brpc有如下依赖:

  • gflags:命令行解析工具,主要用于解析用命令行执行可执行文件时传入的参数。
  • protobuf: Google提供一个具有高效的协议数据交换格式工具库(类似Json),但相比于Json,Protobuf有更高的转化效率,时间效率和空间效率都是JSON的3-5倍。
  • leveldb: 一个持久化的key/value 存储,key 和 value 都是任意的字节数组(byte arrays),并且在存储时,key 值根据用户指定的 comparator 函数进行排序。

支持的环境

  • Ubuntu/LinuxMint/WSL
  • Fedora/CentOS
  • 自己构建依赖的Linux
  • MacOS
  • Ubuntu/Lin

博主使用软件环境

  • VMware 15
  • Ubuntu 20.04.2.0

2.2 Ubuntu的依赖准备

安装通用依赖,gflags, protobuf, leveldb:

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/heap的profiler:

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

如果需要运行测试,则需要安装并编译ligtest-dev:

sudo apt-get install -y cmake libgtest-dev && cd /usr/src/gtest && sudo cmake . && sudo make && sudo mv libgtest* /usr/lib/ && cd -
//gtest源码目录可能变动,如果/usr/src/gtest不存在,请尝试/usr/src/googletest/googletest。

brpc默认不链接 tcmalloc。用户按需要链接tcmalloc。

  • 使用gcc4.8.2编译然后链接更早版本GCC编译的tcmalloc,可能会让程序中main()函数之前挂掉或者死锁。当你遇到这个问题的时候,请用同一个GCC重新编译tcmalloc
  • tcmalloc 不会像 ptmalloc一样及时地归还内存给系统。因此当有一个无效的内存访问的时候,程序可能不会直接挂掉,取而代之的是它可能在一个不相关的地方挂掉,或者甚至一直不挂掉。当你的程序出现怪异的内存问题的时候,尝试移除tcmalloc

2.3 使用config_brpc.sh编译brpc

git克隆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的静态库到样例中,如果需要链接brpc的共享库,请依次执行:make cleanLINK_SO=1 make

运行测试

$ cd test
$ make
$ sh run_tests.sh

三、项目分工

从源代码网站gitee(https://gitee.com/baidu/BRPC)上可以看到官方发布的说明文档都较为详细且完整。而我们小组成员一共三人,所以大致将主要内容划分为三个部分,去寻找对应功能的代码进行分析,我主要负责下图的第二部分。
2021SC@SDUSC BRPC源码分析(一) 项目综述_第2张图片

你可能感兴趣的:(c++)