如何理解RPC(远程过程调用)?

**RPC(Remote Procedure Call)**是指远程过程调用,分布式促使了RPC的诞生。

本地过程调用:比如你妈现在在家,需要扫地,她自己拿起扫帚开始打扫。
远程过程调用:比如你妈现在不在家,需要扫地,她发微信告诉你,你拿起扫帚开始打扫。

使用RPC要解决的问题:

  1. 解决分布式系统中,服务之间的调用问题。
  2. 远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑。

比如有一个计算器的接口Counter,以及它的实现类CounterImpl,要使用Counter的minus方法做减法,通过new CounterImpl().minus(3, 1)实现。因为在同一个地址空间,所以这就是本地函数调用。
如何理解RPC(远程过程调用)?_第1张图片

基于高性能和高可靠等因素的考虑,可以将系统改为分布式应用,把很多可以共享的功能都单独拎出来。比如上面说到的计算器,你可以单独把它放到一个服务里头,让别的服务去调用它,这就是远程过程调用。
如何理解RPC(远程过程调用)?_第2张图片
服务A要调用服务B中CalculatorImpl的add方法:

  • 服务B暴露一个Restful接口,服务A通过调用Restful接口来间接调用CalculatorImpl的add方法
  • 代理模式,结合Spring IoC一起使用,在calculator对象上添加@Reference注解,通过Spring注入calculator对象,可以让使用者感知不到远程过程调用

RPC vs Restful
RPC是面向过程,Restful是面向资源。RPC涉及的范围更广。
以RPC风格的URL和Restful风格的URL做比较:
RPC风格:

/queryStudent?studentId=123

Restful风格:

Get  
/student/123

RPC是一种编程模型,并没有规定要如何实现,实现一个RPC可能不算很难,难的是实现一个高性能高可靠的RPC框架。

谈起RPC,就必然会有分布式,那么一个服务就有可能会有多个实例,调用时,又该如何获取实例的地址呢?

这时候就需要一个服务注册中心,比如在Dubbo里头,就可以使用Zookeeper作为注册中心,在调用时,从Zookeeper获取服务的实例列表,再从中选择一个进行调用。

然后需要使用负载均衡选择一个实例调用。

调用时都去注册中心查询实例列表会使效率降低,于是就有了缓存,有了缓存之后就应该要考虑缓存的更新问题…等等。。。。

你可能感兴趣的:(计算机类名词解释)