关于后端:Dubbo常见面试题

2次阅读

共计 4938 个字符,预计需要花费 13 分钟才能阅读完成。

前言

Dubbo 整体介绍的差不多了,明天就开始面试环节了,我会列举一些常见的 Dubbo 面试题,只会抓着重的,一些太简略的我就不提了。

不仅仅给你面试题的答案,也会分析面试官问这个问题的起因,也就是他的心田流动。

想从你这里问出什么?想要什么答案?想挖什么坑给你跳?

开始表演

晓得什么是 RPC 么?

个别面试官会以这样的问题来切入、热场,毕 面试也是循序渐进的过程,所以你也不必太心急一开始就芭芭拉说一堆,要抓住关键点简略论述先。

而且面试官能从这个问题鉴定出你素日的工作内容会不会连 RPC 都没接触过,会不会就只是一条龙的 Spring MVC ?

的确有很多同学没接触过 RPC,也很失常比方一些外包或者一些小我的项目都接触不到的,不过素日接触不到和你不晓得这个货色是两个概念。

能从侧面反映出这个人工作之余应该不怎么学习,连 RPC 都不晓得,所以怎么都说不过去,基本上要凉凉,对你的初始印象就差了,除非你能从前面有亮眼的体现。

答:RPC 就是 Remote Procedure Call,近程过程调用,它绝对应的是本地过程调用。

那为什么要有 RPC,HTTP 不好么?

这时候面试官就开始诘问了。

这个问题其实很有意思,有些面试官可能本人不太分明,而后认为本人很分明,所以问出这个问题,还有一种是真的分明,问这个问题是为了让你跳坑里。

因为 RPC 和 HTTP 就不是一个层级的货色,所以严格意义上这两个没有可比性,也不应该来作比拟,而题目问的就是把这两个作为比拟了。

HTTP 只是传输协定,协定只是标准了肯定的交换格局,而且 RPC 是早于 HTTP 的,所以真要问也是问有 RPC 为什么还要 HTTP。

RPC 比照的是本地过程调用,是用来作为分布式系统之间的通信,它能够用 HTTP 来传输,也能够基于 TCP 自定义协定传输。

所以你要 先提出这两个不是一个层级的货色,没有可比性,而后再体现一下,能够说 HTTP 协定比拟冗余,所以 RPC 大多都是基于 TCP 自定义协定,定制化的才是最适宜本人的。

当然也有基于 HTTP 协定的 RPC 框架,毕竟 HTTP 是公开的协定,比拟通用,像 HTTP2 曾经做了相应的压缩了,而且零碎之间的调用都在内网,所以说影响也不会很大。

这波答复下来,面试官会感觉你有点货色,开始对你有点趣味了,要开始深刻你了。

说说你对 Dubbo 的理解?

面试官会先问个大点的问题,而后从你的答复中找到一些突破口来深刻问,所以这个问题其实挺开放性的,你能够从历史的倒退来答,也能够从整体架构来答。

如果从历史倒退的角度来答,阐明你素日里也是挺关注一些开源软件的,侧面也能体现你的对开源的拥抱。

如果从总体架构答,毋庸置疑必定也是能够的,倡议先通俗的说,等着诘问。

历史倒退,这个其实丙之前文章曾经提到了:

Dubbo 是阿里巴巴开源的一个基于 Java 的 RPC 框架,两头寂静了一段时间,但在 2017 年阿里巴巴又重启了对 Dubbo 保护。

并且在 2018 年和 当当的 Dubbox 进行了合并,进入 Apache 孵化器,在 2019 年毕业正式成为 Apache 顶级我的项目。

目前 Dubbo 社区主力保护的是 2.6.x 和 2.7.x 两大版本,2.6.x 版本次要是 bug 修复和大量性能加强为准,是稳固版本。

2.7.5 版本的公布被 Dubbo 认为是里程碑式的版本公布,反对 gRPC,并且性能晋升了 30%(这里不理解 gRPC 和为什么性能晋升的话就别说了,别给本人挖坑)。

最新的 3.0 版本往云原生方向上摸索着。

留神了,如果对历史各个版本不太熟,也不晓得最新的版本要干啥就别往这方向答了,运气好点就是面试官本人也不太理解,他可能不会问,运气背点就诘问了。

总体架构,下面也提到了先通俗的说,等诘问,因为面试官如果懂,他必定会问深刻,如果不懂你芭芭拉一堆他无感的。

