brpc的简单使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 大体流程
  • 一、编写.proto文件
  • 二、服务端搭建
    • 1.继承EchoService创建一个子类,并重写业务方法
    • 2.构造服务器对象
    • 3.向服务器对象中,新增EchoService服务
    • 4.启动服务器
  • 三、客户端搭建
    • 1.构造Channel信道,连接服务器
    • 2.构造存根对象,用于rpc调用
    • 3.进行rpc调用 --同步调用
    • 4.异步调用


前言

使用brpc简单搭建一个echo服务。


大体流程

Rpc调用实现样例:
服务端:
1.创建rpc服务子类继承pb中的EchoService服务类,并实现内部的业务接口逻辑
2.创建rpc服务器类,搭建服务器
3. 向服务器类中添加 rpc子服务对象 – 告诉服务器收到什么请求用哪个接口处理
4.启动服务器
客户端:
1.创建网络通信信道
2.实例化pb中的EchoService Stub类对象
3.发起rpc请求,获取响应进行处理

一、编写.proto文件

定义两个message结构体 代表请求和响应。
定义一个servicer 服务。
使用 protoc --cpp_out./ main生成.cc和.h文件

syntax="proto3";package example;option cc_generic_services = true;message EchoRequest{string message = 1;
}message EchoResponse{string message = 1;
}service EchoService{rpc Echo(EchoRequest) returns (EchoResponse);
}

二、服务端搭建

1.继承EchoService创建一个子类,并重写业务方法

重写的方法就是.proto文件中声明的,这个方法有四个参数,req和resp就不解释了,从req中获取数据,进行业务处理,并把结果写入到resp中。

其中,第一个参数RpcController,这是一个上下文管理类,主要是用来判断请求是否ok。
而第四个参数Closure,在服务器端当响应处理完毕后,需要显示效用这个类中run方法,告诉brpc响应已经处理完了,结果已经写入到resp中,可以给客户端进行响应了。
而为了防止用户忘记调用run,我们可以使用ClosureGuard来管理这个closure对象,他会帮我们调用run方法。

class EchoServiceImpl : public example::EchoService{
public:EchoServiceImpl(){}~EchoServiceImpl(){}//重写Echo方法void Echo(google::protobuf::RpcController* controller,const ::example::EchoRequest* request,::example::EchoResponse* response,::google::protobuf::Closure* done){brpc::ClosureGuard rpc_guard(done);std::cout << "收到消息:" << request->message() << std::endl;std::string str = request->message() + "--这是响应!!";response->set_message(str);}
};

2.构造服务器对象

构造一个服务器用于网络通信。

brpc::Server server;

3.向服务器对象中,新增EchoService服务

将Echoservice服务注册进服务器中,当指定的服务请求到来时,调用指定的服务处理函数,这里的SERVER_DOESNT_OWN_SERVICE代表服务添加失败后,服务器不帮忙释放这个对象。

 EchoServiceImpl echo_service;int ret = server.AddService(&echo_service,brpc::ServiceOwnership::SERVER_DOESNT_OWN_SERVICE);if (ret == -1) {std::cout << "添加Rpc服务失败!\n";return -1;}

4.启动服务器

启动服务器需要填写监听端口和一个ServerOptions对象.
这个对象主要是设置服务器相关选项,多长时未发送连接相关活动就断开连接,io的线程数量等。

 //4.启动服务器brpc::ServerOptions options;options.idle_timeout_sec = -1;  //多长时间没有连接相关事件则关闭连接 -1为永不关闭options.num_threads = 1;    //io线程数量ret = server.Start(8085,&options);if (ret == -1) {std::cout << "添加Rpc服务失败!\n";return -1;}server.RunUntilAskedToQuit();// 运行服务器,直到请求退出

三、客户端搭建

1.构造Channel信道,连接服务器

brpc对连接进行了更细粒度的划分,在一个连接上可以建立多个信道,而多个信道他们底层使用的是同一个连接。用户只需要使用channel来与服务器通信,从而抽象了网络细节。

同样的在与服务器建立连接时,也需要传入一个Channeloptions对象,

	brpc::ChannelOptions options;options.connect_timeout_ms = -1;    //连接超时时间options.timeout_ms = -1;    //请求超时时间options.max_retry = 3;  //最大重传次数options.protocol = "baidu_std"; //网络通信协议brpc::Channel channel;int ret = channel.Init("127.0.0.1:8085",&options);if (ret == -1) {std::cout << "初始化信道失败!\n";return -1;}

2.构造存根对象,用于rpc调用

example::EchoService_Stub stub(&channel);

3.进行rpc调用 --同步调用

