RPC通信原理以及项目的技术选型

news2024/12/30 3:07:59

目录

1.引言

2、RPC通信原理

3.图示解析

4.再举个例子


1.引言

根据上一篇博客《单机,集群和分布式》的举的例子。
我们最终合理地通过对大型软件的合理划分,划分成不同模块,按需求(硬件需求,高并发需求)进行分布式,一台机器上运行的模块不能单独构成聊天系统,所有机器上的不同模块构成一个聊天系统。解决一些单机和集群服务器所遇到的一些问题

即不同进程,不同机器上模块的调用

项目要解决的问题,把分布式环境中,不同分布式节点或者是同一分布式节点,但不同进程里面模块之间方法的调用,以及底层的一些调用细节,用这个项目来完成,不用用户操心。

2、RPC通信原理

RPC(Remote Procedure Call Protocol)远程过程调用协议

分布式的通信:构建一个服务器系统,由很多不同的模块组成,这些模块进行了独立的部署,模块和模块之间的通信,这个模块调用另一个模块的方法,这就是分布式通信,也叫做RPC通信。也是我们分布式部署需要主要解决的问题。

黄色部分:设计rpc方法参数的打包和解析,也就是数据的序列化和反序列化,使用Protobuf。
绿色部分:网络部分,包括寻找rpc服务主机,发起rpc调用请求和响应rpc调用结果,使用muduo网络库和zookeeper服务配置中心(专门做服务发现)。
mprpc框架主要包含以上两个部分的内容。

3.图示解析

解析上图(RPC通信图解)
左边的caller,就是调用者。相当于下图的server1这个角色,用户管理,用户发起的一个远程的方法调用,获取当前指定用户id的好友列表信息。上图的local call对应的状态就是server1用户管理的这个进程调用GetUserFriendList函数,这是一个远程的RPC方法,不是一个本地在当前进程内的方法,就要去查找,在哪台机器上有这个远程的RPC方法。

首先得去服务配置中心查找,知道这个服务在server2里面,现在就是要把这个函数调用的请求通过网络发布到server2中,server2还得知道你要调用哪个函数!因为server2有很多模块,很多RPC方法。所以我们在传输的时候要把函数的标识(RPC方法的名字),方法在远端调用涉及到的参数进行打包。这就是对应上图的pack argument,打包参数,我们称作序列化。

序列化好之后,我就可以把这个请求通过网络transmit传送过去到server2中,网络是用C++实现的开源的muduo库。

远端接收到从网络接收到RPC调用请求(对应上图的receive),从网络底层上报上来,上报上来的是打包完成后的参数,这时要把从网络接收的打包的参数解包,对应上图的unpack argument,我们称作反序列化,就是把从网络的接收的字节流反序列化成具体的RPC调用的细节信息,方法,标识,参数,然后就到server2上了,对应上图的callee。然后到call


此时,RPC的请求已经到达server2的好友管理的获取好友列表的函数上了,就是在机器的这个进程里执行这个list< User>GetUserFriendList函数,对应上图的work(工作,执行),然后return 返回值,不管是正常运行还是出错了,return 返回相应的东西,这时进行pack result,打包结果,即序列化成字节流,通过网络muduo库发到caller端。caller端收到后,即对应上图的receive,这个网络就会把字节流上报到User-stub上,把字节流反序列化,即对应上图的unpack result,反序列化后,就可以得到具体的应用程序可以认识的一个描述RPC调用方法请求的结果的数据,相当于上图的local return。


在分布式通信框架中,都有桩,stub就是“桩“,我们可以认为就是一个”代理“,因为RPC调用的发起方只需要关心业务,不用关心底层的网络上的RPC方法,通信的细节,细节都包装在stub,做数据的序列化和反序列化,网络数据的收发。执行RPC请求的这一端也是如此。执行网络的收发数据,执行数据的序列化和反序列化。

4.再举个例子

RPC方法:bool login(string name,string pwd);
调用这个方法,是远程调用另一个进程。

首先,我们在Caller的User,local call,发起login();
需要框架的User_stub把我想调用的RPC的方法的方法名字,参数序列化,打包起来形成字节流,通过网络进行发送(使用muduo库),发送到对端以后,对端receive,接收从网络得到的字节流,然后在Server-stub把字节流反序列化出来,然后根据解包的参数进行调用相应的函数。work调用执行,return登录执行的结果true或者false,有可能在执行的时候函数执行出现问题,我们可以在返回的东西中还可以加一些响应,响应码是0,表示这个方法在远端执行是正常的,如果执行错误,就返回一些信息(响应码,错误码,错误信息,具体的返回值)。然后经过打包(pack result)成字节流通过网络发送(muduo库)到对端。然后端端receive,在User-stub解包,反序列化,上报到应用程序,就知道了,根据返回的信息进行相应的操作,如果没错误码,就可以放心的读返回值了,如果有错误码,意味着RPC方法在调用时出错了,就直接读错误消息描述就可以了。

