开发RpcProvider的发布服务(NotifyService)

news2024/11/18 9:38:04

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:
    //组合EventLoop
    muduo::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 Login
        const 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::_1
    server.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.coloradmin.cn/o/1864149.html

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

相关文章

人工智能在医学图像分割中的最新研究进展|顶刊速递·24-06-26

小罗碎碎念 今日推文主题——人工智能在医学图像分割领域中的最新研究进展。 今天的推文都来自同一个期刊——《Med Image Anal 》&#xff0c;最新的IF是10.7。 小罗观点 今天的六篇文献都是直接面向实际应用场景的&#xff0c;可以针对你自己的研究课题选择合适的文章进行阅读…

uniapp标题水平对齐微信小程序胶囊按钮及适配

uniapp标题水平对齐微信小程序胶囊按钮及适配 状态栏高度胶囊按钮的信息计算顶部边距模板样式 标签加样式加动态计算实现效果 状态栏高度 获取系统信息里的状态栏高度 const statusBarHeight uni.getSystemInfoSync().statusBarHeight;//系统信息里的状态栏高度胶囊按钮的…

已解决java.security.GeneralSecurityException: 安全性相关的通用异常的正确解决方法,亲测有效!!!

已解决java.security.GeneralSecurityException: 安全性相关的通用异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 报错原因 解决思路 解决方法 确定具体异常类型 检查输入参数 验证算法支持性 调整安全策略 确保资源可…

学习TS看这一篇就够了!

目录 TS的优点和缺点基础类型数字类型布尔类型字符串类型void 类型null 类型和 undefined 类型bigint类型Symbol类型 其他类型数组元组枚举Enum对象和函数any void never unknown 的区别是什么泛型 Generic交叉类型联合类型 特殊符号 ? ?. ?? ! _修饰符 TS的优点和缺点 优…

优思学院|做工厂的意义是什么?如何管理好一个工厂?

工厂的意义是什么&#xff1f;工厂是让物品增加附加价值的地方。既然使用地球上有限的资源进行生产&#xff0c;工厂就不能浪费这些有限的资源。 什么是附加价值&#xff1f;有人说做菜像变魔术。确实&#xff0c;原本不能食用的食材&#xff0c;经过厨师巧手烹调就能变成美味…

SaaS 出海:Databend Cloud 的定位与实践

提到 “SaaS 出海”这个词大家肯定并不陌生&#xff0c;SaaS 企业将业务拓展到海外市场已经成为许多 SaaS 公司的重要战略方向。随着企业对于灵活性、可扩展性以及成本效益需求的不断增长&#xff0c; SaaS 模式提供了理想的解决方案。对于寻求出海机会的 SaaS 企业来说&#x…

探索Uptime命令:Linux系统管理员的必备工具

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 &#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 探索Uptime命令&#xff1a;Linux系统管理员的必备工具 前言基本用法语法输出示例输出字段解释系…

【Web服务与Web应用开发】【C#】创建第一个简单的WCF服务应用程序 WCF Service Application(图文详情)

目录 0.简介 1.环境 2.知识点 3.详细过程 1&#xff09;打开 Visual Studio 2019 &#xff0c;下载所需插件 2&#xff09;创建WCF服务应用项目 3&#xff09;打开 【IService1.cs 】在此处定义服务函数 4&#xff09;打开 【Service1.svc.cs】实现服务函数 5&#x…

前端-echarts tooltip展示多项自定义数据

效果如图&#xff0c;鼠标滑动到某一个柱子的时候&#xff0c;出现这一项数据的多个自定义数据&#xff0c;外加自己的模板样式渲染。 希望能展示每一列中的多个自定义数据 代码部分 主要是在data中&#xff0c;value就是实际展示的主数据&#xff0c;其他字段名为自定义的数…

【小白学Python】AI生成图片(四)

