brpc安装与使用
1. brpc是什么
brpc 是用 c++语言编写的工业级 RPC 框架,常用于搜索、存储、机器学习、广告、推荐等高性能系统。
brpc具体来说它是一个RPC框架(RPC是一个远程调用的框架)。当客户端想完成某个功能,但是本质来说这个功能并不在客户端完成,而是将这个算力交给服务器来进行。通过网络通信的方式将所需要的参数/数据/输入参数发送给服务器,服务器在针对参数/数据进行处理,然后给客户端返回一个结果。
对客户端来说它的上层并不关心内部网络通信的过程,感觉就是调用了一个接口,就完成了数据的处理拿到了结果。其实就是将数据处理过程交给服务器完成。
就比如下面,服务器内部实现了一个具体的Add功能,而本地也有一个Add接口,但是这个接口内部实现的并不是具体的处理过程,而是在内部通过网络通信向服务器发布一个请求,将参数num1、num2发送给服务器,服务器在调用它内部实现的Add方法去完成具体的处理,处理之后在将结果返回给本地,本地拿到结果,然后它的Add接口在返回最终结果。

可以使用brpc:
- 搭建能在一个端口支持多协议的服务, 或访问各种服务
-
- restful http/https, h2/gRPC。使用 brpc 的 http 实现比 libcurl 方便多了。从其他语言通过 HTTP/h2+json 访问基于 protobuf 的协议.
-
- redis 和 memcached, 线程安全,比官方 client 更方便。
-
- rtmp/flv/hls, 可用于搭建流媒体服务.
-
- 支持 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. 安装
先安装依赖
sudo apt-get install -y git g++ make libssl-dev libprotobuf-dev libprotoc-dev protobuf-compiler libleveldb-dev
安装 brpc
git clone https://github.com/apache/brpc.git
cd brpc
mkdir build && cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
cmake --build . -j6
make
sudo make install
3. 类与接口介绍
3.1 日志输出类与接口
包含头文件: #include <butil/logging.h>
日志输出这里,本质上我们其实用不着 brpc 的日志输出,因此在这里主要介绍如何关闭日志输出。
日志初始化接口InitLogging,里面参数是LoggingSettings类里面包含一个 LoggingDestination(日志要输出到那里的设定),我们给它设置为 LOG_TO_NONE,也就是不进行日志输出。
namespace logging
{
enum LoggingDestination
{
LOG_TO_NONE = 0
};
struct BUTIL_EXPORT LoggingSettings
{
LoggingSettings();
LoggingDestination logging_dest;
};
bool InitLogging(const LoggingSettings &settings);
}
3.2 protobuf 类与接口
protobuf最主要就是替我们进行某种结构的序列化以及反序列化,除此之外,它还可以生成rpc通信接口来供我们进行rpc调用。就是替我们生成一系列接口,我们只需要创建子类去继承基类,然后重写基类内部虚函数,然后就可以实现client和server远程调用了。用起来还是比较方便的。
关于下面所有接口介绍,我们编写一个简单的proto文件,通过这个简单的proto文件进行一个框架代码生成后,在对这些结构进行介绍。
下面我们以 Echo(输出 hello world)方法为例, 来讲解基础的同步 RPC 请求是如何实现的
创建 proto 文件 - main.proto
//声明proto版本
syntax="proto3";
//声明命名空间,protobuf会针对proto编译,使用C++生成一系列框架,框架里面包含很多类,为了避免这些类与其他冲突,所以让我们设置一个命名空间
package example;
//生成相关rpc接口
option cc_generic_services = true;
//定义 Echo 方法请求对象,请求对象内部有那些字段
message EchoRequest {
string message = 1;//protobuf会针对我们所写的内容进行编译,会将各个字段名称和消息都记录起来,因此需要我们给每个字段一个编号
};
//定义 Echo 方法响应对象,响应对象内部有那些字段
message EchoResponse {
string message = 1;
};
//定义 RPC 远端调用接口,(EchoService是接口基类名称)
service EchoService {
//到时候会生成一个远程的Echo调用接口,请求的时候需要传EchoRequest进行请求,最终会返回一个EchoResponse
rpc Echo(EchoRequest) returns (EchoResponse);
};
执行下面指令,就会生成两个文件,mian.pb.h 是头文件,main.pb.cc是实现
protoc --cpp_out=./ main.proto
这是刚才的命名空间,里面有EchoRequset类继承protobuf中的Message

这里我们只有message一个字段,有获取message和设置message,这里都给我们生成了。

当前这里还有生成的EchoResponse类,里面也有个message字段

还有EchoService继承protobuf中的Service类,这个就是远程服务器使用的一个类,这里面包含了我们设置的Echo接口,不过它是一个虚函数。到时候我们编写的时候创建一个子类继承EchoService去实现内部的Echo虚函数,针对requset请求做出什么处理放到response里。最终发送给客户端。

EchoService_Stub是客户端使用的一个类,内部也有一个Echo接口让用户去使用,用户自己定义一个request请求,最终得到一个response响应。

不管是服务端还是客户端里面都会涉及到protobuf类的一些接口

protobuf相关类:
RpcController:上下文管理类–目前主要用于判断rpc请求是否是OK的
Closure:客户端-主要用于设置异步处理回调;服务端:通过Run()接口宣告请求处理完毕
namespace google
{
namespace protobuf
{
class PROTOBUF_EXPORT Closure
{
public:
Closure() {
}
virtual ~Closure();
virtual void Run() = 0;
};
inline Closure *NewCallback(void (*function)());
class PROTOBUF_EXPORT RpcController
{
bool Failed();
std::string ErrorText();
}
}
}
3.3 服务端类与接口
这里只介

最低0.47元/天 解锁文章
793





