RPC英文全称remote procedure call 翻译成中文的意思就是远程过程调用。RPC的出现其实主要是为了解决分布式系统间的通信透明性的问题。

那什么是分布式系统的通信透明性问题?这个问题就是指分布式系统间的相互调用其实是基本进程间的显式消息交换,然而,消息的发送和接收过程无法隐藏。而通信的隐藏对于分布式中实现访问的透明性是极为重要的。试想一下比如你要想查看一个订单详情,然后订单系统部署了三台机器。假设没有RPC,其它系统想通过调订单系统查询订单详情的信息,就必须知道订单系统部署机器的ip和端口,每个调用者必须关注订单系统新加或者下线和换机器部署等情景。试想这对调用者来说是有多蛋疼。换言之分布式系统通信就应该是透明的,这样调用者就不需要关心调用的是那台机器上面的服务。在调用者的角度这个远程服务应该和调用本地服务一样是一个单一稳定可靠的服务。

 基于这样的背景有人就提出了一种与传统方法截然不同的通信手段:不同机器上的进程是允许相与调用的,当机器A上的进程调用机器B上的进程时,A上的调用进程被挂起,而B上的被调用进程开始执行。调用方可以通过使用参数将信息传送给被调用方,然后可以通过传回的结果得到信息。编程人员看不到任何消息传递过程。这个方法就被程为远程过程调用RPC.

     在介绍RPC之前我们先来看常规过程调用。比如我们定义一个c语言的方法

count = read(fd,buf,nbytes); 这里fd为一个整形数,表示一个文件,buf为一个字符数组,用于存储读入的数据,nbytes为另一个整数,用于记录实际读入的字节数。当在主程序调用这个方法时实际的执行过程是先把参数压入堆栈中

然后程序读取堆栈里面的参数,执行系统的库函数,其中还包括执行线程从用户态到内核态的切换,执行完毕后又从内核态到用户态的转换过程。这些于调用者来说都是不可见和不用关心的。

RPC的设计思想其实与常规过程调用类似,屏蔽底层的细节使程序不知道调用的业务逻辑是在另一台机器上面处理的使其专注于自身业务逻辑处理。正常的RPC调用过程

举一个远程调用两个数求和的详细调用过程

这里面出现了两个名词客户端存根、服务端存根 其实客户端存根指的就是我们现在RPC框架中的client端,服务端存根就是server端,只是不叫法而已。客户端存根的作用是把请求的参数以约定的通讯协议打包好发送给服务端然后解析服务端返回消息,服务端存根就是根据收到的请求信息执行相应的业务逻辑调用并把结果返回客户端。要定义一个RPC框架首先要定义好通讯格式,因为最络从网络层解析出来的数据都是以字符串的形式解析出来的.我们需要从这一串字符中解析出调用哪个服务,服务入参是什么。

  一般来说客户端存根会把调用类名称传给服务端,服务端存根根据这个名称找到对应的service的映射,就知道调哪个服务了。所以服务端存根要保存一份service的映射关系。同样客户端存根收到响应后会唤醒之前调用的线程或者等待之前的线程运行处理返回的结果。 

解决了RPC的调用问题,现在还要解决的一个关键问题是,客户端怎么知道调用哪一台机器上的服务。这就需要引入一个中间的第三者目标服务器。

服务提供者向目标服务器注册服务,客户机从目标服务器(一种叫法叫服务注册中心)中获取可调用的机器列表。如果有用过类似dubbo这样的RPC框架是不是对这个图很熟悉?因为所有的RPC架构的原理大多都是类似的。服务提供者往目标服务器里面通常会注册机器的ip和端口信息。

  下面我们来谈下RPC的好处和注意的地方。

        好处:屏蔽了底层通讯的复杂性,在分布式系统中提供了通讯的透明性。

        需要注意的地方:RPC是点对点的通讯方式,要求通讯两端必须同时运行,当其中一端挂了就会导致通常异常,并且调用者一般会阻塞住等待结果的返回,性能相对不是很高,当然也有异步RPC,超时重试情况下服务端提供者需要做好服务幂等性处理。相对于RPC而言采用了面向消息通讯模型的架构比如MQ则不要求通讯两端同时运行,发送消息时也不需要阻塞等待处理结果的返回通讯性能就高出很多。

        最后我们总结一下:RPC调用是指不同机器间的进程通讯。程序不需要关心某个远程服务是在哪台机器上执行的,远程服务调用就和调用本地服务一样。要在不同机器间进行通讯我们需要知道通讯机器的ip和端口号。ip帮助我们定位是哪一台机器,端口号帮我们定位是机器上的哪一个进程。RPC的出现使用得机器的进程通讯透明化,这在分布式系统中是很重要的。RPC调用架构中客户端和服务端都和一个叫服务注册中心的第三方通讯。

    

      

