当前位置: 首页 > news >正文

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 框架&#xff0c;常用于搜索、存储、机器学习、广告、推荐等高性能系统 安装 先安装依赖 apt-get install -y git g make libssl-dev libprotobuf-dev libprotoc-dev protobuf-compiler libleveldb-dev libgflags-d…...

网络运维学习笔记 018 HCIA-Datacom综合实验02

文章目录 综合实验2sw3&#xff1a;sw4&#xff1a;gw&#xff1a;core1&#xff08;sw1&#xff09;&#xff1a;core2&#xff08;sw2&#xff09;&#xff1a;ISP 综合实验2 sw3&#xff1a; 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进入新界面后&#xff0c;再点击local disk按钮。 2、进入新界面后&#xff0c;在标红框的Base directory栏写上…...

VSCode配置自动生成头文件

一、配置步骤&#xff1a; 1.打开命令面板&#xff08;CtrlShiftp&#xff09;&#xff1a; 2.输入snippets 选择配置代码片段 3. 选择新建全局代码片段 输入文件名,比如header_cpp(随便定义)&#xff0c;然后点击键盘回车按钮&#xff0c;得到下面这个文件。 增加配置文…...

Xcode如何高效的一键重命名某个关键字

1.选中某个需要修改的关键字&#xff1b; 2.右击&#xff0c;选择Refactor->Rename… 然后就会出现如下界面&#xff1a; 此时就可以一键重命名了。 还可以设置快捷键。 1.打开Settings 2.找到Key Bindings 3.搜索rename 4.出现三个&#xff0c;点击一个地方设置后其…...

React 高阶组件的优缺点

React 高阶组件的优缺点 优点 1. 代码复用性高 公共逻辑封装&#xff1a;当多个组件需要实现相同的功能或逻辑时&#xff0c;高阶组件可以将这些逻辑封装起来&#xff0c;避免代码重复。例如&#xff0c;多个组件都需要在挂载时进行数据获取操作&#xff0c;就可以创建一个数…...

(五)趣学设计模式 之 建造者模式!

目录 一、 啥是建造者模式&#xff1f;二、 为什么要用建造者模式&#xff1f;三、 建造者模式怎么实现&#xff1f;四、 建造者模式的应用场景五、 建造者模式的优点和缺点六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方…...

香橙派/树莓派 利用Wiring库 使用GPIO模拟PWM

香橙派或者树莓派 等开发板&#xff0c;本身带有硬件PWM,比如香橙派3 lts版&#xff0c;但是这个引脚不符合我的项目需求&#xff0c;我需要外接一个电机&#xff0c;在检测到人脸的时候 转动&#xff0c;但是这个硬件引脚&#xff0c;只要上电就开始输出pwm 信号&#xff0c;导…...

全面收集中间件Exporter适配:从Redis到ActiveMQ,掌握监控数据采集的最佳实践

#作者&#xff1a;任少近 文章目录 说明&#xff1a;一 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…...

机器学习数学通关指南——链式法则

前言 本文隶属于专栏《机器学习数学通关指南》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见《机器学习数学通关指南》 正文 一、定义与公式 链式法则&a…...

JavaScript函数-arguments的使用

在JavaScript编程语言中&#xff0c;函数是构建复杂逻辑和实现代码复用的关键组件。虽然现代JavaScript&#xff08;尤其是ES6及之后版本&#xff09;提供了更多灵活的方式来处理函数参数&#xff08;如剩余参数、默认参数等&#xff09;&#xff0c;但arguments对象仍然是一个…...

千峰React:函数组件使用(2)

前面写了三千字没保存&#xff0c;恨&#xff01; 批量渲染 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: 双臂负载均衡测试

测试拓扑 双臂模式&#xff0c; 使用两个网卡&#xff0c;一个对外&#xff0c;一个对内。 Client host是物理机&#xff0c; RS host都是虚拟机。 LB host是物理机&#xff0c;两个CX5网卡分别在两个子网。 配置文件 用dpvs.conf.sample作为双臂配置文件&#xff0c;其中…...

2016年下半年试题二:论软件设计模式及其应用

论文库链接&#xff1a;系统架构设计师论文 论文题目 软件设计模式(Software DesignPatter)是一套被反复使用的、多数人知晓的、经过分类编目的代码设计经验的总结。使用设计模式是为了重用代码以提高编码效率增加代码的可理解性、保证代码的可靠性。软件设计模式是软件开发中的…...

深入理解 SQL 中的 DATEDIFF 函数

深入理解 SQL 中的 DATEDIFF 函数 DATEDIFF 函数在 SQL 中是一个用于计算两个日期之间差值的重要工具。不同数据库实现了不同版本的 DATEDIFF&#xff0c;它们在功能和语法上有所不同。本文将详细解析 DATEDIFF 的用法、数据库间差异、复杂场景中的应用&#xff0c;以及替代方…...

【第二节】C++设计模式(创建型模式)-抽象工厂模式

目录 引言 一、抽象工厂模式概述 二、抽象工厂模式的应用 三、抽象工厂模式的适用场景 四、抽象工厂模式的优缺点 五、总结 引言 抽象工厂设计模式是一种创建型设计模式&#xff0c;旨在解决一系列相互依赖对象的创建问题。它与工厂方法模式密切相关&#xff0c;但在应用…...

【学习资料】嵌入式人工智能Embedded AI

图片来源&#xff1a; Embedded Artificial Intelligence for Business Purposes | DAC.digital 随着AI在设备端的应用&#xff0c;我们看到越来越多的可穿戴设备出现以及自动驾驶汽车的发展&#xff0c;可以看到嵌入式人工智能是新的发展方向。我为大家介绍嵌入式人工智能的…...

【Python爬虫(60)】解锁社交媒体数据宝藏:Python爬虫实战攻略

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…...

C++ 继承,多态

看前须知&#xff1a; 本篇博客是作者听课时的笔记&#xff0c;不喜勿喷&#xff0c;若有疑问可以评论区一起讨论。 继承 定义&#xff1a; 继承机制是⾯向对象程序设计使代码可以复⽤的最重要的⼿段&#xff0c;它允许我们在保持原有 类特性的基础上进⾏扩展&#xff0c;增…...

Java中的Stream API:从入门到实战

引言 在现代Java开发中&#xff0c;Stream API 是处理集合数据的强大工具。它不仅让代码更加简洁易读&#xff0c;还能通过并行处理提升性能。本文将带你从基础概念入手&#xff0c;逐步深入Stream API的使用&#xff0c;并通过实战案例展示其强大功能。 1. 什么是Stream API…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...