同步调用Echo会阻塞等待响应的返回。
同样的,在客户端的调用中也有四个参数。
第一个参数Controller是用于判断请求是否Ok.
第四个参数就不同了,在服务器中第四个参数是为了告知brpc业务已经处理完毕,可以进行返回响应。客户端的第四个参数主要是为了支持异步调用。

    example::EchoRequest req;req.set_message("你好,lkm");example::EchoResponse resp;brpc::Controller cntl;stub.Echo(&cntl,&req,&resp,nullptr);if(cntl.Failed() == true){std::cout << "Rpc调用失败:" << cntl.ErrorText() << std::endl;return -1;}std::cout << "收到响应: " << resp.message() << std::endl;

4.异步调用

第四个参数是一个Closure对象,它可以设置一个回调函数,当响应返回后调用设置的回调函数进行处理。
需要注意的是,由于Echo现在是异步调用,所有他在调用完后就会立即返回,所以为了防止作用域问题,我们需要把resp和Controller在堆上创建。

void callback(brpc::Controller* cntl,example::EchoResponse* resp)
{std::unique_ptr<brpc::Controller> cntl_guard(cntl);std::unique_ptr<example::EchoResponse> resp_guard(resp);if (cntl->Failed() == true) {std::cout << "Rpc调用失败:" << cntl->ErrorText() << std::endl;return;}std::cout << "收到响应: " << resp->message() << std::endl;
}example::EchoRequest req;req.set_message("你好,lkm");example::EchoResponse *resp = new example::EchoResponse();brpc::Controller *cntl = new brpc::Controller();google::protobuf::Closure* closure = google::protobuf::NewCallback(callback,cntl,resp);   //这里设置回调函数stub.Echo(cntl,&req,resp,closure);std::cout << "rpc调用请求已发送" << std::endl;std::this_thread::sleep_for(std::chrono::seconds(3));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/53899.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

String/StringBuffer/StringBuilder的区别

1.是什么 在Java中&#xff0c;String、StringBuffer、和StringBuilder都是用于处理字符串的类&#xff0c;但它们之间存在一些关键的区别&#xff0c;特别是在可变性、线程安全性以及性能方面。 1. String 不可变性&#xff1a;String对象是不可变的&#xff0c;这意味着一旦…

数据中台建设(六)—— 数据开发-提取数据价值

数据开发-提取数据价值 数据开发涉及的产品能力主要包括三部分&#xff1a;离线开发、实时开发和算法开发。 离线开发主要包括离线数据的加工、发布、运维管理&#xff0c;以及数据分析、数据探索、在线查询和及时分析相关工作。实时开发主要涉及数据的实时接入和实时处理。算…

golang学习笔记14——golang性能问题的处理方法

推荐学习文档 基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总golang学习笔记01——基本数据类型golang学习笔记02——gin框架及基本原理golang学习笔记03——gin框架的核心数据结构golang学习笔记04——如何真正写好Golang代码&…

网络高级(学习)2024.9.10

目录 一、Modbus简介 1.起源 2.特点 3.应用场景 二、Modbus TCP协议 1.特点 2.协议格式 3.MBAP报文头 4.功能码 5.寄存器 &#xff08;1&#xff09;线圈寄存器&#xff0c;类比为开关量&#xff0c;每一个bit都对应一个信号的开关状态。 &#xff08;2&#xff09…

[项目实战]EOS多节点部署

文章总览&#xff1a;YuanDaiMa2048博客文章总览 EOS多节点部署 &#xff08;一&#xff09;环境设计&#xff08;二&#xff09;节点配置&#xff08;三&#xff09;区块信息同步&#xff08;四&#xff09;启动节点并验证同步EOS单节点的环境如何配置 &#xff08;一&#xf…

第十一周:机器学习

目录 摘要 Abstract 一、字符级的RNN进行名字分类 1、准备数据 2、构造神经网络 3、训练 4、评价结果 5、预测 二、字符级的RNN生成名字 1、准备数据 2、构造神经网络 3、训练 4、网络采样&#xff08;预测&#xff09; 三、batch normalization 1、 feature n…

【Go】十五、分布式系统、Consul服务注册发现、Nacos配置中心搭建

分布式 传统开发方式的痛点&#xff1a; 我们的服务分为很多种&#xff1a;用户服务、商品服务、订单服务等&#xff0c;若我们一个成熟的体系内&#xff0c;新添加一个服务&#xff0c;会变得十分的繁琐与困难 当我们的负载较大时&#xff0c;如果选择添加机器的方式来减轻…

Bootstrap 警告信息(Alerts)使用介绍

本章将讲解警告&#xff08;Alerts&#xff09;以及 Bootstrap 所提供的用于警告的 class。警告&#xff08;Alerts&#xff09;向用户提供了一种定义消息样式的方式。它们为典型的用户操作提供了上下文信息反馈。 您可以为警告框添加一个可选的关闭按钮。为了创建一个内联的可…

