有位工作6年的小伙伴,面试的时候被问到这样一道题,说谈你对RPC的理解。在分布式微服务架构中,远程通信是最基本的需求。常见的远程通信方式有基于REST架构的HTTP协议,以及基于RPC协议的RPC框架。今天,我给大家分享一下我的理解。
1、什么是RPC
首先,给大家介绍一下什么是远程调用。很多小伙伴会误以为,远程调用是指跨越物理距离上的远程。实际上,准确地说,远程调用是指跨进程的功能调用。
跨进程,可以理解为同一台计算上的多个进程、多个JVM或者多台计算之间的进程。
那什么是RPC呢?RPC的全称是Remote Procedure Call,翻译过来叫远程过程调用。
它是一种通过网络从远程计算机程序上获取服务,而不需要了解代码网络技术实现的一种协议。凡是符合这种协议的框架,都可以称之为RPC框架。
通俗理解就是,A计算机提供一个服务,B计算机可以像调用本地服务一样去调用A计算机提供的服务,这就是RPC的主要作用。
其实,RPC的应用在很早之前就出现了。在40年以前,也就是1981年的时候,由一家叫做Nelson的公司提出,并把它应用到了分布式系统之间的通信协议。
2、RPC协议
要实现RPC,需要通过网络进行数据传输,并且对调用的过程进行封装。现在比较流行的RPC框架一般都是采用TCP协议作为底层的传输协议。当然,其他协议也是可以的,比如UDP。
RPC协议,强调的是过程调用,调用的过程对于用户来说是完全透明的,用户不需要关心调用细节。可以像调用本地服务一样去调用远程服务。
我们来看这样一张图。
一个完整的RPC协议包含了四个组件,分别是Client、Server、Client Stub和Sever Stub。
Client客户端表示服务的调用方。
Sever服务端是真正的服务提供方。
Client Stub表示客户端存根,专门用来存放服务端的地址信息,再将客户端的请求参数打包成网络消息,也就是序列化,然后通过网络远程发送给服务提供方。
Server Stub表示服务端存根,用来接收客户端发送过来的消息,然后,解析消息内容,也就是反序列化,并且调用本地方法。
3、RPC的应用场景
RPC在分布式系统中,有非常广发的应用,我给大家总结为5个方面:
1、分布式系统网络通讯
2、分布式子系统之间的服务治理
3、分布式负载均衡和流控
4、服务发现与注册
5、构建分布式调试环境
【导航条:RPC框架】
(转场,屏幕黑底白字,正中央出现“4 RPC框架)
4、RPC框架
在互联网应用开发中,随着业务的复杂度增加,一般都会采用分布式架构。分布式架构的核心,就是利用多台普通的计算机组成一个庞大的复杂计算网络,提供高并发、高性能、高可用的系统能力支撑。
在分布式架构中,原本的单体应用服务被拆分成多个独立部署的服务,分布式在计算机网络上,这些服务必然,需要通过网络进行数据通信和交互。而RPC框架,就是解决在分布式架构中,各个服务之间的网络通信问题的框架。
在Java应用中,JDK 1.1版本的时候就提供了对RPC的支持框架,叫做RMI。由于RMI不能实现跨域语言的远程调用。
后面,广发采用WebService来实现远程调用,但是,WebService需要定义非常复杂的Scheme文件,导致无效数据内容过于臃肿。
之后,就被HTTP加JSON的方案所代替了。
RPC发展到现在,实现的方式也非常多样,但是基本都实现了跨语言的远程调用。
一般来说,RPC框架都应用于大型企业,只有在业务复杂度和用户体量都比较大的时候,需要对服务进行解耦,从而达到扩展性强、部署灵活的目的。目前比较流行的开源RPC框架有Goole的gRPC、Facebook的Thrift、Alibaba的Dubbo。这些框架除了提供基础的远程通信功能以外,还会在系统性能、传输效率、服务治理等方面做出一些优化设计。
比如,阿里开源的RPC框架Dubbo就提供了非常丰富的服务治理功能。
好了,相信各位小伙伴对于RPC又有了一个更加清晰的认识和了解。面试的时候,如果被问到RPC的问题,是不是知道怎么了呢?以上就是我对RPC的理解。