猿燈塔:最詳細(xì)Dubbo相關(guān)面試題!

1、Dubbo是什么?

Dubbo是阿里巴巴開源的基于 Java 的高性能 RPC 分布式服務(wù)框架,現(xiàn)已成為 Apache 基金會(huì)孵化項(xiàng)目。

面試官問你如果這個(gè)都不清楚,那下面的就沒必要問了。

官網(wǎng):http://dubbo.apache.org

2、為什么要用Dubbo?

因?yàn)槭前⒗镩_源項(xiàng)目,國(guó)內(nèi)很多互聯(lián)網(wǎng)公司都在用,已經(jīng)經(jīng)過很多線上考驗(yàn)。內(nèi)部使用了 Netty、Zookeeper,保證了高性能高可用性。

使用 Dubbo 可以將核心業(yè)務(wù)抽取出來,作為獨(dú)立的服務(wù),逐漸形成穩(wěn)定的服務(wù)中心,可用于提高業(yè)務(wù)復(fù)用靈活擴(kuò)展,使前端應(yīng)用能更快速的響應(yīng)多變的市場(chǎng)需求。

下面這張圖可以很清楚的詮釋,最重要的一點(diǎn)是,分布式架構(gòu)可以承受更大規(guī)模的并發(fā)流量

下面是 Dubbo 的服務(wù)治理圖。
關(guān)鍵路徑分析


3、Dubbo 和 Spring Cloud 有什么區(qū)別?

兩個(gè)沒關(guān)聯(lián),如果硬要說區(qū)別,有以下幾點(diǎn)。

1)通信方式不同

Dubbo 使用的是 RPC 通信,而 Spring Cloud 使用的是 HTTP RESTFul 方式。

2)組成部分不同


4、dubbo都支持什么協(xié)議,推薦用哪種?

dubbo://(推薦)

rmi://

hessian://

http://

webservice://

thrift://

memcached://

redis://

rest://

5、Dubbo需要 Web 容器嗎?

不需要,如果硬要用 Web 容器,只會(huì)增加復(fù)雜性,也浪費(fèi)資源。

6、Dubbo內(nèi)置了哪幾種服務(wù)容器?

Spring Container

Jetty Container

Log4j Container

Dubbo 的服務(wù)容器只是一個(gè)簡(jiǎn)單的 Main 方法,并加載一個(gè)簡(jiǎn)單的 Spring 容器,用于暴露服務(wù)。

7、Dubbo里面有哪幾種節(jié)點(diǎn)角色?


8、畫一畫服務(wù)注冊(cè)與發(fā)現(xiàn)的流程圖


服務(wù)注冊(cè)與發(fā)現(xiàn)流程圖

來自 Dubbo 官網(wǎng),供你參考,如果你說你熟悉 Dubbo, 面試官經(jīng)常會(huì)讓你畫這個(gè)圖,記好了。


9、Dubbo默認(rèn)使用什么注冊(cè)中心,還有別的選擇嗎?

推薦使用 Zookeeper 作為注冊(cè)中心,還有 Redis、Multicast、Simple 注冊(cè)中心,但不推薦。

10、Dubbo有哪幾種配置方式?

1)Spring 配置方式

2)Java API 配置方式

11、Dubbo 核心的配置有哪些?

我曾經(jīng)面試就遇到過面試官讓你寫這些配置,我也是蒙逼。。


配置之間的關(guān)系見下圖。



12、在 Provider 上可以配置的 Consumer 端的屬性有哪些?

1)timeout:方法調(diào)用超時(shí)

2)retries:失敗重試次數(shù),默認(rèn)重試 2 次

3)loadbalance:負(fù)載均衡算法,默認(rèn)隨機(jī)

4)actives 消費(fèi)者端,最大并發(fā)調(diào)用限制

13、Dubbo啟動(dòng)時(shí)如果依賴的服務(wù)不可用會(huì)怎樣?

Dubbo 缺省會(huì)在啟動(dòng)時(shí)檢查依賴的服務(wù)是否可用,不可用時(shí)會(huì)拋出異常,阻止 Spring 初始化完成,默認(rèn) check="true",可以通過 check="false" 關(guān)閉檢查。

14、Dubbo推薦使用什么序列化框架,你知道的還有哪些?

推薦使用Hessian序列化,還有Duddo、FastJson、Java自帶序列化。

15、Dubbo默認(rèn)使用的是什么通信框架,還有別的選擇嗎?

Dubbo 默認(rèn)使用 Netty 框架,也是推薦的選擇,另外內(nèi)容還集成有Mina、Grizzly。

16、Dubbo有哪幾種集群容錯(cuò)方案,默認(rèn)是哪種?



17、Dubbo有哪幾種負(fù)載均衡策略,默認(rèn)是哪種?



18、注冊(cè)了多個(gè)同一樣的服務(wù),如果測(cè)試指定的某一個(gè)服務(wù)呢?

可以配置環(huán)境點(diǎn)對(duì)點(diǎn)直連,繞過注冊(cè)中心,將以服務(wù)接口為單位,忽略注冊(cè)中心的提供者列表。

19、Dubbo支持服務(wù)多協(xié)議嗎?

Dubbo 允許配置多協(xié)議,在不同服務(wù)上支持不同協(xié)議或者同一服務(wù)上同時(shí)支持多種協(xié)議。

20、當(dāng)一個(gè)服務(wù)接口有多種實(shí)現(xiàn)時(shí)怎么做?

當(dāng)一個(gè)接口有多種實(shí)現(xiàn)時(shí),可以用 group 屬性來分組,服務(wù)提供方和消費(fèi)方都指定同一個(gè) group 即可。

