看了这篇Dubbo RPC面试题,让天下没有难面的面试题!

 


 

前言:前端

RPC很是重要,不少人面试的时候都挂在了这个地方!你要是还不懂RPC是什么?他的基本原理是什么?你必定要把下边的内容记起来!好好研究一下!特别是文中给出的一张关于RPC的基本流程图,重点中的重点,Dubbo RPC的基本执行流程就是他,RPC框架的基本原理也是他,别说我没告诉你!看了下边的内容你要掌握的内容以下,固然还有不少:面试

RPC的由来,是怎样一步步演进出来的;编程

RPC的基本架构是什么;安全

RPC的基本实现原理,就是下边的这张图,重点中的重点;服务器

REST 和 SOAP、RPC 有何区别呢?网络

整个调用的过程经历了哪几步和Spring MVC的执行流程同样,至关重要;架构

1、为何要有RPC并发

随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已没法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。框架

一、单一应用架构异步

当网站流量很小时,只需一个应用,将全部功能都部署在一块儿,以减小部署节点和成本。此时,用于简化增删改查工做量的数据访问框架(ORM) 是关键。

二、垂直应用架构

访问量逐渐增大,单一应用增长机器带来的加速度愈来愈小,将应用拆成互不相干的几个应用,以提高效率。此时,用于加速前端页面开发的 Web框架(MVC) 是关键。

三、分布式服务架构

当垂直应用愈来愈多,应用之间交互不可避免,将核心业务抽取出来,做为独立的服务,逐渐造成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。

此时,用于提升业务复用及整合的分布式服务框架(RPC),提供统一的服务是关键。

例如:各个团队的服务提供方就不要各自实现一套序列化、反序列化、网络框架、链接池、收发线程、超时处理、状态机等“业务以外”的重复技术劳动,形成总体的低效。

PS:其实上述三个缘由也是为何要有Dubbo的缘由!不信你去Dubbo官网去看!

四、流动计算架构

PS:这个属于扩展内容,摘自Dubbo官网,属于架构演进的一个过程

当服务愈来愈多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增长一个调度中心基于访问压力实时管理集群容量,提升集群利用率。此时,用于提升机器利用率的资源调度和治理中心(SOA)是关键。

五、另一个缘由

就是由于在几个进程内(应用分布在不一样的机器上),没法共用内存空间,或者在一台机器内经过本地调用没法完成相关的需求,好比不一样的系统之间的通信,甚至不一样组织之间的通信。此外因为机器的横向扩展,须要在多台机器组成的集群上部署应用等等。

因此,统一RPC框架来解决提供统一的服务。

2、什么是RPC

RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种经过网络从远程计算机程序上请求服务,而不须要了解底层网络技术的协议。简言之,RPC使得程序可以像访问本地系统资源同样,去访问远端系统资源。比较关键的一些方面包括:通信协议、序列化、资源(接口)描述、服务框架、性能、语言支持等。


 

简单的说,RPC就是从一台机器(客户端)上经过参数传递的方式调用另外一台机器(服务器)上的一个函数或方法(能够统称为服务)并获得返回的结果。

3、PRC架构组件

一个基本的RPC架构里面应该至少包含如下4个组件:

客户端(Client):服务调用方(服务消费者)

客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数数据信息打包成网络消息,再经过网络传输发送给服务端

服务端存根(Server Stub):接收客户端发送过来的请求消息并进行解包,而后再调用本地服务进行处理

服务端(Server):服务的真正提供者


 

具体调用过程:

服务消费者(client客户端)经过调用本地服务的方式调用须要消费的服务;

客户端存根(client stub)接收到调用请求后负责将方法、入参等信息序列化(组装)成可以进行网络传输的消息体;

客户端存根(client stub)找到远程的服务地址,而且将消息经过网络发送给服务端;

服务端存根(server stub)收到消息后进行解码(反序列化操做);

服务端存根(server stub)根据解码结果调用本地的服务进行相关处理;

本地服务执行具体业务逻辑并将处理结果返回给服务端存根(server stub);

