【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 服务端类与接口

这里只介

评论 86
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值