你就简略的提一下当初这几个角色。

节点 角色阐明
Consumer 须要调用近程服务的服务生产方
Registry 注册核心
Provider 服务提供方
Container 服务运行的容器
Monitor 监控核心

比方,Dubbo 总体分了以上这么几个角色,别离的作用是 xxxx。

这里进展下看下面试官的反馈,如果没搭话,就持续说大抵的流程。

首先服务提供者 Provider 启动而后向注册核心注册本人所能提供的服务。

服务消费者 Consumer 启动向注册核心订阅本人所需的服务。而后注册核心将提供者元信息告诉给 Consumer,之后 Consumer 因为曾经从注册核心获取提供者的地址,因而能够通过负载平衡抉择一个 Provider 间接调用。

之后服务提供方元数据变更的话注册核心会把变更推送给服务消费者。

服务提供者和消费者都会在内存中记录着调用的次数和工夫,而后定时的发送统计数据到监控核心。

到这基本上就差不多了,如果之前看过丙的 Dubbo 系列文章的话,那就算看过源码了,必定对一系列过程很清晰了,所以在适当的机会能够说本人看过 Dubbo 源码。

家喻户晓,看过源码必定是加分项,所以这点是要提的。

面试官一听,好家伙看过源码是吧,来说说。

接下来就开始连击了。

看过源码,那说下服务裸露的流程?

服务的裸露起始于 Spring IOC 容器刷新结束之后,会依据配置参数组装成 URL,而后依据 URL 的参数来进行本地或者近程调用。

会通过 proxyFactory.getInvoker,利用 javassist 来进行动静代理,封装真的实现类,而后再通过 URL 参数抉择对应的协定来进行 protocol.export,默认是 Dubbo 协定。

在第一次裸露的时候会调用 createServer 来创立 Server,默认是 NettyServer。

而后将 export 失去的 exporter 存入一个 Map 中,供之后的近程调用查找,而后会向注册核心注册提供者的信息。

基本上就是这么个流程,说了这些差不多了,太细的谁都记住不。

看过源码,那说下服务引入的流程?

服务的引入机会有两种,第一种是饿汉式,第二种是懒汉式。

饿汉式就是加载结束就会引入,懒汉式是只有当这个服务被注入到其余类中时启动引入流程,默认是懒汉式。

会先依据配置参数组装成 URL,一般而言咱们都会配置的注册核心,所以会构建 RegistryDirectory
向注册核心注册消费者的信息,并且订阅提供者、配置、路由等节点。

得悉提供者的信息之后会进入 Dubbo 协定的引入,会创立 Invoker,期间会蕴含 NettyClient,来进行近程通信,最初通过 Cluster 来包装 Invoker,默认是 FailoverCluster,最终返回代理类。

说这么多差不多了,要害的点都提到了。

切忌不要太过细,不要把你晓得的都说了,这样会抓不住重点,比方下面的流程你要插入,引入的三种形式:本地引入、直连近程引入、通过注册核心引入。

而后再别离说本地引入怎么的,芭芭拉的就会很乱,所以 面试的时候是须要删减的,要直击重点。

其实实在说的应该比我下面说的还要精简点才行,我是怕大家不太分明说的略微具体了一些。

看过源码,那说下服务调用的流程?

调用某个接口的办法会调用之前生成的代理类,而后会从 cluster 中通过路由的过滤、负载平衡机制抉择一个 invoker 发动近程调用,此时会记录此申请和申请的 ID 期待服务端的响应。

服务端承受申请之后会通过参数找到之前裸露存储的 map,失去相应的 exporter,而后最终调用真正的实现类,再组装好后果返回,这个响应会带上之前申请的 ID。

消费者收到这个响应之后会通过 ID 去找之前记录的申请,而后找到申请之后将响应塞到对应的 Future 中,唤醒期待的线程,最初消费者失去响应,一个流程结束。

要害的就是 cluster、路由、负载平衡,而后 Dubbo 默认是异步的,所以申请和响应是如何对应上的。

之后可能还会诘问 Dubbo 异步转同步如何实现的之类的,在丙之前文章外面都说了,遗记的同学能够回去看看。

晓得什么是 SPI 嘛?

这又是一个方向了,从下面的答复中,不论是从 Dubbo 协定,还是 cluster,什么 export 办法等等无处不是 SPI 的影子,所以如果是问 Dubbo 方面的问题,问 SPI 是毋庸置疑的,因为源码里 SPI 无处不在,而且 SPI 也是 Dubbo 可扩展性的基石。