服务端存根(server stub)将返回结果从新打包成消息(序列化)并经过网络发送至消费方;

客户端存根(client stub)接收到消息,并进行解码(反序列化);

服务消费方获得最终结果;

而RPC框架的实现目标则是将上面的第2-10步无缺地封装起来,也就是把调用、编码/解码的过程给封装起来,让用户感受上像调用本地服务同样的调用远程服务。

4、RPC和SOA、SOAP、REST的区别

一、REST

能够看着是HTTP协议的一种直接应用,默认基于JSON做为传输格式,使用简单,学习成本低效率高,可是安全性较低。

二、SOAP

SOAP是一种数据交换协议规范,是一种轻量的、简单的、基于XML的协议的规范。而SOAP能够看着是一个重量级的协议,基于XML、SOAP在安全方面是经过使用XML-Security和XML-Signature两个规范组成了WS-Security来实现安全控制的,当前已经获得了各个厂商的支持 。

它有什么优势?简单总结为:易用、灵活、跨语言、跨平台。

三、SOA

面向服务架构,它能够根据需求经过网络对松散耦合的粗粒度应用组件进行分布式部署、组合和使用。服务层是SOA的基础,能够直接被应用调用,从而有效控制系统中与软件代理交互的人为依赖性。

SOA是一种粗粒度、松耦合服务架构,服务之间经过简单、精肯定义接口进行通信,不涉及底层编程接口和通信模型。SOA能够看做是B/S模型、XML(标准通用标记语言的子集)/Web Service技术以后的天然延伸。

四、REST 和 SOAP、RPC 有何区别呢?

没什么太大区别,他们的本质都是提供可支持分布式的基础服务,最大的区别在于他们各自的的特色所带来的不一样应用场景 。

5、RPC框架须要解决的问题?

如何肯定客户端和服务端之间的通讯协议?

如何更高效地进行网络通讯?

服务端提供的服务如何暴露给客户端?

客户端如何发现这些暴露的服务?

如何更高效地对请求对象和响应结果进行序列化和反序列化操做?

6、RPC的实现基础?

须要有很是高效的网络通讯,好比通常选择Netty做为网络通讯框架;

须要有比较高效的序列化框架,好比谷歌的Protobuf序列化框架;

可靠的寻址方式(主要是提供服务的发现),好比可使用Zookeeper来注册服务等等;

若是是带会话(状态)的RPC调用,还须要有会话和状态保持的功能;

7、RPC使用了哪些关键技术?

一、动态代理

生成Client Stub(客户端存根)和Server Stub(服务端存根)的时候须要用到Java动态代理技术,可使用JDK提供的原生的动态代理机制,也可使用开源的:CGLib代理,Javassist字节码生成技术。

二、序列化和反序列化

在网络中,全部的数据都将会被转化为字节进行传送,因此为了可以使参数对象在网络中进行传输,须要对这些参数进行序列化和反序列化操做。

序列化:把对象转换为字节序列的过程称为对象的序列化,也就是编码的过程。

反序列化:把字节序列恢复为对象的过程称为对象的反序列化,也就是解码的过程。

目前比较高效的开源序列化框架:如Kryo、FastJson和Protobuf等。

三、NIO通讯

出于并发性能的考虑,传统的阻塞式 IO 显然不太合适,所以咱们须要异步的 IO,即 NIO。Java 提供了 NIO 的解决方案,Java 7 也提供了更优秀的 NIO.2 支持。能够选择Netty或者MINA来解决NIO数据传输的问题。

四、服务注册中心

可选:Redis、Zookeeper、Consul 、Etcd。通常使用ZooKeeper提供服务注册与发现功能,解决单点故障以及分布式部署的问题(注册中心)。

8、主流RPC框架有哪些

RMI

Hessian

protobuf-rpc-pro

Thrift

Avro

Dubbo

9、RPC的实现原理架构图


 

PS:这张图很是重点,是PRC的基本原理,请你们必定记住!


 

