Ubuntu22.04 - brpc的安装和使用
目录
- 介绍
- 安装
- 使用
介绍
brpc 是用 c++语言编写的工业级 RPC 框架,常用于搜索、存储、机器学习、广告、推荐等高性能系统
安装
先安装依赖
apt-get install -y git g++ make libssl-dev libprotobuf-dev libprotoc-dev protobuf-compiler libleveldb-dev libgflags-dev
安装brpc
去github上下载https://github.com/apache/brpc.git
![]()
依次执行
unzip brpc-master.zip
cd brpc-master
mkdir build && cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr .. && cmake --build . -j6
make && sudo make install
使用
示例:
main.proto文件
syntax="proto3";package example;option cc_generic_services = true; // 这个选项的功能其实就是 生成框架代码的时候, 内部包含了rpc相关接口的内容message EchoRequest{string message = 1;
}message EchoResponse{string message = 1;
}//这是回显服务器的名称
service EchoService{// EchoRequest参数 EchoResponse返回类型rpc Echo(EchoRequest) returns (EchoResponse); // 定义rpc接口
}
client.cc文件
#include <brpc/channel.h>
#include <thread>
#include "main.pb.h"//brpc是同步调用还是异步调用, 是客户端来决定的 -- 明天ai问一下void callback(brpc::Controller* cntl, ::example::EchoResponse* response){std::unique_ptr<brpc::Controller> cntl_guard(cntl);std::unique_ptr<example::EchoResponse> resp_guard(response);if (cntl->Failed() == true) {std::cout << "Rpc调用失败: " << cntl->ErrorText() << std::endl;return;}std::cout << "收到响应: " << response->message() << std::endl;
}int main(int argc, char* argv[])
{//1. 构造Channel信道, 连接服务器brpc::ChannelOptions options;options.connect_timeout_ms = -1; //连接等待超时时间, -1表示一直等待options.timeout_ms = -1; //rpc请求等待超时时间, -1表示一直等待options.protocol = "baidu_std"; //序列化协议, 默认使用baidu_stdbrpc::Channel channel; //为什么要有这个类? 没有这个类就不能进行通信, 理解为管道 int ret = channel.Init("127.0.0.1:8080", &options); //参数1: 服务器地址 参数2: 客户端连接时的配置if (ret == -1) {std::cout << "初始化信道失败! \n";return -1;}//2. 构造EchoService_Stub对象, 用于进行rpc调用example::EchoService_Stub stub(&channel); //相当于客户端类//3. 进行Rpc调用example::EchoRequest req;req.set_message("你好~比特~!");//这个Controller提供了很多功能, 其中一个就是辨别返回值的成功或失败brpc::Controller* cntl = new brpc::Controller();//如果我们不想同步处理, 即不想等待响应, 希望异步, 就要通过Controller设置回调函数//注意一个问题: 可能在处理回调函数的时候,如果这个cntl和rsp是栈对象 这个cntl,rsp会被释放掉, 如果这个main函数//是一个普通的函数,则处理这个回调函数的时候,可能这个函数已经结束了, 这个cntl,rsp已经被释放掉了,这就可能出现错误example::EchoResponse* rsp = new example::EchoResponse(); //用于接收返回值的auto clusure = google::protobuf::NewCallback(callback, cntl, rsp);stub.Echo(cntl, &req, rsp, clusure); //异步调用// stub.Echo(cntl, &req, rsp, nullptr); //最后一个参数, 如果是异步调用, 则要传参让服务器设置去run, 我们是同步调用, 所以就不用设置了// if(cntl->Failed() == true) {// std::cout << "Rpc调用失败: " << cntl->ErrorText() << std::endl;// return -1;// }// std::cout << "收到响应: " << rsp->message() << std::endl;std::this_thread::sleep_for(std::chrono::seconds(3));return 0; //如果是异步调用, 主函数需要等待, 否则程序可能会直接结束
}
server.cc文件
#include <brpc/server.h>
#include <butil/logging.h>
#include "main.pb.h"//1. 继承与EchoService创建一个子类, 并实现rpc调用的业务功能
class EchoServiceImpl : public example::EchoService{ //EchoService类是远程调用rpc服务的类 - 就是真正进行sum计算的public:// 重写这个虚函数//RpcController: 返回结果是成功或失败 //request客户端的请求 response服务器要构造的响应//Closure: 大格局理解 服务端是异步执行的, 将Response的响应设置完了, 再调用run函数, 告诉服务器可以发给客户端响应了void Echo(google::protobuf::RpcController* controller, const ::example::EchoRequest* request,::example::EchoResponse* response, ::google::protobuf::Closure* done) //至于这个函数是在业务服务器 主线程还是线程池中执行, 我们并不关心{//防止程序员忘记最后调用run函数, 所以用智能指针来管理起来brpc::ClosureGuard rpc_guard(done);std::cout << "收到消息:" << request->message() << std::endl;std::string str = request->message() + "--这是响应!!";response->set_message(str);// done->Run() 如果不写上面的guard, 则需要加上这句话}
};int main(int argc, char* argv[])
{// 关闭brpc的默认日志输出logging::LoggingSettings settings;settings.logging_dest = logging::LoggingDestination::LOG_TO_NONE;logging::InitLogging(settings);//2. 构造服务器对象brpc::Server server;//3. 向服务器对象中, 新增EchoService服务EchoServiceImpl echo_service;int ret = server.AddService(&echo_service, brpc::ServiceOwnership::SERVER_DOESNT_OWN_SERVICE);if (ret == -1){std::cout << "添加Rpc服务失败!\n";return -1;}//参数1: 添加服务, 只有你添加了服务, 服务器才能处理你对应的请求, 和路由很像 类型为Service*, EchoServiceImpl是它的子类//参数2: 添加服务失败的时候, 服务器是否会删除该对象 因为echo_service是局部变量, 所以不用去释放//4. 启动服务器brpc::ServerOptions options; //启动服务器时的配置类options.idle_timeout_sec = -1; //连接空闲超时时间 - 超时后连接被关闭options.num_threads = 1; //io线程数量ret = server.Start(8080, &options);if (ret == -1) {std::cout << "启动服务器失败! \n";return -1;}server.RunUntilAskedToQuit(); //服务器一直循环运行return 0;
}
先用protoc进行编译:
编译运行:
相关文章:
Ubuntu22.04 - brpc的安装和使用
目录 介绍安装使用 介绍 brpc 是用 c语言编写的工业级 RPC 框架,常用于搜索、存储、机器学习、广告、推荐等高性能系统 安装 先安装依赖 apt-get install -y git g make libssl-dev libprotobuf-dev libprotoc-dev protobuf-compiler libleveldb-dev libgflags-d…...
网络运维学习笔记 018 HCIA-Datacom综合实验02
文章目录 综合实验2sw3:sw4:gw:core1(sw1):core2(sw2):ISP 综合实验2 sw3: vlan 2 stp mode stp int e0/0/1 port link-type trunk port trunk allow-pass v…...
Vulhub靶机 Apache Druid(CVE-2021-25646)(渗透测试详解)
一、开启vulhub环境 docker-compose up -d 启动 docker ps 查看开放的端口 1、漏洞范围 在Druid0.20.0及更低版本中 二、访问靶机IP 8888端口 1、点击Load data进入新界面后,再点击local disk按钮。 2、进入新界面后,在标红框的Base directory栏写上…...
VSCode配置自动生成头文件
一、配置步骤: 1.打开命令面板(CtrlShiftp): 2.输入snippets 选择配置代码片段 3. 选择新建全局代码片段 输入文件名,比如header_cpp(随便定义),然后点击键盘回车按钮,得到下面这个文件。 增加配置文…...
Xcode如何高效的一键重命名某个关键字
1.选中某个需要修改的关键字; 2.右击,选择Refactor->Rename… 然后就会出现如下界面: 此时就可以一键重命名了。 还可以设置快捷键。 1.打开Settings 2.找到Key Bindings 3.搜索rename 4.出现三个,点击一个地方设置后其…...
React 高阶组件的优缺点
React 高阶组件的优缺点 优点 1. 代码复用性高 公共逻辑封装:当多个组件需要实现相同的功能或逻辑时,高阶组件可以将这些逻辑封装起来,避免代码重复。例如,多个组件都需要在挂载时进行数据获取操作,就可以创建一个数…...
(五)趣学设计模式 之 建造者模式!
目录 一、 啥是建造者模式?二、 为什么要用建造者模式?三、 建造者模式怎么实现?四、 建造者模式的应用场景五、 建造者模式的优点和缺点六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方…...
香橙派/树莓派 利用Wiring库 使用GPIO模拟PWM
香橙派或者树莓派 等开发板,本身带有硬件PWM,比如香橙派3 lts版,但是这个引脚不符合我的项目需求,我需要外接一个电机,在检测到人脸的时候 转动,但是这个硬件引脚,只要上电就开始输出pwm 信号,导…...
全面收集中间件Exporter适配:从Redis到ActiveMQ,掌握监控数据采集的最佳实践
#作者:任少近 文章目录 说明:一 Redis的适配exporter版1.1 Redis的exporter源码版本1.2 Redis的exporter的releases版1.3 Redis_exporter版本选择理由1.4 Redis_exporter docer镜像 二 Zookeeper的适配exporter版2.1 Zookeeper的exporter源码版本2.2 Zo…...
机器学习数学通关指南——链式法则
前言 本文隶属于专栏《机器学习数学通关指南》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见《机器学习数学通关指南》 正文 一、定义与公式 链式法则&a…...
JavaScript函数-arguments的使用
在JavaScript编程语言中,函数是构建复杂逻辑和实现代码复用的关键组件。虽然现代JavaScript(尤其是ES6及之后版本)提供了更多灵活的方式来处理函数参数(如剩余参数、默认参数等),但arguments对象仍然是一个…...
千峰React:函数组件使用(2)
前面写了三千字没保存,恨! 批量渲染 function App() {const list [{id:0,text:aaaa},{id:1,text:bbbb},{id:2,text:cccc}]// for (let i 0; i < list.length; i) {// list[i] <li>{list[i]}</li>// }return (<div><…...
DPVS-3: 双臂负载均衡测试
测试拓扑 双臂模式, 使用两个网卡,一个对外,一个对内。 Client host是物理机, RS host都是虚拟机。 LB host是物理机,两个CX5网卡分别在两个子网。 配置文件 用dpvs.conf.sample作为双臂配置文件,其中…...
2016年下半年试题二:论软件设计模式及其应用
论文库链接:系统架构设计师论文 论文题目 软件设计模式(Software DesignPatter)是一套被反复使用的、多数人知晓的、经过分类编目的代码设计经验的总结。使用设计模式是为了重用代码以提高编码效率增加代码的可理解性、保证代码的可靠性。软件设计模式是软件开发中的…...
深入理解 SQL 中的 DATEDIFF 函数
深入理解 SQL 中的 DATEDIFF 函数 DATEDIFF 函数在 SQL 中是一个用于计算两个日期之间差值的重要工具。不同数据库实现了不同版本的 DATEDIFF,它们在功能和语法上有所不同。本文将详细解析 DATEDIFF 的用法、数据库间差异、复杂场景中的应用,以及替代方…...
【第二节】C++设计模式(创建型模式)-抽象工厂模式
目录 引言 一、抽象工厂模式概述 二、抽象工厂模式的应用 三、抽象工厂模式的适用场景 四、抽象工厂模式的优缺点 五、总结 引言 抽象工厂设计模式是一种创建型设计模式,旨在解决一系列相互依赖对象的创建问题。它与工厂方法模式密切相关,但在应用…...
【学习资料】嵌入式人工智能Embedded AI
图片来源: Embedded Artificial Intelligence for Business Purposes | DAC.digital 随着AI在设备端的应用,我们看到越来越多的可穿戴设备出现以及自动驾驶汽车的发展,可以看到嵌入式人工智能是新的发展方向。我为大家介绍嵌入式人工智能的…...
【Python爬虫(60)】解锁社交媒体数据宝藏:Python爬虫实战攻略
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取ÿ…...
C++ 继承,多态
看前须知: 本篇博客是作者听课时的笔记,不喜勿喷,若有疑问可以评论区一起讨论。 继承 定义: 继承机制是⾯向对象程序设计使代码可以复⽤的最重要的⼿段,它允许我们在保持原有 类特性的基础上进⾏扩展,增…...
Java中的Stream API:从入门到实战
引言 在现代Java开发中,Stream API 是处理集合数据的强大工具。它不仅让代码更加简洁易读,还能通过并行处理提升性能。本文将带你从基础概念入手,逐步深入Stream API的使用,并通过实战案例展示其强大功能。 1. 什么是Stream API…...
51单片机型号数字暗藏玄机?STC89C51、C52、C54命名规则与存储空间全解析
51单片机型号密码:从STC89C52数字后缀破解存储空间玄机 第一次接触51单片机时,你是否也被各种型号后缀搞得一头雾水?STC89C51、C52、C54这些看似随机的数字组合,其实暗藏着一套精妙的行业密码。今天我们就来当一回"芯片侦探&…...
模型黑盒的“翻译官”:LIME如何为单个预测提供局部可解释性
1. 当模型说"不"时,我们该如何理解? 想象一下这样的场景:一位贷款申请人收到银行的自动审批系统发来的拒绝通知,屏幕上冷冰冰地显示"申请未通过"。申请人满脸疑惑:"我信用记录良好࿰…...
基于STM32LXXX的无线收发芯片(Ci24R1)应用程序设计
一、简介: Ci24R1 是南京中科微推出的一款工作在 2.4GHz ISM 频段的 GFSK/FSK 无线收发芯片。它在设计上高度兼容 nRF24L01+ 的寄存器映射,常被视为低成本替代方案,同时增加了与 BLE4.2 的物理层兼容性 。 二、主要技术特性: ◼ 工作在2.4GHz ISM频段 ◼ 调制方式:GFSK…...
面向法律 Agent 的 Harness 不可否认性签名
面向法律 Agent 的 Harness 不可否认性签名 关键词:法律Agent、Harness执行沙箱、不可否认性签名、零知识证明、电子证据存证、智能合约、司法合规 摘要:随着生成式AI技术在司法领域的落地,法律AI Agent已经广泛应用于合同审查、证据梳理、文书生成、在线公证等场景,但电子…...
qmc-decoder完整指南:3分钟快速解密QQ音乐加密音频文件
qmc-decoder完整指南:3分钟快速解密QQ音乐加密音频文件 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder qmc-decoder是一款专业高效的QQ音乐加密音频文件解密工具…...
AlixLabs APS技术:绕过EUV实现图形化,有望降低晶圆每层掩模成本40%!
AlixLabs APS技术:绕过EUV实现图形化,有望降低晶圆成本40%!在过去几十年的半导体演进里,每一次微缩都离不开光刻能力的支持。从DUV到EUV,从193nm到13.5nm,再到High - NA EUV,整个产业链围绕一个…...
Claude Opus 4.7 API 接入指南:最强模型实测与中转配置教程(2026)
上周 Anthropic 放出了 Claude Opus 4.7 的 API 权限,我第一时间冲进去测了。复杂推理和长上下文代码生成这两块,确实把我之前用的 Claude 4.6 按在地上摩擦。Claude Opus 4.7 是 Anthropic 2026 年发布的旗舰推理模型,接入方式兼容 OpenAI S…...
告别全局update!手把手教你写一个安全的UVM寄存器批量更新函数
告别全局update!手把手教你写一个安全的UVM寄存器批量更新函数 在SoC验证环境中,寄存器配置是最基础却最频繁的操作之一。每次看到验证工程师手动逐个调用set()和update()时,我总会想起自己刚入行时那段"复制粘贴到怀疑人生"的日子…...
2026届学术党必备的十大AI写作助手实测分析
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 一款基于先进自然语言处理跟知识图谱技术被构建的智能辅助系统是 AI 开题报告工具ÿ…...
别再乱调PID了!平衡小车直立环用PD还是PI?手把手教你根据噪声和响应速度做选择
平衡小车PID控制实战:如何根据噪声与响应需求选择PD或PI方案 调试平衡小车时,最让人头疼的莫过于看着它要么像喝醉一样左右摇摆,要么反应迟钝得像树懒。这往往源于PID控制器中D(微分)和I(积分)参…...



