学习brpc:echo服务

2024-04-07 12:44
文章标签 服务 学习 echo brpc

本文主要是介绍学习brpc:echo服务,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Echo同步客户端

server 端

#include <gflags/gflags.h>
#include <json2pb/pb_to_json.h>
#include <brpc/server.h>
#include "butil/endpoint.h"
#include "echo.pb.h"// flags,用于配置server
DEFINE_bool(echo_attachment, true, "Echo attachment as well");
DEFINE_int32(port, 8000, "TCP Port of this server");
DEFINE_string(listen_addr, "", "Server listen address, may be IPV4/IPV6/UDS."" If this is set, the flag port will be ignored");
DEFINE_int32(idle_timeout_s, -1, "Connection will be closed if there is no ""read/write operations during the last `idle_timeout_s'");class EchoServiceImpl : public example::EchoService {
public:EchoServiceImpl() = default;virtual ~EchoServiceImpl() = default;// response完成后执行的回调static void CallAfterRpc(brpc::Controller* controller, const google::protobuf::Message* req, const google::protobuf::Message* res) {std::string req_str, res_str;// 此时cntl/req/res均没有被析构json2pb::ProtoMessageToJson(*req, &req_str, NULL);json2pb::ProtoMessageToJson(*res, &res_str, NULL);LOG(INFO) << "Got "<< "req:" << req_str<< "and res:" << res_str;
}void Echo (google::protobuf::RpcController* controller,const example::EchoRequest* request,example::EchoResponse* response,google::protobuf::Closure* done) override {brpc::Controller* cntl = static_cast<brpc::Controller*>(controller); // 强转brpc::ClosureGuard done_guard(done); // RAII//日志LOG(INFO) << "Received request[log_id=" << cntl->log_id() << "] from " << cntl->remote_side() << " to " << cntl->local_side()<< ": " << request->message()<< " (attached=" << cntl->request_attachment() << ")";// 生成响应response->set_message("Echo: " + request->message());// 如果有捎带数据,也发送回去if(FLAGS_echo_attachment) {cntl->response_attachment().append(cntl->request_attachment());}// 设置response完成后的回调函数cntl->set_after_rpc_resp_fn(std::bind(EchoServiceImpl::CallAfterRpc,std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));}};int main(int argc, char* argv[]) {// 初始化gflagsGFLAGS_NS::ParseCommandLineFlags(&argc, &argv, true);brpc::Server server;EchoServiceImpl service_impl; // 添加服务,,brpc::SERVER_OWNS_SERVICE 表示server是否拥有 service_impl,通常为false    if(server.AddService(&service_impl, brpc::SERVER_OWNS_SERVICE) != 0) {LOG(ERROR) << "Fail to add service";return -1;}// 监听节点, 默认监听所有地址butil::EndPoint point;if(FLAGS_listen_addr.empty()) {point = butil::EndPoint(butil::IP_ANY, FLAGS_port);} else {// 解析监听地址if(butil::str2endpoint(FLAGS_listen_addr.c_str(), &point) != 0) {LOG(ERROR) << "Invalid listen address:" << FLAGS_listen_addr;return -1;}}// 设置配置brpc::ServerOptions options;    options.idle_timeout_sec = FLAGS_idle_timeout_s; // 开启server(异步的)if(server.Start(point, &options) != 0) {LOG(ERROR) << "Fail to start EchoServer";return -1;}// 等待直到退出server.RunUntilAskedToQuit(); return 0;}

client 端

#include <cstdio>
#include <gflags/gflags.h>
#include <butil/logging.h>
#include <butil/time.h>
#include <brpc/channel.h>
#include "echo.pb.h"DEFINE_string(attachment, "attach", "Carry this along with requests");
DEFINE_string(protocol, "baidu_std", "Protocol type. Defined in src/brpc/options.proto");
DEFINE_string(connection_type, "", "Connection type. Available values: single, pooled, short");
DEFINE_string(server, "0.0.0.0:8000", "IP Address of server");
DEFINE_string(load_balancer, "", "The algorithm for load balancing");
DEFINE_int32(timeout_ms, 100, "RPC timeout in milliseconds");
DEFINE_int32(max_retry, 3, "Max retries(not including the first RPC)"); 
DEFINE_int32(interval_ms, 1000, "Milliseconds between consecutive requests");int main(int argc, char* argv[]) {GFLAGS_NS::ParseCommandLineFlags(&argc, &argv, true);// 配置brpc::ChannelOptions options;options.protocol = FLAGS_protocol;options.connection_type = FLAGS_connection_type;options.timeout_ms = FLAGS_timeout_ms/*milliseconds*/;options.max_retry = FLAGS_max_retry;// 初始化channelbrpc::Channel channel;if((channel.Init(FLAGS_server.c_str(), FLAGS_load_balancer.c_str(), &options)) != 0) {LOG(ERROR) << "Fail to initialize channel";return -1;}// channel的封装类,线程间共享example::EchoService_Stub stub(&channel); // 准备请求响应example::EchoRequest request;example::EchoResponse response;brpc::Controller cntl; char buf[128];printf("请输入:");scanf("%s",buf);request.set_message(buf);// 捎带数据cntl.request_attachment().append(FLAGS_attachment);// Cluster 设置为空,表示同步执行,函数会阻塞,直到结果返回,或者超时stub.Echo(&cntl, &request, &response, NULL);if(cntl.Failed()) {LOG(WARNING) << cntl.ErrorText(); // 通常这只是WARNING,为了演示才直接返回return -1;}// 正确输出LOG(INFO) << "Received response from " << cntl.remote_side()<< " to " << cntl.local_side()<< ": " << response.message() << " (attached="<< cntl.response_attachment() << ")"<< " latency=" << cntl.latency_us() << "us";}

Echo 异步客户端

server端代码与同步端端server一致。

client端

#include <cstdio>
#include <gflags/gflags.h>
#include <butil/logging.h>
#include <butil/time.h>
#include <brpc/channel.h>
#include <google/protobuf/stubs/callback.h>
#include "brpc/callback.h"
#include "bthread/bthread.h"
#include "echo.pb.h"DEFINE_string(attachment, "attach", "Carry this along with requests");
DEFINE_string(protocol, "baidu_std", "Protocol type. Defined in src/brpc/options.proto");
DEFINE_string(connection_type, "", "Connection type. Available values: single, pooled, short");
DEFINE_string(server, "0.0.0.0:8000", "IP Address of server");
DEFINE_string(load_balancer, "", "The algorithm for load balancing");
DEFINE_int32(timeout_ms, 100, "RPC timeout in milliseconds");
DEFINE_int32(max_retry, 3, "Max retries(not including the first RPC)"); 
DEFINE_int32(interval_ms, 1000, "Milliseconds between consecutive requests");void HandleResponse(brpc::Controller *cntl, example::EchoResponse* response) {// 异步调用需要自己管理cntl 和 response 的生命周期?!// 不应该管理// std::unique_ptr<brpc::Controller> cntl_guard(cntl);// std::unique_ptr<example::EchoResponse> response_guard(response);if(cntl->Failed()) {LOG(ERROR) << "Fail to send EchoRequest, " << cntl->ErrorText();return;}// 故意等一段时间bthread_usleep(10);// 日志LOG(INFO) << "Received response from " << cntl->remote_side()<< ": " << response->message() << " (attached="<< cntl->response_attachment() << ")"<< " latency=" << cntl->latency_us() << "us";}int main(int argc, char* argv[]) {GFLAGS_NS::ParseCommandLineFlags(&argc, &argv, true);// 配置brpc::ChannelOptions options;options.protocol = FLAGS_protocol;options.connection_type = FLAGS_connection_type;options.timeout_ms = FLAGS_timeout_ms/*milliseconds*/;options.max_retry = FLAGS_max_retry;// 初始化channelbrpc::Channel channel;if((channel.Init(FLAGS_server.c_str(), FLAGS_load_balancer.c_str(), &options)) != 0) {LOG(ERROR) << "Fail to initialize channel";return -1;}// channel的封装类,线程间共享example::EchoService_Stub stub(&channel); // 准备请求响应example::EchoRequest request;example::EchoResponse response;brpc::Controller cntl; char buf[128];printf("请输入:");scanf("%s",buf);request.set_message(buf);// 捎带数据cntl.request_attachment().append(FLAGS_attachment);// 设置异步回调函数google::protobuf::Closure* done = brpc::NewCallback(&HandleResponse, &cntl, &response);// Cluster 非空,表示异步执行,接收完消息后调用donestub.Echo(&cntl, &request, &response, done);// 继续执行while(true) {bthread_usleep(5);printf("do something\n"); // 可以看到,stub.Echo是立即返回的,不影响后续执行}}

这篇关于学习brpc:echo服务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/882628

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。