所以这个题目没什么套路,间接答就行。

SPI 是 Service Provider Interface,次要用于框架中,框架定义好接口,不同的使用者有不同的需要,因而须要有不同的实现,而 SPI 就通过定义一个特定的地位,Java SPI 约定在 Classpath 下的 META-INF/services/ 目录里创立一个 以服务接口命名的文件 ,而后 文件外面记录的是此 jar 包提供的具体实现类的全限定名

所以就能够通过接口找到对应的文件,获取具体的实现类而后加载即可,做到了灵便的替换具体的实现类。

为什么 Dubbo 不必 JDK 的 SPI,而是要本人实现?

问这个问题就是 看你有没有深刻的理解,或者本人思考过,不是死板的看源码,或者看一些知识点。

很多点是要思考的,不是书上说什么就是什么,你要晓得这样做的理由,有什么益处和害处,这很容易看出一个人是死记硬背还是有本人的思考。

答:因为 Java SPI 在查找扩大实现类的时候遍历 SPI 的配置文件并且 将实现类全副实例化,假如一个实现类初始化过程比拟耗费资源且耗时,然而你的代码外面又用不上它,这就产生了资源的节约。

因而 Dubbo 就本人实现了一个 SPI,给每个实现类配了个名字,通过名字去文件外面找到对应的实现类全限定名而后加载实例化,按需加载。

这答出来就加分了,面试官心里在拍手了,不错不错有点货色。

Dubbo 为什么默认用 Javassist

下面你答复 Dubbo 用 Javassist 动静代理,所以很可能会问你为什么要用这个代理,可能还会引申出 JDK 的动静代理、ASM、CGLIB。

所以这也是个留神点,如果你不太分明的话下面的答复就不要扯到动静代理了,如果分明的话那必定得提,来诱导面试官来问你动静代理方面的问题,这很要害。

面试官是须要诱导的,毕竟他也想晓得你优良的方面到底有多优良,你也舍短取长,双赢双赢。

来答复下为什么用 Javassist,很简略,就是快,且字节码生成不便

ASM 比 Javassist 更快,然而没有快一个数量级,而 Javassist 只需用字符串拼接就能够生成字节码,而 ASM 须要手工生成,老本较高,比拟麻烦。

如果让你设计一个 RPC 框架,如何设计?

面试官都很喜爱问这类问题,来考验候选人的设计能力,和素日有无全方面的理解过一个框架。

如果你平时没有思考,没有往这方面想过答出来的货色就会没有条理性,会显得横七竖八,不过你也不必慌乱,不必想的很全面,答的很粗疏,没有必要,面试官要的是那些要害的重点。

你能够从底层向上开始说起

首先须要实现高性能的网络传输,能够采纳 Netty 来实现,不必本人反复造轮子,而后须要自定义协定,毕竟近程交互都须要遵循肯定的协定,而后还须要定义好序列化协定,网络的传输毕竟都是二进制流传输的。

而后能够搞一套形容服务的语言,即 IDL(Interface description language),让所有的服务都用 IDL 定义,再由框架转换为特定编程语言的接口,这样就能跨语言了。

此时最近根本的性能曾经有了,然而只是最根底的,工业级的话首先得易用,所以框架须要把上述的细节对使用者进行屏蔽,让他们感觉不到本地调用和近程调用的区别,所以须要代理实现。

而后还须要实现集群性能,因而的要服务发现、注册等性能,所以须要注册核心,当然细节还是须要屏蔽的。

最初还须要一个欠缺的监控机制,埋点上报调用状况等等,便于运维。

这样一个 RPC 框架的雏形就差不多了。

最初

Dubbo 系列就到此结束了,其实还是有很多细节的,如果要写必定还是有很多能够写的。

不过整体脉络都理分明了,之后的修行还是得靠大家本人多多致力。

面试题必定不止这一些,面试题是问不完的,实在的面试必定是抓住你答复的点来深挖,所以我也模仿不了,我只能通知你大抵关键点,和琢磨一下面试官的心理流动。

当面试官问你的时候你能够试着去琢磨,看看他到底想要问什么,这很要害

面试的时候不要慌,你和面试官是平等的,而且面试官不肯定你厉害,还有面试有时候就是看运气了,面试失败了也不要泄气,换一家就好了,有时候就是气场不和,这很失常。

加油。

正文完
 0