浅谈RPC调用

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

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

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

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

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

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

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

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

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; background-color: #ffffff }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; background-color: #ffffff; min-height: 13.0px }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #5e34ff; background-color: #ffffff }
span.s1 { }
span.s2 { color: #5e34ff }

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

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

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

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

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

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

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

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

    

      

原文地址:https://www.cnblogs.com/linlinismine/p/9205676.html

时间: 2024-11-05 22:07:48

浅谈RPC调用的相关文章

浅谈RPC和RestFul

RPC主要是基于TCP/IP协议的,而HTTP服务主要是基于HTTP协议的,我们都知道HTTP协议是在传输层协议TCP之上的,所以效率来看的话,RPC当然是要更胜一筹啦!下面来具体说一说RPC服务和HTTP服务. OSI网络七层模型 在说RPC和HTTP的区别之前,我觉的有必要了解一下OSI的七层网络结构模型(虽然实际应用中基本上都是五层),它可以分为以下几层: (从上到下) 第一层:应用层.定义了用于在网络中进行通信和传输数据的接口: 第二层:表示层.定义不同的系统中数据的传输格式,编码和解码

浅谈递归调用的个人领悟

从大一开始学c,就不是挺理解递归的,最近突然有所体会: 递归调用中递归调用的函数可以把它想象成为一个树的结点,在函数中调用自身就是一个分支,直到出口条件时就是这棵树的叶子结点.叶子的值便是出口返回的值.最后从叶子结点按照你所调用的方法向上返回值,最终结束递归调用.

浅谈Windows平台下C++调用静态链接库的方式

浅谈Windows平台下C++调用静态链接库的方式 1. 什么是静态链接库?为什么要用静态链接库? 维基百科上关于静态库的解释是这样的:在计算机科学里,静态库(英语:Static library, Statically-linked library),或称静态库,是一个外部函数与变量的集合体.静态库的文件内容,通常包含一堆程序员自定的变量与函数,其内容不像动态链接库那么复杂,在编译期间由编译器与连接器将它集成至应用程序内,并制作成目标文件以及可以独立运作的可执行文件. 由上面的解释可以很清楚的看

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

如何使用Netty进行RPC服务器的开发,技术原理涉及如下:1.定义RPC请求消息.应答消息结构,里面要包括RPC的接口定义模块,如远程调用的类名.方法名.参数结构.参数值等信息. 2.服务端初始化的时候通过容器加载RPC接口定义和RPC接口实现类对象的映射关系,然后等待客户端发起调用请求. 3.客户端发起的RPC消息通过网络,以字节流的方式发送给RPC服务端,RPC服务端接收到字节流的请求之后,去对应的容器里面,查找客户端接口映射的具体实现对象. 4.RPC服务端找到实现对象的参数信息,通过反

再谈序列化之rpc调用失败和jackson序列化时不允许Map中的key为null

最近遇到了两个序列化相关的问题,比较典型,备忘特此留笔. 1.rpc调用时未进行序列化而导致的rpc调用失败 使用dubbo框架在进行rpc调用的时候,出现了下面的问题,原因是因为接口参数中的NoSerialReqDto类没有实现Serializable接口,没有进行序列化导致的. Caused by: java.lang.IllegalStateException: Serialized class com.your.package.domain.NoSerialReqDto must imp

浅谈hadoop中mapreduce的文件分发

最近在做数据分析的时候,需要在mapreduce中调用c语言写的接口,此时就需要把动态链接库so文件分发到hadoop的各个节点上,原来想自己来做这个分发,大概过程就是把so文件放在hdfs上面,然后做mapreduce的时候把so文件从hdfs下载到本地,但查询资料后发现hadoop有相应的组件来帮助我们完成这个操作,这个组件就是DistributedCache,分布式缓存,运用这个东西可以做到第三方文件的分发和缓存功能,下面详解: 如果我们需要在map之间共享一些数据,如果信息量不大,我们可

蚂蚁变大象:浅谈常规网站是如何从小变大的(九)(转)

原文:http://blog.sina.com.cn/s/blog_6203dcd60100y2gd.html          [第十二阶段 :传输协议.接口.远程调用]   这一部分主要谈谈关于协议.接口和远程调用相关的内容.本来这一部分应该在之前就有比较详细的讨论,不过我放到后面来,足见其重要性.特别是在系统越来越多的时候,这几个东东直接决定了我们的开发速度和运维成本. 好,接下来我们一个个的看. 1.传输协议 到目前为止,在不同系统之间获取数据的时候,你是采用那种方式呢? 我们简单看一个

Web Service进阶(七)浅谈SOAP Webservice和RESTful Webservice

浅谈SOAP Webservice和RESTful Webservice REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性.REST提出设计概念和准则为: 1.网络上的所有事物都可以被抽象为资源(resource) 2.每一个资源都有唯一的资源标识(resource identifier),对资源的操作不会改变这些标识 3.所有的操作都是无状态的 REST简化开发,其架构遵循CRUD原则,该原则告诉我们对于资源(包括网络资源

浅谈REST API

浅谈REST API 说明: 本文部分内容根据其它网络文章编写,如有版权问题请及时通知. 背景 发迹于互联网的REST,在国内国外混得可谓是风生水起,如今又进入电信行业的视野,连TMF都将其作为战略项目Open Digital的一部分. 一种思维方式影响了软件行业的发展.REST软件架构是当今世界上最成功的互联网的超媒体分布式系统.它让人们真正理解我们的网络协议HTTP本来面貌.它正在成为网络服务的主流技术,同时也正在改变互联网的网络软件开发的全新思维方式. 引自:http://www.blog