我要完成的 基于RPC的分布式网络通信框架 项目就是完成下图的所圈起来的部分

黄色部分,我将用protobuf完成,json也可以完成,但是protobuf相当于json的好处:
1、protobuf是二进制存储,xml和json都是文本存储!
二进制省空间!
protobuf在携带数据的时候,带宽的资源的利用率是高的。protobuf携带同样的数据,占用的字节少!
2、protubuf不需要存储额外的信息
json的存储是:key-value
name :“zhangsan" pwd:“123456”
而protobuf的存储是:“zhangsan" “123456”,它只存储有效数据!!!

绿色部分我将用muduo网络库和zookeeper服务配置中心(专门做服务发现)完成

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

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

相关文章

【arm扩容】docker load -i tar包 空间不足

背景&#xff1a; 首先我在/home/nvidia/work下导入了一些镜像源码tar包。然后逐个load进去。当我 load -i dev-aarch64-18.04-20210423_2000.tar包的时候&#xff0c;出现 Error processing tar file(exit status 1): write /9818cf5a7cbd5a828600d9a4d4e62185a7067e2a6f2ee…

Nikto一键扫描Web服务器(KALI工具系列三十)

目录 1、KALI LINUX 简介 2、Nikto工具简介 3、信息收集 3.1 目标IP&#xff08;服务器) 3.2kali的IP 4、操作实例 4.1 基本扫描 4.2 扫描特定端口 4.3 保存扫描结果 4.4 指定保存格式 4.5 连接尝试 4.6 仅扫描文件上传 5、总结 1、KALI LINUX 简介 Kali Linux 是一…

若以框架学习(3),echarts结合后端数据展示,暂时完结。

前三天&#xff0c;参加毕业典礼&#xff0c;领毕业证&#xff0c;顿时感到空落落的失去感&#xff0c;没有工作&#xff0c;啥也没有&#xff0c;总感觉一辈子白活了。晚上ktv了一晚上&#xff0c;由于我不咋个唱歌&#xff0c;没心情&#xff0c;听哥几个唱了一晚上周杰伦&am…

gbase8s关于客户端和数据库连接的方式和应用建立连接的简单线索分工

应用和数据库的连接分为本地连接和远程连接&#xff0c;当应用程序和数据库在同一台服务器上为本地连接&#xff0c;不在一台服务器上为远程连接 1. 本地连接 本地连接三种方式&#xff1a; 通过共享内存消息系统&#xff1a;应用和数据库在同一台服务器上&#xff0c;应用程…

都2024年了,还有人不懂动态代理么?

文章目录 一、定义二、静态代理三、动态代理1. JDK代理1.1 JDK代理实现流程1.2 动态生成的类字节码 2. Cglib代理2.1 Cglib实现流程 四、总结 一、定义 静态代理和动态代理都反映了一个代理模式&#xff0c;代理模式是一种经典的设计模式&#xff0c;常用于为其他对象提供一种…

字节跳动:从梦想之芽到参天大树

字节跳动掌舵人&#xff1a;张一鸣 2012年&#xff1a;梦想的起点&#xff1a;在一个阳光明媚的早晨&#xff0c;北京的一座普通公寓里&#xff0c;一位名叫张一鸣的年轻人坐在电脑前&#xff0c;眼中闪烁着坚定的光芒。他的心中有一个梦想——通过技术改变世界&#xff0c;让…

AcWing 1801:蹄子剪刀布 ← 模拟题

【题目来源】https://www.acwing.com/problem/content/1803/【题目描述】 你可能听说过“石头剪刀布”的游戏。 这个游戏在牛当中同样流行&#xff0c;它们称之为“蹄子剪刀布”。 游戏的规则非常简单&#xff0c;两头牛相互对抗&#xff0c;数到三之后各出一个表示蹄子&#x…

32 - 判断三角形(高频 SQL 50 题基础版)

32 - 判断三角形 select *,if(xy>z and xz>y and zy > x,Yes,No) triangle fromTriangle;

webpack处理js资源10--webpack入门学习

