349-RPC通信原理和项目解析 朱雀 2022-09-01 13:49 139阅读 0赞 根据上一篇博客《单机,集群和分布式》的举的例子。 我们最终合理地通过对大型软件的合理划分,划分成不同模块,按需求(硬件需求,高并发需求)进行分布式,一台机器上的模块不能单独构成聊天系统,所有机器上的模块构成一个聊天系统。 **即不同进程,不同机器上模块的调用** **分布式的通信**:构建一个服务器系统,由很多不同的模块组成,这些模块进行了独立的部署,模块和模块之间的通信,这个模块调用另一个模块的方法,这就是分布式通信主要解决的问题。也叫做RPC通信。 ## RPC通信原理 ## **RPC(Remote Procedure Call Protocol)远程过程调用协议** ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xJTlpFWVU2NjY_size_16_color_FFFFFF_t_70] **黄色部分**:设计rpc方法参数的打包和解析,也就是数据的序列化和反序列化,使用Protobuf。 **绿色部分**:网络部分,包括寻找rpc服务主机,发起rpc调用请求和响应rpc调用结果,使用muduo网络库和zookeeper服务配置中心(专门做服务发现)。 **mprpc框架主要包含以上两个部分的内容。** ## 解析上图(RPC通信图解) ## **左边的caller**,就是调用者。相当于下图的server1这个角色,用户管理,用户发起的一个远程的方法调用,获取当前指定用户id的好友列表。上图的local call对应的状态就是server1用户管理的这个进程调用GetUserFriendList函数,这是一个远程的RPC方法,不是一个当前进程内的方法,首先得去服务配置中心查找,知道这个服务在server2里面,现在就是要把这个函数调用的请求通过网络发布到server2中,server2还得知道你要调用哪个函数!因为server2有很多模块,很多RPC方法。所以我们在传输的时候要把 **函数的标识**,**方法在远端调用涉及到的参数**进行打包。这就是对应上图的pack argument,打包参数,我们称作**序列化**。序列化好之后,我就可以把这个请求通过网络transmit传送过去到server2中,网络是用C++实现的开源的muduo库。 远端接收到从网络接收到RPC调用请求(对应上图的receive),从网络底层上报上来,上报上来的是打包完成后的参数,这时要把从网络接收的打包的参数解包,对应上图的unpack argument,我们称作反序列化,就是把从网络的接收的字节流反序列化成具体的RPC调用的细节信息,方法,标识,参数,然后就到server2上了,对应上图的call。 此时,RPC的请求已经到达server2的好友管理的获取好友列表的函数上了,就是在机器的这个进程里执行这个list< User>GetUserFriendList函数,对应上图的work(工作,执行),然后return 返回值,不管是正常运行还是出错了,return 返回相应的东西,这时进行pack result,打包参数,即序列化成字节流,通过网络muduo库发到caller端。caller端收到后,即对应上图的receive,这个网络就会把字节流上报到User-stub上,把字节流反序列化,即对应上图的unpack result,反序列化后,就可以得到具体的应用程序可以认得的一个描述RPC调用方法请求的结果的数据,相当于上图的local return。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xJTlpFWVU2NjY_size_16_color_FFFFFF_t_70 1] ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xJTlpFWVU2NjY_size_16_color_FFFFFF_t_70 2] **在分布式通信框架中,都有桩,stub就是“桩“,我们可以认为就是一个”代理“,因为RPC调用的发起方只需要关心业务,不用关心底层的网络上的RPC方法,通信的细节,细节都包装在stub,做数据的序列化和反序列化,网络数据的收发。执行RPC请求的这一端也是如此。** ## 再举个例子 ## **RPC方法:bool login(string name,string pwd); 调用这个方法,是远程调用另一个进程。** ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xJTlpFWVU2NjY_size_16_color_FFFFFF_t_70 3] 首先,我们在Caller的User,local call,发起login(); 需要框架的User\_stub把我想调用的RPC的方法的方法名字,参数序列化,打包起来形成字节流,通过网络进行发送(使用muduo库),发送到对端以后,对端receive,接收从网络得到的字节流,然后在Server-stub把字节流反序列化出来,然后根据解包的参数进行调用相应的函数。work调用执行,return登录执行的结果true或者false,有可能在执行的时候函数执行出现问题,我们可以在返回的东西中还可以加一些响应,响应码是0,表示这个方法在远端执行是正常的,如果执行错误,就返回一些信息(响应码,错误码,错误信息,具体的返回值)。然后经过打包(pack result)成字节流通过网络发送(muduo库)到对端。然后端端receive,在User-stub解包,反序列化,上报到应用程序,就知道了,根据返回的信息进行相应的操作。 ## 我要完成的 基于RPC的分布式网络通信框架 项目就是完成下图的所圈起来的部分 ## ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xJTlpFWVU2NjY_size_16_color_FFFFFF_t_70 4] **黄色部分,我将用protobuf完成,json也可以完成,但是protobuf相当于json的好处:** **1、protobuf是二进制存储,xml和json都是文本存储!!!** **二进制省空间!** protobuf在携带数据的时候,带宽的资源的利用率是高的。protobuf携带同样的数据,占用的字节少! **2、protubuf不需要存储额外的信息,** json的存储是:key-value name :“zhangsan" pwd:“123456” 而protobuf的存储是:“zhangsan" “123456”,它只存储有效数据!!! **绿色部分我将用muduo网络库和zookeeper服务配置中心(专门做服务发现)完成。** [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xJTlpFWVU2NjY_size_16_color_FFFFFF_t_70]: /images/20220829/1d94bef68ad547e28cad404562eca71b.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xJTlpFWVU2NjY_size_16_color_FFFFFF_t_70 1]: /images/20220829/2c48ec904ebf4731ba263446f14430ab.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xJTlpFWVU2NjY_size_16_color_FFFFFF_t_70 2]: /images/20220829/431ffd59fb144b468e3b0a2bd0cd4dd3.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xJTlpFWVU2NjY_size_16_color_FFFFFF_t_70 3]: /images/20220829/56c34306288740acb09ca462fa3f69c2.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xJTlpFWVU2NjY_size_16_color_FFFFFF_t_70 4]: /images/20220829/6dabc6aba7bc49deb0fde8f84377b6b6.png
相关 由浅入深RPC通信原理实战 目录 1 背景知识 2 RPC概述 3 RPC框架实现要点 3.1 注册中心 3.2 代理技术 3.3 序列化技 小鱼儿/ 2024年03月22日 17:17/ 0 赞/ 17 阅读
相关 RPC通信基本原理 -- 浅析RPC远程过程调用基本原理 一、RPC基本概念 1.1、RPC简介 > RPC 的全称是 `Remote Procedure Call`是一种进程间通信方式。 > RPC只是一个概 Myth丶恋晨/ 2023年09月27日 09:01/ 0 赞/ 93 阅读
相关 简析RPC原理 什么是RPC > RPC(Remote Procedure Call):远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。比如两个 雨点打透心脏的1/2处/ 2022年11月06日 05:52/ 0 赞/ 211 阅读
相关 349-RPC通信原理和项目解析 根据上一篇博客《单机,集群和分布式》的举的例子。 我们最终合理地通过对大型软件的合理划分,划分成不同模块,按需求(硬件需求,高并发需求)进行分布式,一台机器上的模块不能单独 朱雀/ 2022年09月01日 13:49/ 0 赞/ 140 阅读
相关 WebViewJavascriptBridge和Cordova原理比较解析 WebViewJavascriptBridge是一个开源的Native和Web App的轻量级的交互框架。实现实现之前方法互调,传值等操作。我们的WebView 深藏阁楼爱情的钟/ 2022年04月21日 19:28/ 0 赞/ 187 阅读
相关 Dubbo原理简述一:RPC原理和Netty通信原理 一、RPC原理: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ib 梦里梦外;/ 2022年03月26日 05:07/ 0 赞/ 357 阅读
相关 前端路由原理和解析 什么是前端路由? 路由的概念来源于服务端,在服务端中路由描述的是 URL 与处理函数之间的映射关系。 在 Web 前端单页应用 SPA(Single Page Appl 今天药忘吃喽~/ 2022年01月31日 05:37/ 0 赞/ 237 阅读
相关 SeqGAN模型原理和代码解析 1、背景 GAN作为生成模型的一种新型训练方法,通过discriminative model来指导generative model的训练,并在真实数据中取得了很好的效果。 た 入场券/ 2022年01月05日 09:09/ 0 赞/ 340 阅读
相关 Dubbo--RPC原理、Netty通信 RPC原理 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9n 秒速五厘米/ 2021年08月26日 17:04/ 0 赞/ 381 阅读
还没有评论,来说两句吧...