也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,因为不在一个内存空间,不能直接调用,须要经过网络来表达调用的语义和传达调用的数据。

好比说,A服务器想调用B服务器上的一个方法:

User getUserByName(String userName)

一、创建通讯

首先要解决通信的问题:即A机器想要调用B机器,首先得创建起通讯链接。

主要是经过在客户端和服务器之间创建TCP链接,远程过程调用的全部交换的数据都在这个链接里传输。链接能够是按需链接,调用结束后就断掉,也能够是长链接,多个远程过程调用共享同一个链接。

一般这个链接能够是按需链接(须要调用的时候就先创建链接,调用结束后就立马断掉),也能够是长链接(客户端和服务器创建起链接以后保持长期持有,无论此时有无数据包的发送,能够配合心跳检测机制按期检测创建的链接是否存活有效),多个远程过程调用共享同一个链接。

二、服务寻址

要解决寻址的问题,也就是说,A服务器上的应用怎么告诉底层的RPC框架,如何链接到B服务器(如主机或IP地址)以及特定的端口,方法的名称名称是什么。

一般状况下咱们须要提供B机器(主机名或IP地址)以及特定的端口,而后指定调用的方法或者函数的名称以及入参出参等信息,这样才能完成服务的一个调用。

可靠的寻址方式(主要是提供服务的发现)是RPC的实现基石,好比能够采用Redis或者Zookeeper来注册服务等等。


 

2.一、从服务提供者的角度看:

当服务提供者启动的时候,须要将本身提供的服务注册到指定的注册中心,以便服务消费者可以经过服务注册中心进行查找;

当服务提供者因为各类缘由导致提供的服务中止时,须要向注册中心注销中止的服务;

服务的提供者须要按期向服务注册中心发送心跳检测,服务注册中心若是一段时间未收到来自服务提供者的心跳后,认为该服务提供者已经中止服务,则将该服务从注册中心上去掉。

2.二、从调用者的角度看:

服务的调用者启动的时候根据本身订阅的服务向服务注册中心查找服务提供者的地址等信息;

当服务调用者消费的服务上线或者下线的时候,注册中心会告知该服务的调用者;

服务调用者下线的时候,则取消订阅。

三、网络传输

3.一、序列化

当A机器上的应用发起一个RPC调用时,调用方法和其入参等信息须要经过底层的网络协议如TCP传输到B机器,因为网络协议是基于二进制的,全部咱们传输的参数数据都须要先进行序列化(Serialize)或者编组(marshal)成二进制的形式才能在网络中进行传输。而后经过寻址操做和网络传输将序列化或者编组以后的二进制数据发送给B机器。

3.二、反序列化

当B机器接收到A机器的应用发来的请求以后,又须要对接收到的参数等信息进行反序列化操做(序列化的逆操做),即将二进制信息恢复为内存中的表达方式,而后再找到对应的方法(寻址的一部分)进行本地调用(通常是经过生成代理Proxy去调用,

一般会有JDK动态代理、CGLIB动态代理、Javassist生成字节码技术等),以后获得调用的返回值。

四、服务调用

B机器进行本地调用(经过代理Proxy和反射调用)以后获得了返回值,此时还须要再把返回值发送回A机器,一样也须要通过序列化操做,而后再通过网络传输将二进制数据发送回A机器,而当A机器接收到这些返回值以后,则再次进行反序列化操做,恢复为内存中的表达方式,最后再交给A机器上的应用进行相关处理(通常是业务逻辑处理操做)。

一般,通过以上四个步骤以后,一次完整的RPC调用算是完成了,另外可能由于网络抖动等缘由须要重试等。

扩展阅读

史上最全 40 道 Dubbo 面试题及答案,看完碾压面试官!

dubbo服务调试管理实用命令

Java中几种经常使用的RPC框架介绍

一篇文章了解RPC框架原理

Java 动态代理及 RPC 框架介绍

BAT都是如何面试的?看完我惊呆了!

来源:https://blog.csdn.net/weixin_43822607/article/details/88799374

相关文章
相关标签/搜索