处理 js 资源 有人可能会问&#xff0c;js 资源 Webpack 不能已经处理了吗&#xff0c;为什么我们还要处理呢&#xff1f; 原因是 Webpack 对 js 处理是有限的&#xff0c;只能编译 js 中 ES 模块化语法&#xff0c;不能编译其他语法&#xff0c;导致 js 不能在 IE 等浏览器运…

QtCreator/VS中制作带有界面的动态库

1、首先创建动态库项目 class UNTITLED25_EXPORT Untitled25 {public:Untitled25(); };2、直接右键创建同名窗口类进行覆盖 3、引入global头文件并添加到处宏</

[机器学习算法]支持向量机

支持向量机&#xff08;SVM&#xff09;是一种用于分类和回归分析的监督学习模型。SVM通过找到一个超平面来将数据点分开&#xff0c;从而实现分类。 1. 理解基本概念和理论&#xff1a; 超平面&#xff08;Hyperplane&#xff09;&#xff1a;在高维空间中&#xff0c;将数据…

Git学习2 -- VSCode中的Git

看了下&#xff0c;主要的插件有3个。自带的Source Control。第1个是Gitlens&#xff0c;第2个是Git Graph。第三个还有个git history。 首先是Source Control。界面大概是这样的。 还是挺直观的。在第一栏source control&#xff0c;可以进行基本的git操作。主要的git操作都是…

qt开发-11_Dialog 仿苹果支付界面

QDialog 是 Qt 框架中用于创建对话框的一个基类。对话框是一种特殊类型的窗口&#xff0c;通常用于短暂的交互和信息交换&#xff0c;如接收用户输入、显示消息、询问用户决定等。QDialog 提供了一种方便的方式来实现这些功能&#xff0c;并能够控制用户与其他窗口的交互性&…

Android模拟器linux内核的下载,编译,运行,驱动开发测试

Android模拟器linux内核的下载&#xff0c;编译&#xff0c;运行&#xff0c;内核模块开发 1.下载适合Android模拟器的内核 git clone https://aosp.tuna.tsinghua.edu.cn/android/kernel/goldfish.git git branch -a git checkout android-goldfish-4.14-gchips 新建一个目录…

喜报!极限科技新获得一项国家发明专利授权:“搜索数据库的正排索引处理方法、装置、介质和设备”

近日&#xff0c;极限数据&#xff08;北京&#xff09;科技有限公司&#xff08;简称&#xff1a;极限科技&#xff09;新获得一项国家发明专利授权&#xff0c;专利名为 “搜索数据库的正排索引处理方法、装置、介质和设备”&#xff0c;专利号&#xff1a;ZL 2024 1 0479400…

谈谈跳台阶算法的记忆法和编程理念|青蛙跳台阶|递归|动态规划|算法|程序员面试|Java

简介 为什么会写这篇文章&#xff1f; 因为鄙人刷过此题多次&#xff0c;每次觉得自己会了&#xff0c;可下次还是不能一下子写出题解&#xff0c;故记录下我是如何记忆此题的&#xff0c;并且探索一些编程理念。 题目 一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级…

俄语打招呼和问候的12种表达方式,柯桥俄语培训

- Как дела ? 近况如何&#xff1f; -Нормально, а ты как? 还行吧&#xff0c;你呢&#xff1f; Vol.2 -Как себя чувствуете? 你感觉如何&#xff1f; -Все замечательно! 一切都非常棒。 Vol.3 -Ка…

详解 Macvlan 创建不同容器独立跑仿真(持续更新中)

一、概念介绍 1.1 什么是macvlan macvlan是一种网卡虚拟化技术&#xff0c;能够将一张网卡&#xff08;Network Interface Card, NIC&#xff09;虚拟出多张网卡&#xff0c;这意味着每个虚拟网卡都能拥有独立的MAC地址和IP地址&#xff0c;从而在系统层面表现为完全独立的网络…

颠覆传统编程:用ChatGPT十倍提升生产力

我们即将见证一个新的时代&#xff01;这是最好的时代&#xff0c;也是最坏的时代&#xff01; 需求背景 背景&#xff1a; 平时会编写博客&#xff0c;并且会把这个博客上传到github上&#xff0c;然后自己买一个域名挂到github上。 我平时编写的博客会有一些图片来辅助说明的…

拦截器Interceptor

概念&#xff1a;是一种动态拦截方法调用的机制&#xff0c;类似于过滤器。Spring框架中提供的&#xff0c;用来动态拦截方法的执行。 作用&#xff1a;拦截请求&#xff0c;在指定的方法调用前后&#xff0c;根据业务需要执行预先设定的代码。