在Flask中实现跨域请求(CORS)

在Flask中实现跨域请求&#xff08;CORS&#xff0c;Cross-Origin Resource Sharing&#xff09;主要涉及到对Flask应用的配置&#xff0c;以允许来自不同源的请求访问服务器上的资源。以下是在Flask中实现CORS的详细步骤和方法&#xff1a; 一、理解CORS CORS是一种机制&…

HTTP 请求处理的完整流程到Servlet流程图

HTTP 请求处理的完整流程。从 TCP 三次握手开始&#xff0c;一直到 Servlet 处理请求并返回响应。 首先&#xff0c;让我解释一下 response.setContentType("text/html;charsetUTF-8"); 这行代码&#xff1a; 这行代码设置了 HTTP 响应的 Content-Type 头。它告诉浏…

【工具箱】NAND NOR FLASH闪存

随着国内集成电路的发展&#xff0c;特别是存储芯片方面&#xff0c;关于NOR Flash&#xff0c;NAND Flash&#xff0c;SD NAND, eMMC, Raw NAND的资料越来越多了。这里我专门写了这篇文章&#xff1a;1&#xff0c;把常用的存储产品做了分类; 2&#xff0c;把这些产品的特点做…

[Postman]接口自动化测试入门

文章大多用作个人学习分享&#xff0c;如果大家觉得有不足或错漏的地方欢迎评论指出或补充 此文章将完整的走一遍一个web页面的接口测试流程 大致路径为&#xff1a; 创建集合->调用接口登录获取token->保存token->带着token去完成其他接口的自动化测试->断言-&g…

Kafka下载与安装教程(国产化生产环境无联网服务器部署实操)

请放心观看&#xff0c;已在正式环境部署验证&#xff0c;流程无问题&#xff01; 所用系统为国产化麒麟银河 aarch64系统&#xff0c;部署时间2024年9月份&#xff01; [rootecs-xxxxxx-xxx ~]# cat /etc/os-release NAME"Kylin Linux Advanced Server" VERSION&q…

MySQL 查询数据库的数据总量

需求&#xff1a;查看MySQL数据库的数据总量&#xff0c;以MB为单位展示数据库占用的磁盘空间 实践&#xff1a; 登录到MySQL数据库服务器。 选择你想要查看数据总量的数据库&#xff1a; USE shield;运行查询以获取数据库的总大小&#xff1a; SELECT table_schema AS Datab…

go语言后端开发学习(七)——如何在gin框架中集成限流中间件

一.什么是限流 限流又称为流量控制&#xff08;流控&#xff09;&#xff0c;通常是指限制到达系统的并发请求数。 我们生活中也会经常遇到限流的场景&#xff0c;比如&#xff1a;某景区限制每日进入景区的游客数量为8万人&#xff1b;沙河地铁站早高峰通过站外排队逐一放行的…

Go 中 Gin 框架的使用指南

Gin 是 Go 语言中一个非常流行的 Web 框架&#xff0c;因其性能优异、简单易用的 API 设计而受到开发者的喜爱。Gin 的优势在于其高效的路由处理和中间件机制&#xff0c;适用于构建 RESTful API 和其他 Web 应用。本文将介绍如何使用 Gin 框架开发一个简单的 Web 应用&#xf…

JAVA毕业设计170—基于Java+Springboot+vue3+小程序的房屋租赁小程序系统(源代码+数据库)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue3小程序的房屋租赁小程序系统(源代码数据库)170 一、系统介绍 本项目前后端分离(可以改为ssm版本)&#xff0c;分为用户、房东、管理员三种角色 1、用户&am…

[000-002-01].第03节:Linux系统下Oracle的安装与使用

2.1.Docker安装Oracle 在CentOS7中使用Docker安装Oracle&#xff1a; 1.安装Docker,详细请参考&#xff1a;https://blog.csdn.net/weixin_43783284/article/details/1211403682.拉取镜像&#xff1a; docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g3.下载…

删除有序数组中的重复项(同向指针(快慢指针))

题目&#xff1a; 算法分析&#xff1a; 快慢指针从0出发若快慢指针不相同&#xff0c;快指针替换慢指针&#xff08;即慢指针后一位&#xff09;快指针每次都会增加题目求不重复的元素个数&#xff08;slow 为对应元素索引&#xff0c;故个数为slow1&#xff09; 算法图解…

如何通过编程工具提升工作效率

目录 常用编程工具介绍 工具效率对比 未来发展趋势 结论 在当今软件开发的高效环境中&#xff0c;工具的选择至关重要。无论是编写代码、调试&#xff0c;还是协作开发&#xff0c;合适的编程工具不仅能够简化开发流程&#xff0c;还可以有效地提高生产力。开发者在日常工作…