brpc的接口使用和封装

brpc 是用 c++语言编写的工业级 RPC 框架,常用于搜索、存储、机器学习、广告、推荐等高性能系统。

brpc的远程调用思想;将数据处理的过程不在放在本地进行,而是放在服务器中去

接口使用

客户端和服务端的使用

服务端:

1.继承EchoServerImpl的一个子类 并实现rpc调用的业务

2.构建服务器对象

3.新增echo服务

4.启动服务器

设置服务器设置ServerOption

#include <brpc/server.h>
#include <brpc/closure_guard.h>
#include <butil/logging.h>
#include "main.pb.h"

//1.构建子类brpcserver对象实现brpc业务函数
class EchoServiceImpl:public example::EchoService               
{
    public:
    EchoServiceImpl(){}
   
    ~EchoServiceImpl() override
    {} 
    void Echo(google::protobuf::RpcController* controller,
                       const ::example::EchoRequest* request,
                       ::example::EchoResponse* response,
                       ::google::protobuf::Closure* done) override
    {
                brpc::ClosureGuard rpc_guard(done);
                // ~ClosureGuard() {
                //if (_done) {
                //_done->Run();
                //}
                std::cout<<"收到了消息"<<request->message()<<std::endl;
                response->set_message(request->message()+"好的,我知道了");

                //_done->Run();
    }

};
  

int main(int argc,char * argv[])
{
    
    logging::LoggingSettings logger;
    logger.logging_dest= logging :: LoggingDestination::LOG_TO_NONE;
    logging::InitLogging(logger);
    //2.创建服务器并添加业务
    brpc::Server server;
    EchoServiceImpl echosservice;
    if(&echosservice==nullptr)
    {
        std::cout << "添加Rpc服务失败!\n";
        exit(0);
    }
   
    int n=server.AddService(&echosservice,brpc::ServiceOwnership::SERVER_DOESNT_OWN_SERVICE);
  
    if(n<0)
    {
        std::cout<<"AddService error"<<std::endl;
        exit(0);
    }
    //函数不匹配,源码有可能设置的是指针类型,tips
    //3.设置服务器选项,并且启动服务器
    brpc::ServerOptions opt;
    opt.idle_timeout_sec=-1;//尝试连接时间 超时则退出
    opt.num_threads=1;//number of pthreads that server runs on. 单线程
    opt.max_concurrency=10; //number of requests processed in parallel(并行)// Default: 0 (unlimited)
   
    int m=server.Start(8080,&opt);
    if(m<0)
    {
        std::cout<<"server Start error"<<std::endl;
        exit(1);
    }
    server.RunUntilAskedToQuit();//运行等待服务结束
}

客户端:

1.构建channel信道,连接服务器

2.构造Echoservice_Stub对象,进行rpc调用

3.rpc调用 定义请求 构造请求

#include<brpc/channel.h>
#include<brpc/grpc_health_check.pb.h>
#include"main.pb.h"

void callback(brpc::Controller*  control,example::EchoResponse* response1)
{
    std::unique_ptr<brpc::Controller> cntl_guard(control);
    std::unique_ptr<example::EchoResponse> resp_guard(response1);
     if(control->Failed())
    {
        std::cout<<"rpc echo service failed"<<control->ErrorText()<<std::endl;
        exit(1);
    }
    std::cout<<response1->message()<<std::endl;
 
}
int main(int argc,char *argv[])
{
    //构建信道并且初始化
    brpc::Channel channel;
    brpc::ChannelOptions options;
    options.connect_timeout_ms=200;//尝试连接时长
     Default: 200 (milliseconds)
    options.timeout_ms=-1;//rpc调用等待时间 
    //Max duration of RPC over this Channel RPC调用在信道的期间
    options.protocol="baidu_std";
    options.max_retry=3;
    channel.Init("127.0.0.1",8080,&options);

    //调用EchoService_Stub 进行rpc业务调用
    example::EchoService_Stub echoServiceStub(&channel);
    brpc::Controller* control=new brpc::Controller();
    control->Reset();
    example::EchoRequest request1;
    example::EchoResponse* response1=new  example::EchoResponse();
    request1.set_message("你好啊少年");
    //rpc业务调用
    // echoServiceStub.Echo(control, &request1,response1,nullptr);
  
    // if(control->Failed())
    // {
    //     std::cout<<"rpc echo service failed"<<control->ErrorText()<<std::endl;
    //     exit(1);
    // }

    // std::cout<<"client收到响应"<<response1->message()<<std::endl;

    //Echo要设置成异步的话
    auto closure1=google::protobuf::NewCallback(callback,control,response1);
    echoServiceStub.Echo(control, &request1,response1,closure1);
    std::cout<<"异步访问结束"<<std::endl;
}

