面试准备——rpc面试题

https://www.jianshu.com/p/28e48e5f9c73程序员

1 什么是 RPC ?

  • RPC (Remote Procedure Call)即远程过程调用,是分布式系统常见的一种通讯方法。它容许程序调用另外一个地址空间(一般是共享网络的另外一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。
  • 除 RPC 以外,常见的多系统数据交互方案还有分布式消息队列、HTTP 请求调用、数据库和分布式缓存等。
  • 其中 RPC 和 HTTP 调用是没有通过中间件的,它们是端到端系统的直接数据交互。

简单的说数据库

  • RPC就是从一台机器(客户端)上经过参数传递的方式调用另外一台机器(服务器)上的一个函数或方法(能够统称为服务)并获得返回的结果。
  • RPC会隐藏底层的通信细节(不须要直接处理Socket通信或Http通信)。
  • 客户端发起请求,服务器返回响应(相似于Http的工做方式)RPC在使用形式上像调用本地函数(或方法)同样去调用远程的函数(或方法)。

2 为何咱们要用RPC?

RPC 的主要目标是让构建分布式应用更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。为实现该目标,RPC 框架需提供一种透明调用机制让使用者没必要显式的区分本地调用和远程调用。缓存

3 RPC须要解决的三个问题

RPC要达到的目标:远程调用时,要可以像本地调用同样方便,让调用者感知不到远程调用的逻辑。服务器

  • Call ID映射。咱们怎么告诉远程机器咱们要调用哪一个函数呢?在本地调用中,函数体是直接经过函数指针来指定的,咱们调用具体函数,编译器就自动帮咱们调用它相应的函数指针。可是在远程调用中,是没法调用函数指针的,由于两个进程的地址空间是彻底不同。因此,在RPC中,全部的函数都必须有本身的一个ID。这个ID在全部进程中都是惟一肯定的。客户端在作远程过程调用时,必须附上这个ID。而后咱们还须要在客户端和服务端分别维护一个 {函数 <--> Call ID} 的对应表。二者的表不必定须要彻底相同,但相同的函数对应的Call ID必须相同。当客户端须要进行远程调用时,它就查一下这个表,找出相应的Call ID,而后把它传给服务端,服务端也经过查表,来肯定客户端须要调用的函数,而后执行相应函数的代码。
  • 序列化和反序列化。客户端怎么把参数值传给远程的函数呢?在本地调用中,咱们只须要把参数压到栈里,而后让函数本身去栈里读就行。可是在远程过程调用时,客户端跟服务端是不一样的进程,不能经过内存来传递参数。甚至有时候客户端和服务端使用的都不是同一种语言(好比服务端用C++,客户端用Java或者Python)。这时候就须要客户端把参数先转成一个字节流,传给服务端后,再把字节流转成本身能读取的格式。这个过程叫序列化和反序列化。同理,从服务端返回的值也须要序列化反序列化的过程。
  • 网络传输。远程调用每每是基于网络的,客户端和服务端是经过网络链接的。全部的数据都须要经过网络传输,所以就须要有一个网络传输层。网络传输层须要把Call ID和序列化后的参数字节流传给服务端,而后再把序列化后的调用结果传回客户端。只要能完成这二者的,均可以做为传输层使用。所以,它所使用的协议实际上是不限的,能完成传输就行。尽管大部分RPC框架都使用TCP协议,但其实UDP也能够,而gRPC干脆就用了HTTP2。Java的Netty也属于这层的东西。

4 实现高可用RPC框架须要考虑到的问题

  • 既然系统采用分布式架构,那一个服务势必会有多个实例,要解决如何获取实例的问题。因此须要一个服务注册中心,好比在Dubbo中,就可使用Zookeeper做为注册中心,在调用时,从Zookeeper获取服务的实例列表,再从中选择一个进行调用;
  • 如何选择实例呢?就要考虑负载均衡,例如dubbo提供了4种负载均衡策略;
  • 若是每次都去注册中心查询列表,效率很低,那么就要加缓存;
  • 客户端总不能每次调用完都等着服务端返回数据,因此就要支持异步调用;
  • 服务端的接口修改了,老的接口还有人在用,这就须要版本控制;
  • 服务端总不能每次接到请求都立刻启动一个线程去处理,因而就须要线程池;

5 理论结构模型

RPC 服务端经过RpcServer去导出(export)远程接口方法,而客户端经过RpcClient去导入(import)远程接口方法。客户端像调用本地方法同样去调用远程接口方法,RPC 框架提供接口的代理实现,实际的调用将委托给代理RpcProxy。代理封装调用信息并将调用转交给RpcInvoker去实际执行。在客户端的RpcInvoker经过链接器RpcConnector去维持与服务端的通道RpcChannel,并使用RpcProtocol执行协议编码(encode)并将编码后的请求消息经过通道发送给服务端。网络

RPC 服务端接收器RpcAcceptor接收客户端的调用请求,一样使用RpcProtocol执行协议解码(decode)。架构

解码后的调用信息传递给RpcProcessor去控制处理调用过程,最后再委托调用给RpcInvoker去实际执行并返回调用结果。负载均衡


主流的RPC框架

服务治理型

  • dubbo:是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可经过高性能的 RPC 实现服务的输出和输入功能,能够和 Spring框架无缝集成。dubbo 已经与12年年末中止维护升级。
  • dubbox:是当当团队基于dubbo升级的一个版本。是一个分布式的服务架构,可直接用于生产环境做为SOA服务框架。dubbox资源连接
  • motan:是新浪微博开源的一个Java框架。它诞生的比较晚,起于2013年,2016年5月开源。Motan 在微博平台中已经普遍应用,天天为数百个服务完成近千亿次的调用。motan资源连接
相关文章
相关标签/搜索