浅谈RPC调用的更多相关文章

  1. 浅谈Eclipse调用Tomcat服务的原理

    浅谈Eclipse调用Tomcat服务的原理 转:http://www.thinksaas.cn/group/topic/341645/ 转:http://www.173it.cn/Html/?581 ...

  2. 浅谈RPC框架

    RPC(Remote Promote Call) RPC(Remote Promote Call):一种进程间通信方式.允许像调用本地服务一样调用远程服务. RPC框架的主要目标就是让远程服务调用更简 ...

  3. 浅谈RPC与Http

    什么是RPC,RPC原理是什么? 什么是RPC? RPC(Remote Procedure Call)远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.比如两个 ...

  4. 浅谈C++调用C#的DLL程序方法

    把C#编译成DLL或者Axtive控件,再由C调用!比如使用C++调用C#的DLL. SwfDotNet是.net下输出flash的类库.SwfDotNet是C#编写的,作者的C#水平,真是令我佩服. ...

  5. 从Java继承类的重名static函数浅谈解析调用与分派

    在java中,static成员函数是否可以被重写呢? 结论是,你可以在子类中重写一个static函数,但是这个函数并不能像正常的非static函数那样运行. 也就是说,虽然你可以定义一个重写函数,但是 ...

  6. c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程

    c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...

  7. 浅谈WebService开发三(动态调用WebService)转

    在前两讲里,我已经向大家演示了如何使用WebService.同步, 异步调用WebService,而在实际开发过程中,可能会有多个WebService接口供你选择,而在程序执行过程中才决定使用哪一个 ...

  8. 浅谈,seata在使用feign-url通过域名调用时分布式事务不生效的问题及解决

    浅谈,seata在使用feign-url通过域名调用时分布式事务不生效的问题及解决 ​ 在前几个月时,我们项目出现了分布式事务的问题,那么什么是分布式事务问题呢,简单的说,我们有俩服务A和B,它们对应 ...

  9. 浅谈如何使用Netty开发高性能的RPC服务器

    如何使用Netty进行RPC服务器的开发,技术原理涉及如下:1.定义RPC请求消息.应答消息结构,里面要包括RPC的接口定义模块,如远程调用的类名.方法名.参数结构.参数值等信息. 2.服务端初始化的 ...

随机推荐

  1. 关于《汇编语言(王爽)》程序6.3使用16个dw 0的问题

    在学习王爽老师<汇编语言>的第6.2节时,在程序6.3代码中,给出了如下的代码: assume cs:code code segment dw 0123h, 0456h, 0789h, 0 ...

  2. SQL多表联合查询

    通过连接运算符可以实现多个表查询.连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志. 在关系数 据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放 ...

  3. vscode常用快捷键和插件(持续更新),以及一些常用设置的坑和技巧

    一 常用快捷键 ctrl+shift+p:  打开命令面板,最常用了 ctrl+p: 搜索窗口: 直接输入文件名,跳转到文件 > 可以进入 Ctrl+Shift+P 模式 ? 列出当前可执行的动 ...

  4. 简单透彻理解JSONP原理及使用

    首先提一下JSON这个概念,JSON是一种轻量级的数据传输格式,被广泛应用于当前Web应用中.JSON格式数据的编码和解析基本在所有主流语言中都被实现,所以现在大部分前后端分离的架构都以JSON格式进 ...

  5. 【黑客免杀攻防】读书笔记2 - 免杀与特征码、其他免杀技术、PE进阶介绍

    第3章 免杀与特征码 这一章主要讲了一些操作过程.介绍了MyCCL脚本木马免杀的操作,对于定位特征码在FreeBuf也曾发表过类似工具. VirTest5.0特征码定位器 http://www.fre ...

  6. C++ 字符串的编码

    转载链接:https://www.cnblogs.com/akb48/p/5439154.html windows平台 char 表示单字符,占用一个字节 wchar_t 表示宽字符,占用两个字节 L ...

  7. MR室内室外用户区分

    mro_view_details_year中v3字段 1:室外用户 0:室内用户 主小区是室内站 主小区信号>-90dBm ==> 室内 主小区信号>-100dBm &&am ...

  8. 腾讯云启动数据库进程,提示No such host is known

    回想一下,系统是否切换过外网IP,切换过则检查/etc/hosts文件中IP和主机名对应关系 现象:出错前一直做域名解析

  9. [学习笔记]Java的public,protected,private,缺省的作用域

    0.引言 Java的访问指示符public,protected,private,缺省可以用来修饰类和方法. 1.作用域如下 具体如下: 作用域       当前类    同一package   子孙类 ...

  10. Android动态控制状态栏显示和隐藏

    记得之前有朋友在留言里让我写一篇关于沉浸式状态栏的文章,正巧我确实有这个打算,那么本篇就给大家带来一次沉浸式状态栏的微技巧讲解. 其实说到沉浸式状态栏这个名字我也是感到很无奈,真不知道这种叫法是谁先发 ...