神奇的RPC其实并不神奇

RPC,是Remote Procedure Call的简称,中文翻译是远程过程调用。伴随着分布式系统的诞生,RPC也就应运而生了。那么,远程过程调用在实际业务环境中是怎么体现的呢,我们如果仅仅只是知道概念那是完全不够的。

一、普通的接口调用

例如,我有一个Weather接口的rain()方法,只要一调用就能查到目前正在下雨的城市信息,在WeatherImpl实现类中则具体实现了过程。

public interface Weather{
	List<City> rain();
}

public class WeatherImpl implement Weather{
	List<City> rain(){
		// 此处省略实现过程
		xxx;
		return list
	}
}

普通调用过程自然是new一个实现类,并且用该实现类对象的引用再去调用对应的方法,即:

WeatherImpl w = new WeatherImpl();
w.rain();

这就是基本的本地调用。

二、远程的接口调用

这个时候,我要将这个接口开放给外界使用,让他们也能调用到Weather接口中的rain()方法。抛开本文的主角RPC,其实我们知道通过Restful风格的调用入口,例如我将该实现方法同样封装进Controller层,并将调用地址设为:/weather/rain。部署完成之后,我们就能够通过:ip:+port/weather/rain的方式访问到我们本地的方法。
那么问题来了,我们在A系统中有Weather接口,而在B系统中没有Weather接口,我们每次都要通过发送http请求来互相调用的话,那就太劳神了。
这个时候我们就想,要是在另一个提供也能像本地调用接口一样直接new一个对象的形式来进行调用就好了。
我们的主角就此登场。如果不借助RPC,那么我们绝对是不可能实现的,因为Weather对象的地址在A系统,而我们想在B系统new一个Weather地址引用是根本做不到的,而RPC其实就是讲Restful风格的api接口进行进一步的封装,使得调用者感知不到远程调用。
我们进行总结:

  • RPC主要为了应对分布式服务之间的调用
  • 远程调用要与本地调用一样方便,且让调用者感觉不到远程调用

三、实现一个简单的RPC

// TODO

参考资料:

发布了58 篇原创文章 · 获赞 91 · 访问量 34万+

猜你喜欢

转载自blog.csdn.net/imVainiycos/article/details/102689985