开发RpcProvider的发布服务(NotifyService)

1.发布服务过程

目前完成了mprpc框架项目中的以上的功能。

作为rpcprovider的使用者,也就是rpc方法的发布方

main函数如下:

首先我们init调用框架的init,然后启动一个provider,然后向provider上注册服务对象方法,即userservice的login方法,当做一个可以远程调用的rpc方法,然后启动run,run相当于是一个网络服务器。
首先,如果远端有RPC请求的话,RpcProvider的网络模块(muduo)会帮助我们去接收数据,就是接收一个RPC请求,RPC请求里面有函数名,函数参数。RpcProvider先把这个请求上报到LoginRequest。我们作为用户,不管底层是怎么进行网络收发(muduo库完成),不管怎么把网络上的字节流反序列化成具体的LoginRequest的数据(protobuf完成),我们只管最后去使用就可以了。

执行对应方法,最后,我们又把响应的结果送给protobuf,RpcProvider首先通过protobuf进行对响应的结果 序列化,然后通过muduo库发送出去。

所以,接下去我们要完成:框架的RpcProvider从网络上接收一个RPC调用请求时,他怎么知道要调用应用程序的哪个服务对象的哪个RPC方法呢?

当远端发送来一个请求,根据一些信息,由框架调用对应方法,定位到需要调用的服务对象的服务方法,相当于一个回调操作。

我们将要实现NotifyService的:
需要生成一张表,记录服务对象和其发布的所有服务方法。
比如说:UserService 发布了Login , Register等方法
FriendService发布了AddFriend,DelFriend,GetFriendList等方法

由一个表记录这些信息,当远端有一个rpc请求过来,rpcprovider就可以在这个表里查一查,需要调用哪个对象的哪个方法,然后就会帮我们去调用,调用后,我们就会看到对应方法被框架调用,就会去执行我们写好的响应操作。


使用protobuf的好处:这些Service都是继承了protobuf的Service类,方法都是继承protobuf的Method类。
而且,我们用户不知道什么时候调用Login,框架才知道,有人请求,框架才调用,因为我们是作为服务方。

当远端有RPC有请求过来时,RpcProvider就可以在这张表查调用的是哪个对象的哪个方法,它就去调用了。

开发RpcProvider的发布服务NotifyService

GetDescriptor方法用于获取一个服务的描述,服务名字、对象、服务对象里面有哪些方法

2. rpcprovider.h

#pragma once
#include "google/protobuf/service.h"
#include <muduo/net/TcpServer.h>
#include <muduo/net/EventLoop.h>
#include <muduo/net/InetAddress.h>
#include <muduo/net/TcpConnection.h>
#include <string>
#include <functional>
#include <google/protobuf/descriptor.h>
#include <unordered_map>//框架提供的专门发布rpc服务的网络对象类
class RpcProvider
{
public://这里是框架提供给外部使用的,可以发布rpc方法的函数接口void NotifyService(google::protobuf::Service* service);//具体的服务对象类是从Service类继承而来//框架是可以接收各种RPC服务的,不能依赖具体的某一个业务。 //基类指针指向子对象 //启动rpc服务节点,开始提供rpc远程网络调用服务void Run();private://组合EventLoopmuduo::net::EventLoop m_eventLoop;//service服务类型信息struct ServiceInfo{google::protobuf::Service* m_service;//保存服务对象std::unordered_map<std::string,const google::protobuf::MethodDescriptor*> m_methodMap;//保存服务方法};//存储注册成功的服务对象和其服务方法的所有信息std::unordered_map<std::string,ServiceInfo> m_serviceMap;//新的socket连接回调void OnConnection(const muduo::net::TcpConnectionPtr&);//已建立连接用户的读写事件回调void OnMessage(const muduo::net::TcpConnectionPtr&,muduo::net::Buffer*,muduo::Timestamp);
};

3.rpcprovider.cc