21、服務(wù)上線怎么兼容舊版本?

可以用版本號(hào)(version)過渡,多個(gè)不同版本的服務(wù)注冊(cè)到注冊(cè)中心,版本號(hào)不同的服務(wù)相互間不引用。這個(gè)和服務(wù)分組的概念有一點(diǎn)類似。

22、Dubbo可以對(duì)結(jié)果進(jìn)行緩存嗎?

可以,Dubbo 提供了聲明式緩存,用于加速熱門數(shù)據(jù)的訪問速度,以減少用戶加緩存的工作量。

23、Dubbo服務(wù)之間的調(diào)用是阻塞的嗎?

默認(rèn)是同步等待結(jié)果阻塞的,支持異步調(diào)用。

Dubbo 是基于 NIO 的非阻塞實(shí)現(xiàn)并行調(diào)用,客戶端不需要啟動(dòng)多線程即可完成并行調(diào)用多個(gè)遠(yuǎn)程服務(wù),相對(duì)多線程開銷較小,異步調(diào)用會(huì)返回一個(gè) Future 對(duì)象。

異步調(diào)用流程圖如下。



24、Dubbo支持分布式事務(wù)嗎?

目前暫時(shí)不支持,后續(xù)可能采用基于 JTA/XA 規(guī)范實(shí)現(xiàn),如以圖所示。



25、Dubbo telnet 命令能做什么?

dubbo 通過 telnet 命令來進(jìn)行服務(wù)治理。


26、Dubbo支持服務(wù)降級(jí)嗎?

Dubbo 2.2.0 以上版本支持。

27、Dubbo如何優(yōu)雅停機(jī)?

Dubbo 是通過 JDK 的 ShutdownHook 來完成優(yōu)雅停機(jī)的,所以如果使用 kill -9 PID 等強(qiáng)制關(guān)閉指令,是不會(huì)執(zhí)行優(yōu)雅停機(jī)的,只有通過 kill PID 時(shí),才會(huì)執(zhí)行。

28、服務(wù)提供者能實(shí)現(xiàn)失效踢出是什么原理?

服務(wù)失效踢出基于 Zookeeper 的臨時(shí)節(jié)點(diǎn)原理。

29、如何解決服務(wù)調(diào)用鏈過長(zhǎng)的問題?

Dubbo 可以使用 Pinpoint 和 Apache Skywalking(Incubator) 實(shí)現(xiàn)分布式服務(wù)追蹤,當(dāng)然還有其他很多方案。

30、服務(wù)讀寫推薦的容錯(cuò)策略是怎樣的?

讀操作建議使用 Failover 失敗自動(dòng)切換,默認(rèn)重試兩次其他服務(wù)器。

寫操作建議使用 Failfast 快速失敗,發(fā)一次調(diào)用失敗就立即報(bào)錯(cuò)。

31、Dubbo必須依賴的包有哪些?

Dubbo 必須依賴 JDK,其他為可選。

32、Dubbo的管理控制臺(tái)能做什么?

管理控制臺(tái)主要包含:路由規(guī)則,動(dòng)態(tài)配置,服務(wù)降級(jí),訪問控制,權(quán)重調(diào)整,負(fù)載均衡,等管理功能。

33、說說 Dubbo 服務(wù)暴露的過程。

Dubbo 會(huì)在 Spring 實(shí)例化完 bean 之后,在刷新容器最后一步發(fā)布 ContextRefreshEvent 事件的時(shí)候,通知實(shí)現(xiàn)了 ApplicationListener 的 ServiceBean 類進(jìn)行回調(diào) onApplicationEvent 事件方法,Dubbo 會(huì)在這個(gè)方法中調(diào)用 ServiceBean 父類 ServiceConfig 的 export 方法,而該方法真正實(shí)現(xiàn)了服務(wù)的(異步或者非異步)發(fā)布。

34、Dubbo 停止維護(hù)了嗎?

2014 年開始停止維護(hù)過幾年,17 年開始重新維護(hù),并進(jìn)入了 Apache 項(xiàng)目。

35、Dubbo 和 Dubbox 有什么區(qū)別?

Dubbox 是繼 Dubbo 停止維護(hù)后,當(dāng)當(dāng)網(wǎng)基于 Dubbo 做的一個(gè)擴(kuò)展項(xiàng)目,如加了服務(wù)可 Restful 調(diào)用,更新了開源組件等。

36、你還了解別的分布式框架嗎?

別的還有 Spring cloud、Facebook 的 Thrift、Twitter 的 Finagle 等。

37、Dubbo 能集成 Spring Boot 嗎?

可以的,項(xiàng)目地址如下。

https://github.com/apache/incubator-dubbo-spring-boot-project

38、在使用過程中都遇到了些什么問題?

Dubbo 的設(shè)計(jì)目的是為了滿足高并發(fā)小數(shù)據(jù)量的 rpc 調(diào)用,在大數(shù)據(jù)量下的性能表現(xiàn)并不好,建議使用 rmi 或 http 協(xié)議。

39、你讀過 Dubbo 的源碼嗎?

要了解 Dubbo 就必須看其源碼,了解其原理,花點(diǎn)時(shí)間看下吧,網(wǎng)上也有很多教程,后續(xù)有時(shí)間我也會(huì)在公眾號(hào)上分享 Dubbo 的源碼。

40、你覺得用 Dubbo 好還是 Spring Cloud 好?

擴(kuò)展性的問題,沒有好壞,只有適合不適合,不過我好像更傾向于使用 Dubbo, Spring Cloud 版本升級(jí)太快,組件更新替換太頻繁,配置太繁瑣,還有很多我覺得是沒有 Dubbo 順手的地方……

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容