当前位置: 首页 > news >正文

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

目录

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服务配置中心(专门做服务发现)完成

相关文章:

  • 颠覆传统编程:用ChatGPT十倍提升生产力
  • 仓颉语言的编译和构建
  • 喜报!极限科技新获得一项国家发明专利授权:“搜索数据库的正排索引处理方法、装置、介质和设备”
  • Day15 —— 大语言模型简介
  • Vitis Accelerated Libraries 学习笔记--OpenCV 安装指南
  • 华为MetaERP会不会是国产高端ERP的开始?
  • 三国之家网站的设计
  • 移远通信发布高性价比智能模组SC200P系列,赋能金融支付等行业智慧升级
  • 归并排序代码
  • SD卡无法读取?原因分析与数据恢复策略
  • 网络安全法视角下的等保测评重要性与合规路径
  • 一文带你了解集装箱箱号识别原理,OCR识别及深度学习
  • 鸿枫网盘,文件夹面包屑跳转实现功能
  • 卡码网KamaCoder 98. 所有可达路径
  • 【STM32-新建工程-CubeMX】
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • Angular 2 DI - IoC DI - 1
  • echarts花样作死的坑
  • MYSQL 的 IF 函数
  • unity如何实现一个固定宽度的orthagraphic相机
  • 力扣(LeetCode)21
  • 面试总结JavaScript篇
  • 区块链共识机制优缺点对比都是什么
  • 跳前端坑前,先看看这个!!
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • ​决定德拉瓦州地区版图的关键历史事件
  • ​人工智能书单(数学基础篇)
  • #AngularJS#$sce.trustAsResourceUrl
  • #include<初见C语言之指针(5)>
  • $().each和$.each的区别
  • (175)FPGA门控时钟技术
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (3) cmake编译多个cpp文件
  • (剑指Offer)面试题41:和为s的连续正数序列
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET delegate 委托 、 Event 事件
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .net 获取url的方法
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • [100天算法】-目标和(day 79)
  • [2016.7 day.5] T2
  • [BZOJ] 1001: [BeiJing2006]狼抓兔子
  • [Cloud Networking] Layer Protocol (continue)
  • [DEBUG] spring boot-如何处理链接中的空格等特殊字符
  • [HNOI2015]实验比较
  • [IDF]摩斯密码
  • [ios] IOS文件操作的两种方式:NSFileManager操作和流操作【转】
  • [JavaScript] JavaScript事件注册,事件委托,冒泡,捕获,事件流
  • [java基础揉碎]文件IO流
  • [SoftGrid 系列] Microsoft SoftGrid Server 安装篇
  • [windows phone 7开发]搭建WP7开发环境
  • [毕业设计]机器学习的运动目标跟踪-opencv