#include "rpcprovider.h"
#include "mprpcapplication.h"/*
service_name=> service描述(一个服务由一个服务名字对应)=》 service*  记录服务对象method_name => method方法对象
json:存储键值对,基于文本存储;数据有对应的键值
protobuf:基于二进制存储,存储效率更高;紧密存储,不携带除数据外的任何信息,整体来说protobuf存储效率更高,占用的带宽更少,同样带宽传输的数据量更大不仅可以提供类型的序列化和反序列化,还提供了service rpc方法的描述
*/
//这里是框架提供给外部使用的,可以发布rpc方法的函数接口
void RpcProvider::NotifyService(google::protobuf::Service *service) 
{ServiceInfo service_info;//获取了服务对象的描述信息const google::protobuf::ServiceDescriptor* pserviceDesc=service->GetDescriptor();//获取服务的名字std::string service_name=pserviceDesc->name();//获取服务对象service的方法的数量int methodCnt=pserviceDesc->method_count();std::cout<<"service_name:"<<service_name<<std::endl;for(int i=0;i<methodCnt;++i){//获取了服务对象指定下标的服务方法的描述(抽象描述) UserService Loginconst google::protobuf::MethodDescriptor* pmethodDesc=pserviceDesc->method(i);std::string method_name=pmethodDesc->name();service_info.m_methodMap.insert({method_name,pmethodDesc});std::cout<<"method_name:"<<method_name<<std::endl;}service_info.m_service=service;m_serviceMap.insert({service_name,service_info});}// 启动rpc服务节点,开始提供rpc远程网络调用服务
void RpcProvider::Run()
{std::string ip=MprpcApplication::GetInstance().GetConfig().Load("rpcserverip");uint16_t port=atoi(MprpcApplication::GetInstance().GetConfig().Load("rpcserverport").c_str());muduo::net::InetAddress address(ip,port);//创建TcpServer对象muduo::net::TcpServer server(&m_eventLoop,address,"RpcProvider");//绑定连接回调和消息读写回调方法 ,muduo库的好处是:分离了网络代码和业务代码server.setConnectionCallback(std::bind(&RpcProvider::OnConnection, this, std::placeholders::_1));//预留1个参数std::placeholders::_1server.setMessageCallback(std::bind(&RpcProvider::OnMessage, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));//预留3个参数std::placeholders::_1,2,3//设置muduo库的线程数量server.setThreadNum(4);std::cout<<"RpcProvider start service at ip:"<<ip<<"port:"<<port<<std::endl;//启动网络服务server.start();m_eventLoop.loop();
}//新的socket连接回调
void RpcProvider::OnConnection(const muduo::net::TcpConnectionPtr&)
{}// 已建立连接用户的读写事件回调
void RpcProvider::OnMessage(const muduo::net::TcpConnectionPtr&,muduo::net::Buffer*,muduo::Timestamp)
{}

protobuf提供了serviceRPC方法的描述,service类,method类,从抽象的层面描述服务对象,服务方法,到时候,由底层就直接可以用上层的服务方法了。notifyservice就是发布rpc服务的站点

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SV std::randomize使用技巧与指南

通过以下例子学习&#xff1a; 其它&#xff1a; 里面夹杂&#xff1a; if(en1) { ((a>b)&&(b>c) || (e>f)&&(j>k)); } else { }

AI对职场的整顿

普通人离AI还有几年缓冲区&#xff0c;但早点做准备总是好的 AI淘汰的始终是跟不上时代的人。 现在很多公司都有AI培训&#xff0c;不仅GPT&#xff0c;还有Midjourney、Stable DIffusion等一系列AI工具。 像我们公司虽然今年招的少&#xff0c;但也会对新招的应届生统一进行…

腾讯云 轻量应用服务器 部署私有化大模型

1. 进入控制台后,找到我们购买的服务器,然后点击登录 服务器 - 轻量云 - 控制台 (tencent.com) 2. 安装系统 面板输入 curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sudo bash quick_start.sh 命令解释: 从F…

Redis 备份恢复以及数据迁移

昨晚老板突然在群里发了一张图片&#xff0c;说昨天才用的&#xff0c;怎么今天还要登录&#xff1f;相关人赶紧看看。 我心想让你登录就登录呗&#xff0c;哪来那么多事&#xff1f;本想洗洗睡了。老大突然微信问我说&#xff0c;是不是 Redis 出问题了&#xff1f;怎么用户…

主播美颜工具:美颜SDK的技术原理与应用

美颜SDK不仅大幅提升了主播的颜值&#xff0c;还极大地改善了用户的观看体验。本文将从美颜SDK的技术原理、应用场景以及未来发展趋势等方面进行深入探讨。 一、美颜SDK的技术原理 美颜SDK的核心在于其强大的图像处理技术&#xff0c;通过实时图像处理算法&#xff0c;对视频中…

解决google chrome helper 内存占用较高!

导语&#xff1a;mac 后台有很多 google chrome helper 线程并且内存占用较高。一直怀疑是IDEA插件的锅&#xff0c;并不是&#xff01; 查看是哪个网页&#xff0c;哪个插件占用内存。 chrome 更多工具 -> 任务管理器&#xff1a; 找到罪魁祸首&#xff0c;关闭标签页或者…

基于SpringBoot+IDEA+Mysql开发的在线音乐网站

基于SpringBootIDEAMysql开发的在线音乐网站 项目介绍&#x1f481;&#x1f3fb; 项目背景描述 随着互联网技术的迅猛发展和数字音乐的普及&#xff0c;传统的音乐消费方式正逐渐发生变革。为了满足广大音乐爱好者对于便捷、高效、个性化的音乐服务需求&#xff0c;我们计划开…

解锁高效办公:ONLYOFFICE版本8.1新功能揭秘与个人使用体验

文章目录 &#x1f4af;ONLYOFFICE 桌面编辑器 8.1 ✍1 新增功能介绍✍2 轻松编辑器PDF文件&#x1f353;2.1 PDF新增编辑器操作&#x1f353;2.2 PDF新增表单操作 ✍3 用幻灯片版式快速修改幻灯片✍4 无缝切换文档编辑、审阅和查看模式✍5 改进从右至左语言的支持 & 新的本…

python调用.a或.dll库的运行结果异常的问题记录

问题复述&#xff1a; 博主有个对外的c库&#xff0c;封成.a或.dll库文件以后对外开放&#xff0c;使用ctypes实现对库文件的调用&#xff0c;最早发现①计算过程老是没结束的就异常退出&#xff0c;解决以后&#xff0c;现在又发现②不同的python版本调用库的计算结果不同&am…

C# 任务调度 c# TaskScheduler

摘要 在C#中&#xff0c;TaskScheduler是一种非常有用的功能&#xff0c;它允许您在指定的时间或间隔内执行任务。TaskScheduler是一个抽象类&#xff0c;它提供了一个通用的方法来计划和执行任务。您可以使用TaskScheduler来调度多个任务&#xff0c;并且在多线程环境中控制它…

邮件自动推送技术如何实现?有哪些优劣势?

邮件自动推送怎么设置&#xff1f;如何评估邮件自动推送的效果&#xff1f; 邮件自动推送是一种高效的电子邮件营销和通信技术&#xff0c;它能够根据预设条件自动发送邮件给特定的收件人。AokSend将深入探讨邮件自动推送技术的实现原理和注意事项。 邮件自动推送&#xff1a…

【PostgreSQL】数据基石:PostgreSQL的数据类型与表结构设计

目录 核心数据类型深入探索 基础数值与文本类型 日期与时间类型 特殊与复合类型 JSON与HSTORE 表的创建、修改与管理 创建与修改表结构 索引与性能优化 约束与数据完整性 核心数据类型深入探索 PostgreSQL以其多样化的数据类型著称&#xff0c;不仅包括标准SQL数据类型…

使用可蒸发的电介质流体冷却IGBT

每天一篇行业发展资讯&#xff0c;让大家更及时了解外面的世界。 更多资讯&#xff0c;请关注B站/公众号【莱歌数字】&#xff0c;有视频教程~~ 电子系统的单相液冷却已经广泛应用了50多年。 流体广泛应用于不同的工业&#xff1a;电力电子中的介质油&#xff1b;企业服务器…

微软Win10 22H2六月更新补丁KB5039299来了!附完整更新日志

系统之家于6月26日发出最新报道&#xff0c;微软为 Windows 10 用户发布了六月的安全更新补丁KB5039299。22H2用户升级系统后&#xff0c;会发现版本号升至 19045.4598。此次更新针对影响任务栏上应用跳转列表、默认日语输入法编辑器等多个问题进行修复。接下来跟随小编看看此次…

红酒哲学:品味流转时光,探寻生活之深邃奥秘

在繁华的都市中&#xff0c;我们时常被各种声音和色彩所包围&#xff0c;追求着速度与激情。然而&#xff0c;在这喧嚣之中&#xff0c;总有那么一刻&#xff0c;我们渴望静下心来&#xff0c;品味一份不同的宁静与深度。这时&#xff0c;一杯雷盛红酒便成了我们与内心对话的桥…

免费分享:中国1:250万地质图(附下载方法)

中国1&#xff1a;250万地质图反映了中国区域地质构造面貌和基本特征&#xff0c;表示了中国区域地质的特色&#xff0c;地质编图的标准化程度较高&#xff0c;地质图的编制过程中充分采用了信息技术&#xff0c;反映了地质调查与科研的若干新进展与认识。 数据简介 本数据为空…

lmdeploy部署chatglm3模型并对话

lmdeploy部署chatglm3模型并对话 环境准备创建虚拟环境安装组件下载模型 chat启动模型并对话启动成api_server服务并对话启动成gradio服务 环境准备 使用30% A100 来运行chatglm3模型&#xff0c;采用lmdeploy来启动。 创建虚拟环境 # 创建虚拟环境 conda create -n langcha…

node初始化设置(简单高效)

npm config set prefix "E:\nodejs\node_global" npm config set cache "E:\nodejs\node_cache" 我比较喜欢实用nrm&#xff0c;所以直接指定了nrm的路径

中国历史气象灾害预警数据集

中国历史气象灾害、预警风险区数据&#xff0c;包括&#xff1a;雷暴预警、大雾预警、洪涝风险、地质灾害趋势预测分区、山洪风险、森林火险、暴雨范围、大雨范围、地质风险、高温风险、低温冻害灾情、低温冷害和雪灾等。属性表包括各预警类型、具体时间、时效等。数据从国家突…

【八股系列】探索响应式布局的奥秘:关键技术与实战代码示例

&#x1f389; 博客主页&#xff1a;【剑九 六千里-CSDN博客】 &#x1f3a8; 上一篇文章&#xff1a;【为什么组件中的 data 必须是一个函数&#xff0c;然后 return 一个对象&#xff0c;而 new Vue 实例里&#xff0c;data 可以直接是一个对象&#xff1f;】 &#x1f3a0; …