news 2026/6/15 23:25:55

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/5/23 21:07:39

CUDA安装成功但torch.version.cuda为空?重装PyTorch试一试

CUDA安装成功但torch.version.cuda为空&#xff1f;重装PyTorch试一试 在深度学习开发中&#xff0c;你是否曾遇到这样的场景&#xff1a;系统明明已经正确安装了NVIDIA驱动和CUDA工具包&#xff0c;nvidia-smi也能清晰列出GPU信息&#xff0c;可一旦进入Python环境执行import …

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

使用Conda-pack打包迁移完整的PyTorch训练环境

使用 Conda-pack 打包迁移完整的 PyTorch 训练环境 在现代AI开发中&#xff0c;一个常见的痛点是&#xff1a;“为什么我的代码在本地跑得好好的&#xff0c;换台机器就报错&#xff1f;” 这个问题背后&#xff0c;往往是环境差异在作祟——Python版本不一致、PyTorch编译时链…

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

Markdown表格对比不同PyTorch版本对CUDA的支持情况

PyTorch 与 CUDA 兼容性深度解析&#xff1a;构建稳定高效的 AI 开发环境 在现代深度学习项目中&#xff0c;一个看似简单却常常令人头疼的问题是&#xff1a;为什么我的 PyTorch 跑不起来 GPU&#xff1f;明明有 RTX 4090&#xff0c;torch.cuda.is_available() 却返回 False。…

作者头像 李华
网站建设 2026/6/15 14:09:34

Conda env export精准导出:锁定Miniconda-Python3.11环境版本

Conda 环境导出的艺术&#xff1a;如何精准锁定 Miniconda-Python3.11 的完整状态 你有没有遇到过这样的场景&#xff1f;在本地训练好一个模型&#xff0c;信心满满地提交代码和文档&#xff0c;结果同事拉下项目后跑不起来——报错信息五花八门&#xff1a;DLL not found、ve…

作者头像 李华
网站建设 2026/6/15 13:09:52

12.30 - 合并区间 C++中class和C语言中struct的区别

目录 1.合并区间 a.核心思想 b.思路 c.步骤 2.C中class和C语言中struct的区别 1.合并区间 56. 合并区间 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/merge-intervals/ class Solution { public:vector<vector<int>> merge(vector…

作者头像 李华