news 2026/6/11 23:22:25

MPRPC项目(第九天,新增服务以及controller实现)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MPRPC项目(第九天,新增服务以及controller实现)

一、新增服务提供

两个都与用户登录没有什么区别

1、friend.proto

syntax = "proto3"; package fixbug; option cc_generic_services = true; message ResultCode{ int32 errcode = 1; bytes errmsg = 2; } message GetFriendListRequest{ uint32 userid = 1; } message GetFriendListResponse{ ResultCode result = 1; repeated bytes friends = 2; } service FriendServiceRpc{ rpc GetFriendList(GetFriendListRequest) returns(GetFriendListResponse); }

要新建一个proto文件。

2、服务端

#include<iostream> #include<string> #include"friend.pb.h" #include"mprpcapplication.h" #include"rpcprovider.h" #include<vector> class FriendService : public fixbug::FriendServiceRpc { public: std::vector<std::string> GetFriendList(uint32_t userid){ std::cout << "do GetFriendList service" << std::endl; std::vector<std::string> vec; vec.push_back("zhangsan"); vec.push_back("lisi"); vec.push_back("wangwu"); return vec; } void GetFriendList(::google::protobuf::RpcController* controller, const ::fixbug::GetFriendListRequest* request, ::fixbug::GetFriendListResponse* response, ::google::protobuf::Closure* done){ uint32_t userid = request->userid(); std::vector<std::string> friendlist = GetFriendList(userid); response->mutable_result()->set_errcode(0); response->mutable_result()->set_errmsg(""); //把好友列表序列化,写入到response的friends字段中,返回给客户端 //inline std::string* GetFriendListResponse::add_friends(); for(std::string &name : friendlist){ std::string *p = response->add_friends(); *p = name; } done->Run(); } }; int main(int argc, char **argv){ //调用框架的初始化操作 MprpcApplication::Init(argc,argv); //provider是一个rpc网络服务对象,把FriendService对象发布到rpc节点上 RpcProvider provider; provider.NotifyService(new FriendService()); //启动rpc服务发布节点 Run以后,进程进入阻塞状态,等待远程的rpc调用请求 provider.Run(); return 0; }

3、消费端

#include<iostream> #include "friend.pb.h" #include"mprpcapplication.h" int main(int argc,char **argv){ //整个程序启动后,想用mprpc框架调用rpc服务,一定要先调用框架的初始化函数(只初始化一次) MprpcApplication::Init(argc,argv); //演示远程调用发布的rpc方法 Login fixbug::FriendServiceRpc_Stub stub(new MprpcChannel()); fixbug::GetFriendListRequest request; request.set_userid(1); //RPC方法的响应 fixbug::GetFriendListResponse response; MprpcController controller; //发起rpc方法的调用 同步的rpc调用过程 MprpcChannel::callmethod stub.GetFriendList(&controller, &request, &response, nullptr); //一次rpc调用完整,读取调用结果 //0表示成功,非0表示错误 如404,not found if(controller.Failed()){ std::cout<<controller.ErrorText()<<std::endl; }else{ if(response.result().errcode() == 0){ std::cout<<"rpc GetFriendList response success! "<<std::endl; for(int i = 0; i < response.friends_size(); i++){ std::cout<<"name"<<i<<": "<<response.friends(i)<<std::endl; } }else{ std::cout<<"rpc GetFriendList response failed: "<<response.result().errcode()<<" msg: "<<response.result().errmsg()<<std::endl; } } return 0; }

这里新增了controller,让服务端能够获得错误信息,无论是出现在服务端还是消费端的。

二、controller实现

该对象是Protobuf RPC框架中用于错误报告和调用控制的核心组件,它使得上层应用能够获知RPC调用过程中发生的各种错误情况,是RPC调用结果反馈的重要机制。

类似于以下用法,在mprpcchannel.cc里修改错误输出,设置出错后,在消费端就能获得。

char errtxt[512] = {0}; sprintf(errtxt,"connect failed!errno : %d",errno); controller->SetFailed(errtxt);

1、mprpccontroller.h

