尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

MPRPC项目(第九天,新增服务以及controller实现)
📅 发布时间:2026/6/20 18:43:49

一、新增服务提供

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

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

相关新闻

  • PCB过孔与电流对照一览表快速理解手册
  • Android16 默认关闭touch声音
  • 基于STM32的LED阵列扫描控制实战案例

最新新闻

  • 立足云南深耕西南、全域覆盖全国 考编雷达差异化打造一站式考编服务平台 - 速递信息
  • [智能体-489]:在星际文明发展的过程中,目前处于什么阶段?
  • Jellyfin桌面客户端:构建专业级开源媒体中心的完整指南
  • Linux超级用户本质:EUID、SUID与权限机制深度解析
  • LPC112x微控制器:从8/16位平滑升级到32位ARM Cortex-M0的实战指南
  • Windows下用Ollama+OpenClaw搭建本地AI Agent实战指南

日新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号