**RPC(Remote Procedure Call)**是指远程过程调用,分布式促使了RPC的诞生。
本地过程调用:比如你妈现在在家,需要扫地,她自己拿起扫帚开始打扫。
远程过程调用:比如你妈现在不在家,需要扫地,她发微信告诉你,你拿起扫帚开始打扫。
使用RPC要解决的问题:
- 解决分布式系统中,服务之间的调用问题。
- 远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑。
比如有一个计算器的接口Counter,以及它的实现类CounterImpl,要使用Counter的minus方法做减法,通过new CounterImpl().minus(3, 1)实现。因为在同一个地址空间,所以这就是本地函数调用。
基于高性能和高可靠等因素的考虑,可以将系统改为分布式应用,把很多可以共享的功能都单独拎出来。比如上面说到的计算器,你可以单独把它放到一个服务里头,让别的服务去调用它,这就是远程过程调用。
服务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获取服务的实例列表,再从中选择一个进行调用。
然后需要使用负载均衡选择一个实例调用。
调用时都去注册中心查询实例列表会使效率降低,于是就有了缓存,有了缓存之后就应该要考虑缓存的更新问题…等等。。。。