main.proto

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);
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

.NET MAUI与.NET for Android/IOS的关系

2024年11月13日微软发布了.Net9.0,我打算体验一下。安装好.Net9.0 SDK后发现Visual Studio识别不到9.0&#xff0c;但是通过命令行dotnet --info查看是正常的&#xff0c;后面看到了VS有版本可以升级&#xff0c;把VS升级到17.12.0就可以了。更新完打开以后看到如下界面 这里…

聚焦 Facebook 隐私安全,守护用户数字家园

随着数字技术的飞速发展&#xff0c;社交媒体已成为我们生活中不可或缺的一部分&#xff0c;而隐私与安全的问题也愈加突出&#xff0c;特别是在 Facebook 这样拥有全球数十亿用户的平台上。如何有效地保障用户隐私&#xff0c;守护用户的数字家园&#xff0c;已成为社会各界关…

Linux C/C++编程的线程创建

【图书推荐】《Linux C与C一线开发实践&#xff08;第2版&#xff09;》_linux c与c一线开发实践pdf-CSDN博客《Linux C与C一线开发实践&#xff08;第2版&#xff09;&#xff08;Linux技术丛书&#xff09;》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com…

Gitee上获取renren-fast-vue install并run dev错误处理

目的&#xff1a;获取一个手脚架、越简约越好、越干净越好、于是看上了renren-fast-vue… 前端&#xff1a;vue2 后端&#xff1a;jdk1.8 mysql 5.7 SpringBoot单体架构 一开始只是下载前后端项目到本地&#xff0c;一堆乱七八糟的错误&#xff0c;网上找的资料也参差不齐… …

线程和进程(juc)

线程 一&#xff1a;概念辨析 1&#xff1a;线程与进程 进程&#xff1a; 1&#xff1a;程序由指令和数据组成&#xff0c;指令要执行&#xff0c;数据要读写&#xff0c;就需要将指令加载给cpu&#xff0c;把数据加载到内存&#xff0c;同时程序运行时还会使用磁盘&#x…

五、docker的网络模式

五、docker的网络模式 5.1 Docker的四种网络模式 当你安装docker时&#xff0c;它会自动创建三个网络&#xff0c;可使用如下命令查看&#xff1a; [rootlocalhost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 7390284b02d6 bridge bridge lo…

【AWS re:Invent 2024】一文了解EKS新功能:Amazon EKS Auto Mode

文章目录 一、为什么要使用 Amazon EKS Auto Mode&#xff1f;二、Amazon EKS自动模式特性2.1 持续优化计算成本2.2 迁移集群操作2.3 EKS 自动模式的高级功能 三、EKS Auto 集群快速创建集群配置四、查看来自 API 服务器的指标五、EKS 相关角色权限设置六、参考链接 一、为什么…

数据结构——有序二叉树的删除

在上一篇博客中&#xff0c;我们介绍了有序二叉树的构建、遍历、查找。 数据结构——有序二叉树的构建&遍历&查找-CSDN博客文章浏览阅读707次&#xff0c;点赞18次&#xff0c;收藏6次。因为数据的类型决定数据在内存中的存储形式。left right示意为左右节点其类型也为…

git pull error: cannot lock ref

Git: cannot lock ref ‘refs/remotes/origin/feature/xxx’: refs/remotes/origin/feature/xxx/car’ exists; cannot create refs/remotes/origin/feature/xxx git remote prune origin重新整理服务端和本地的关联关系即可

树与图深度优先遍历——acwing