【小白学Python】自定义图片的生成&#xff08;一&#xff09; 【小白学Python】自定义图片的生成&#xff08;二&#xff09; 【小白学Python】爬取数据&#xff08;三&#xff09; 目录 ai文生图接口的获取python中调用ai接口图片拼接先将图片缩放拼接图片 文字背景图代码效…

怎么压缩pdf文件大小,如何压缩pdf文件大小

pdf文件怎么压缩&#xff1f;在当下这个信息爆炸的时代&#xff0c;无论是在工作场所还是校园中&#xff0c;我们经常会面临需要处理大文件的情况&#xff0c;而PDF格式作为一种保留文档结构和布局完整性的理想选择&#xff0c;有时候pdf文件太大&#xff0c;因此&#xff0c;对…

汽车汽配图纸管理、产品研发管理解决方案

汽车汽配图纸管理、产品研发管理解决方案 随着全球汽车市场的快速发展&#xff0c;中国汽车汽配行业迎来了前所未有的发展机遇。然而&#xff0c;在这一过程中&#xff0c;企业也面临着诸多挑战&#xff0c;如研发能力的提升、技术资料管理的复杂性、以及跨部门协作的困难等。为…

ubuntu22.04速装中文输入法

附送ubuntu安装chrome wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo dpkg -i google-chrome-stable_current_amd64.deb

动画重定向——当给一个人物模型用别人物的动画时,会遇到人物与动画不匹配问题,怎么解决呢?

每日一句&#xff1a;实践出真知&#xff0c;试错方确信 目录 最开始我想的原因&#xff01; 分析一下动画相关参数 Animator组件参数详解&#xff1a; 人物模型的导入设置参数&#xff1a; Skinned Mesh Renderer组件详解: Skinned Mesh Renderer工作原理 设置Skinned …

【STM32CubeIDE】硬件IIC+AHT20使用

前言 本文主要介绍STM32CubeIDE配置硬件IIC驱动AHT20模块&#xff0c;实现温湿度读取并用串口打印显示在上位机&#xff1b; 软件平台&#xff1a;STM32CubeIDEHAL库 硬件环境&#xff1a;STM32F103ZET6(正点原子战舰V3)AHT20模块 目录 前言AHT20简介软件程序CubeIDE设置AHT2…

ChatGPT/AI助力学术写作-辅助翻译及润色

Nature期刊中的Career column专栏在4月份的时候发表了关于Chatgpt帮助学术写作的几点建议。 一、Three ways ChatGPR helps me in my academic writing 1、优化学术写作 不管使用哪一种AI工具&#xff0c;精确清晰的指令可以帮助使用者得到更好的反馈。例如&#xff1a;I’m w…

【LINUX】内核源码文件系统调用相关摸索

首先&#xff0c;先看看想测试那个系统调用&#xff0c;在应用层&#xff0c;如果使用C语言编程一般我们一来就是open函数&#xff0c;实际在测试的时候&#xff0c;直接用touch xxx.txt然后 echo "xxx" >> xxx.txt&#xff0c;这样就完成了文件创建和写文件的…

MemManage_Handler 问题的解决思路

1、问题 在做一个安全类项目时发现&#xff0c;软件在运行一段时间后会进入"MemManage_Handler",遂开始了一系列查找。 2、解决 &#xff08;1&#xff09;查看堆栈数据 查堆栈的数据&#xff0c;发现堆栈也被破坏了&#xff0c;看不出来是执行哪个任务执行导致的…

零基础想学编程,选择哪一门语言更好就业?(非常详细)零基础入门到精通,收藏这一篇就够了_c#就业方向

编程语言的用途广泛&#xff0c;它们各自在不同的领域和应用场景中发挥着重要作用。 零基础初学者在选择编程语言时&#xff0c;可以从就业方向入手选择。 【一一帮助安全学习&#xff0c;所有资源获取处一一】 ①网络安全学习路线 ②20份渗透测试电子书 ③安全攻防357页笔记 …

基于Java微信小程序同城家政服务系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f;感兴趣的可以先收藏起来&#xff0c;还…