#pragma once #include<google/protobuf/service.h> #include<string> class MprpcController:public google::protobuf::RpcController{ public: MprpcController(); void Reset(); bool Failed() const; std::string ErrorText() const; void SetFailed(const std::string& reason); //目前未实现具体的功能 void StartCancel(); bool IsCanceled() const; void NotifyOnCancel(google::protobuf::Closure* callback); private: bool m_failed;//RPC方法执行过程中的状态 std::string m_errText;//rpc方法执行过程中的错误信息 };

2、mprpccontroller.cc

#include "mprpccontroller.h" //初始化 MprpcController::MprpcController(){ m_failed = false; m_errText = ""; } //重置 void MprpcController::Reset(){ m_failed = false; m_errText = ""; } //判断是否成功 bool MprpcController::Failed() const{ return m_failed; } //返回错误信息 std::string MprpcController::ErrorText() const{ return m_errText; } //发生错误 void MprpcController::SetFailed(const std::string& reason){ m_failed = true; m_errText = reason; } //目前未实现具体的功能 void MprpcController::StartCancel(){} bool MprpcController::IsCanceled() const{return false;} void MprpcController::NotifyOnCancel(google::protobuf::Closure* callback){}

====

这里附上代码,这两次的都没添加

https://github.com/wky-2004/exp1/tree/master/MPRPC

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 10:53:19

Miniconda-Python3.11镜像如何提升你的AI实验复现效率

Miniconda-Python3.11镜像如何提升你的AI实验复现效率 在深度学习实验室里&#xff0c;你是否经历过这样的场景&#xff1a;论文代码跑不起来&#xff0c;报错信息指向某个找不到的CUDA版本&#xff1b;同事说“在我机器上明明能运行”&#xff1b;新成员入职三天还在装环境………

作者头像 李华
网站建设 2026/6/10 12:27:47

解决PyTorch版本不兼容问题:使用Miniconda建立干净环境

解决PyTorch版本不兼容问题&#xff1a;使用Miniconda建立干净环境 在深度学习项目开发中&#xff0c;你是否曾遇到这样的场景&#xff1f;刚克隆一个开源模型仓库&#xff0c;兴冲冲地运行 pip install -r requirements.txt&#xff0c;结果报错&#xff1a;torch.cuda.is_av…

作者头像 李华
网站建设 2026/6/11 20:47:26

HTML表单提交参数控制远程Miniconda环境下的模型训练

HTML表单提交参数控制远程Miniconda环境下的模型训练 在AI项目开发中&#xff0c;一个常见的痛点是&#xff1a;研究人员设计好了实验&#xff0c;却因为不熟悉命令行操作、环境配置冲突或缺乏高性能计算资源而无法顺利启动训练。更糟糕的是&#xff0c;当某次实验“意外成功”…

作者头像 李华
网站建设 2026/6/11 15:02:12

基于SpringBoot+Vue的乡村养老服务管理系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】

摘要 随着我国老龄化进程的加快&#xff0c;乡村地区的养老服务需求日益凸显。传统的养老服务模式已无法满足现代乡村老年人的多样化需求&#xff0c;亟需通过信息化手段提升服务效率和质量。乡村养老服务管理系统旨在整合线上线下资源&#xff0c;为老年人提供便捷的医疗、生…

作者头像 李华
网站建设 2026/6/9 21:11:08

单个 h门作用在某个 qubit 的计算优化原理

也就是 h 门作用在其中一个 qubit 上&#xff0c;对应 state vector 的计算方式。我们来详细推导 H 门作用在其中一个 qubit 上时&#xff0c;对应的 state vector 计算方式。这里会用一个通用的方法&#xff0c;然后举例说明。1. 通用规则对于一个 n-qubit 系统&#xff0c;qu…

作者头像 李华
网站建设 2026/6/10 10:56:33

2025年国内3D打印行业现关键布局:工业与消费级市场双线并进

2025年末&#xff0c;两则重要消息在国内3D打印行业引起了广泛关注。首先是汇纳科技宣布与拓竹合作&#xff0c;引入1.5万台消费级3D打印机来建造超级大农场&#xff1b;另一则是聚焦工业级3D打印的金石三维宣布推出“自由AI”设计平台。两件事情看似毫无关联&#xff0c;但他们…

作者头像 李华