题目一&#xff1a;树的重心 846. 树的重心 - AcWing题库 分析 采用暴力枚举&#xff0c;试探每个点&#xff0c;除去之后&#xff0c;连通分量最大值是多少&#xff0c; 各个点的最大值找最小的 因为可以通过 dfs 来得到 根u以下点数&#xff0c;以及可以求各分树的点数&am…

ultralytics-YOLOv11的目标检测解析

1. Python的调用 from ultralytics import YOLO import os def detect_predict():model YOLO(../weights/yolo11n.pt)print(model)results model(../ultralytics/assets/bus.jpg)if not os.path.exists(results[0].save_dir):os.makedirs(results[0].save_dir)for result in…

图形开发基础之在WinForms中使用OpenTK.GLControl进行图形绘制

前言 GLControl 是 OpenTK 库中一个重要的控件&#xff0c;专门用于在 Windows Forms 应用程序中集成 OpenGL 图形渲染。通过 GLControl&#xff0c;可以轻松地将 OpenGL 的高性能图形绘制功能嵌入到传统的桌面应用程序中。 1. GLControl 的核心功能 OpenGL 渲染上下文&…

Facebook广告文案流量秘诀

Facebook 广告文案是制作有效 Facebook 广告的关键方面。它侧重于伴随广告视觉元素的文本内容。今天我们的博客将深入探讨成功的 Facebook 广告文案的秘密&#xff01; 一、广告文案怎么写&#xff1f; 正文&#xff1a;这是帖子的正文&#xff0c;出现在您姓名的正下方。它可…

java面向对象实验——扫雷+24点

扫雷 窗口绘制&#xff1a; GameWin package com.sxt;import javax.swing.*;public class GameWin extends JFrame {void launch(){this.setVisible(true);this.setSize(500, 500);this.setLocationRelativeTo(null);this.setTitle("SWE23070扫雷游戏");this.setD…

Ubuntu24安装 python3-mysql.connector

正确命令 sudo apt install python3-mysql.connector说明 网络上已有的文章Python版本和Ubuntu版本旧&#xff0c;命令不生效。

【西门子PLC.博途】——在S71200里写时间设置和读取功能块

之前我们在这篇文章中介绍过如何读取PLC的系统时间。我们来看看在西门子1200里面有什么区别。同时也欢迎关注gzh。 我们在S71200的帮助文档中搜索时间后找到这个数据类型 在博途中他是一个结构体&#xff0c;具体为 然后我们再看看它带的读取和写入时间块 读取时间&#xff1…

如何搭建智慧工厂?IOT+AI:赋能未来制造业灯塔工厂建设

在当今数字化和智能化的浪潮中&#xff0c;传统制造业正经历着前所未有的变革。智慧工厂作为智能制造的核心内容&#xff0c;正逐步成为未来制造业的发展趋势。本文将深入探讨智慧工厂的搭建过程&#xff0c;以及IoT&#xff08;物联网&#xff09;和AI&#xff08;人工智能&am…

内存图及其画法

所有的文件都存在硬盘上&#xff0c;首次使用的时候才会进入内存 进程&#xff1a;有自己的Main方法&#xff0c;并且依赖自己Main运行起来的程序。独占一块内存区域&#xff0c;互不干扰。内存中有一个一个的进程。 操作系统只认识c语言。操作系统调度驱动管理硬件&#xff0…

Linux下,用ufw实现端口关闭、流量控制(二)

本文是 网安小白的端口关闭实践 的续篇。 海量报文&#xff0c;一手掌握&#xff0c;你值得拥有&#xff0c;让我们开始吧&#xff5e; ufw 与 iptables的关系 理论介绍&#xff1a; ufw&#xff08;Uncomplicated Firewall&#xff09;是一个基于iptables的前端工具&#xf…

Python使用Selenium自动实现表单填写之蛇年纪念币蛇钞预约(附源码,源码有注释解析,已测试可用

Python实现纪念币预约自动填写表单 声明:本文只做技术交流,不可用代码为商业用途,文末有源码下载,已测试可用。 Part 1 配置文件改写(源码 有详细的注释说明 读取配置文件,自己组数据库,录入信息 配置文件 Part 2 主函数 每一期的xpath路径都不一样 所以需要提前去网站…