2020年Dubbo30道高頻面試題缩举!還在為面試煩惱趕快來看看垦梆!

前言

Dubbo是一個分布式服務(wù)框架,致力于提供高性能和透明化的RPC遠程服務(wù)調(diào)用方案仅孩,以及SOA服務(wù)治理方案托猩。簡單的說,dubbo就是個服務(wù)框架杠氢,如果沒有分布式的需求站刑,其實是不需要用的,只有在分布式的時候鼻百,才有dubbo這樣的分布式服務(wù)框架的需求绞旅,并且本質(zhì)上是個服務(wù)調(diào)用的東東,說白了就是個遠程服務(wù)調(diào)用的分布式框架(告別Web Service模式中的WSdl温艇,以服務(wù)者與消費者的方式在dubbo上注冊)因悲。

在這里插入圖片描述

很多時候,其實我們使用這個技術(shù)的時候勺爱,可能都是因為項目需要晃琳,所以,我們就用了琐鲁,但是卫旱,至于為什么我們需要用到這個技術(shù),可能自身并不是很了解的围段,但是顾翼,其實了解技術(shù)的來由及背景知識,對于理解一項技術(shù)還是有幫助的奈泪。

關(guān)于Dubbo的知識總結(jié)了個思維導(dǎo)圖

在這里插入圖片描述

Dubbo 面試題

1适贸、為什么要用 Dubbo?

2涝桅、Dubbo 的整體架構(gòu)設(shè)計有哪些分層?

3拜姿、默認使用的是什么通信框架,還有別的選擇嗎?

4冯遂、服務(wù)調(diào)用是阻塞的嗎蕊肥?

5、一般使用什么注冊中心蛤肌?還有別的選擇嗎壁却?

6、默認使用什么序列化框架寻定,你知道的還有哪些儒洛?

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

8琅锻、服務(wù)上線怎么不影響舊版本?

9向胡、如何解決服務(wù)調(diào)用鏈過長的問題恼蓬?

10、說說核心的配置有哪些僵芹?

11处硬、Dubbo 推薦用什么協(xié)議?

12拇派、同一個服務(wù)多個注冊的情況下可以直連某一個服務(wù)嗎荷辕?

13凿跳、畫一畫服務(wù)注冊與發(fā)現(xiàn)的流程圖?

14疮方、Dubbo 集群容錯有幾種方案控嗜?

15、Dubbo 服務(wù)降級骡显,失敗重試怎么做疆栏?

16、Dubbo 使用過程中都遇到了些什么問題惫谤?

17壁顶、Dubbo Monitor 實現(xiàn)原理?

18溜歪、Dubbo 用到哪些設(shè)計模式若专?

19、Dubbo 配置文件是如何加載到 Spring 中的痹愚?

20富岳、Dubbo SPI 和 Java SPI 區(qū)別?

21拯腮、Dubbo 支持分布式事務(wù)嗎窖式?

22、Dubbo 可以對結(jié)果進行緩存嗎动壤?

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

24琼懊、Dubbo 必須依賴的包有哪些阁簸?

25、Dubbo telnet 命令能做什么哼丈?

26启妹、Dubbo 支持服務(wù)降級嗎?

27醉旦、Dubbo 如何優(yōu)雅停機饶米?

28、Dubbo 和 Dubbox 之間的區(qū)別车胡?

29檬输、Dubbo 和 Spring Cloud 的區(qū)別?

30匈棘、你還了解別的分布式框架嗎丧慈?

在這里插入圖片描述

下面是Dubbo 面試題答案解析

1、為什么要用 Dubbo主卫?

隨著服務(wù)化的進一步發(fā)展逃默,服務(wù)越來越多鹃愤,服務(wù)之間的調(diào)用和依賴關(guān)系也越來越復(fù)雜,誕生了面向服務(wù)的架構(gòu)體系(SOA)笑旺,也因此衍生出了一系列相應(yīng)的技術(shù)昼浦,如對服務(wù)提供馍资、服務(wù)調(diào)用筒主、連接處理、通信協(xié)議鸟蟹、序列化方式乌妙、服務(wù)發(fā)現(xiàn)、服務(wù)路由建钥、日志輸出等行為進行封裝的服務(wù)框架藤韵。就這樣為分布式系統(tǒng)的服務(wù)治理框架就出現(xiàn)了,Dubbo 也就這樣產(chǎn)生了熊经。

2泽艘、Dubbo 的整體架構(gòu)設(shè)計有哪些分層?

接口服務(wù)層(Service):該層與業(yè)務(wù)邏輯相關(guān),根據(jù) provider 和 consumer 的業(yè)務(wù)設(shè)計對應(yīng)的接口和實現(xiàn)

配置層(Config):對外配置接口镐依,以 ServiceConfig 和 ReferenceConfig 為中心

服務(wù)代理層(Proxy):服務(wù)接口透明代理匹涮,生成服務(wù)的客戶端 Stub 和 服務(wù)端的 Skeleton,以 ServiceProxy 為中心槐壳,擴展接口為 ProxyFactory

服務(wù)注冊層(Registry):封裝服務(wù)地址的注冊和發(fā)現(xiàn)然低,以服務(wù) URL 為中心,擴展接口為 RegistryFactory务唐、Registry雳攘、RegistryService

路由層(Cluster):封裝多個提供者的路由和負載均衡,并橋接注冊中心枫笛,以Invoker 為中心吨灭,擴展接口為 Cluster、Directory刑巧、Router 和 LoadBlancce

監(jiān)控層(Monitor):RPC 調(diào)用次數(shù)和調(diào)用時間監(jiān)控喧兄,以 Statistics 為中心,擴展接口為 MonitorFactory海诲、Monitor 和 MonitorService

遠程調(diào)用層(Protocal):封裝 RPC 調(diào)用繁莹,以 Invocation 和 Result 為中心,擴展接口為 Protocal特幔、Invoker 和 Exporter

信息交換層(Exchange):封裝請求響應(yīng)模式咨演,同步轉(zhuǎn)異步。以 Request 和Response 為中心蚯斯,擴展接口為 Exchanger薄风、ExchangeChannel饵较、ExchangeClient 和 ExchangeServer

網(wǎng)絡(luò) 傳輸 層(Transport):抽象 mina 和 netty 為統(tǒng)一接口,以 Message 為中心遭赂,擴展接口為 Channel循诉、Transporter、Client撇他、Server 和 Codec

數(shù)據(jù)序列化層(Serialize):可復(fù)用的一些工具茄猫,擴展接口為 Serialization、ObjectInput困肩、ObjectOutput 和 ThreadPool

3划纽、默認使用的是什么通信框架,還有別的選擇嗎?

默認也推薦使用 netty 框架锌畸,還有 mina勇劣。

4、服務(wù)調(diào)用是阻塞的嗎潭枣?

默認是阻塞的比默,可以異步調(diào)用,沒有返回值的可以這么做盆犁。Dubbo 是基于 NIO 的非阻塞實現(xiàn)并行調(diào)用命咐,客戶端不需要啟動多線程即可完成并行調(diào)用多個遠程服務(wù),相對多線程開銷較小蚣抗,異步調(diào)用會返回一個 Future 對象侈百。

5、一般使用什么注冊中心翰铡?還有別的選擇嗎钝域?

推薦使用 Zookeeper 作為注冊中心,還有 Redis锭魔、Multicast例证、Simple 注冊中心,但不推薦迷捧。

6织咧、默認使用什么序列化框架,你知道的還有哪些漠秋?

推薦使用 Hessian 序列化笙蒙,還有 Duddo、FastJson庆锦、Java 自帶序列化捅位。

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

服務(wù)失效踢出基于 zookeeper 的臨時節(jié)點原理艇搀。

8尿扯、服務(wù)上線怎么不影響舊版本?

采用多版本開發(fā)焰雕,不影響舊版本衷笋。

9、如何解決服務(wù)調(diào)用鏈過長的問題矩屁?

可以結(jié)合 zipkin 實現(xiàn)分布式服務(wù)追蹤辟宗。

10、說說核心的配置有哪些档插?

在這里插入圖片描述

11慢蜓、Dubbo 推薦用什么協(xié)議?

在這里插入圖片描述

12郭膛、同一個服務(wù)多個注冊的情況下可以直連某一個服務(wù)嗎?

可以點對點直連氛悬,修改配置即可则剃,也可以通過 telnet 直接某個服務(wù)。

13如捅、畫一畫服務(wù)注冊與發(fā)現(xiàn)的流程圖棍现?

在這里插入圖片描述

14、Dubbo 集群容錯有幾種方案镜遣?

在這里插入圖片描述

15己肮、Dubbo 服務(wù)降級,失敗重試怎么做悲关?

可以通過 dubbo:reference 中設(shè)置 mock="return null"谎僻。mock 的值也可以修改為 true,然后再跟接口同一個路徑下實現(xiàn)一個 Mock 類寓辱,命名規(guī)則是 “接口名稱+Mock” 后綴艘绍。然后在 Mock 類里實現(xiàn)自己的降級邏輯

16、Dubbo 使用過程中都遇到了些什么問題秫筏?

在注冊中心找不到對應(yīng)的服務(wù),檢查 service 實現(xiàn)類是否添加了@service 注解無法連接到注冊中心,檢查配置文件中的對應(yīng)的測試 ip 是否正確

17诱鞠、Dubbo Monitor 實現(xiàn)原理?

Consumer 端在發(fā)起調(diào)用之前會先走 filter 鏈这敬;provider 端在接收到請求時也是先走 filter 鏈航夺,然后才進行真正的業(yè)務(wù)邏輯處理。默認情況下崔涂,在 consumer 和 provider 的 filter 鏈中都會有 Monitorfilter阳掐。

  1. MonitorFilter 向 DubboMonitor 發(fā)送數(shù)據(jù)
  2. DubboMonitor 將數(shù)據(jù)進行聚合后(默認聚合 1min 中的統(tǒng)計數(shù)據(jù))暫存到ConcurrentMap<Statistics, AtomicReference> statisticsMap,然后使用一個含有 3 個線程(線程名字:DubboMonitorSendTimer)的線程池每隔 1min 鐘,調(diào)用 SimpleMonitorService 遍歷發(fā)送 statisticsMap 中的統(tǒng)計數(shù)據(jù)锚烦,每發(fā)送完畢一個觅闽,就重置當前的 Statistics 的 AtomicReference
  3. SimpleMonitorService 將這些聚合數(shù)據(jù)塞入 BlockingQueue queue 中(隊列大寫為 100000)
  4. SimpleMonitorService 使用一個后臺線程(線程名為:DubboMonitorAsyncWriteLogThread)將 queue 中的數(shù)據(jù)寫入文件(該線程以死循環(huán)的形式來寫)
  5. SimpleMonitorService 還會使用一個含有 1 個線程(線程名字:DubboMonitorTimer)的線程池每隔 5min 鐘,將文件中的統(tǒng)計數(shù)據(jù)畫成圖表

18涮俄、Dubbo 用到哪些設(shè)計模式蛉拙?

Dubbo 框架在初始化和通信過程中使用了多種設(shè)計模式,可靈活控制類加載彻亲、權(quán)限控制等功能孕锄。
工廠模式
Provider 在 export 服務(wù)時,會調(diào)用 ServiceConfig 的 export 方法苞尝。ServiceConfig中有個字段:

private static final Protocol protocol =
ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtensi
on();

Dubbo 里有很多這種代碼畸肆。這也是一種工廠模式,只是實現(xiàn)類的獲取采用了 JDKSPI 的機制宙址。這么實現(xiàn)的優(yōu)點是可擴展性強轴脐,想要擴展實現(xiàn),只需要在 classpath下增加個文件就可以了抡砂,代碼零侵入大咱。另外,像上面的 Adaptive 實現(xiàn)注益,可以做到調(diào)用時動態(tài)決定調(diào)用哪個實現(xiàn)碴巾,但是由于這種實現(xiàn)采用了動態(tài)代理,會造成代碼調(diào)試比較麻煩丑搔,需要分析出實際調(diào)用的實現(xiàn)類厦瓢。

裝飾器模式
Dubbo 在啟動和調(diào)用階段都大量使用了裝飾器模式。以 Provider 提供的調(diào)用鏈為例啤月,具體的調(diào)用鏈代碼是在 ProtocolFilterWrapper 的 buildInvokerChain 完成的煮仇,具體是將注解中含有 group=provider 的 Filter 實現(xiàn),按照 order 排序顽冶,最后的調(diào)用順序是:

EchoFilter -> ClassLoaderFilter -> GenericFilter -> ContextFilter ->
ExecuteLimitFilter -> TraceFilter -> TimeoutFilter -> MonitorFilter ->
ExceptionFilter

更確切地說欺抗,這里是裝飾器和責任鏈模式的混合使用。例如强重,EchoFilter 的作用是判斷是否是回聲測試請求绞呈,是的話直接返回內(nèi)容,這是一種責任鏈的體現(xiàn)间景。而像ClassLoaderFilter 則只是在主功能上添加了功能佃声,更改當前線程的 ClassLoader,這是典型的裝飾器模式倘要。

觀察者模式

Dubbo 的 Provider 啟動時圾亏,需要與注冊中心交互十拣,先注冊自己的服務(wù),再訂閱自己的服務(wù)志鹃,訂閱時夭问,采用了觀察者模式,開啟一個 listener曹铃。注冊中心會每 5 秒定時檢查是否有服務(wù)更新缰趋,如果有更新,向該服務(wù)的提供者發(fā)送一個 notify 消息陕见,provider 接受到 notify 消息后秘血,運行 NotifyListener 的 notify 方法,執(zhí)行監(jiān)聽器方法评甜。

動態(tài)代理模式

Dubbo 擴展 JDK SPI 的類 ExtensionLoader 的 Adaptive 實現(xiàn)是典型的動態(tài)代理實現(xiàn)灰粮。Dubbo 需要靈活地控制實現(xiàn)類,即在調(diào)用階段動態(tài)地根據(jù)參數(shù)決定調(diào)用哪個實現(xiàn)類忍坷,所以采用先生成代理類的方法烧给,能夠做到靈活的調(diào)用或详。生成代理類的代碼是 ExtensionLoader 的 createAdaptiveExtensionClassCode 方法磕蒲。代理類主要邏輯是稠屠,獲取 URL 參數(shù)中指定參數(shù)的值作為獲取實現(xiàn)類的 key。

19韧骗、Dubbo 配置文件是如何加載到 Spring 中的?

Spring 容器在啟動的時候零聚,會讀取到 Spring 默認的一些 schema 以及 Dubbo 自定義的 schema袍暴,每個 schema 都會對應(yīng)一個自己的 NamespaceHandler,NamespaceHandler 里面通過 BeanDefinitionParser 來解析配置信息并轉(zhuǎn)化為需要加載的 bean 對象隶症!

在這里插入圖片描述

20政模、Dubbo SPI 和 Java SPI 區(qū)別?

JDK SPI:
JDK 標準的 SPI 會一次性加載所有的擴展實現(xiàn)蚂会,如果有的擴展吃實話很耗時淋样,但也沒用上,很浪費資源胁住。所以只希望加載某個的實現(xiàn)趁猴,就不現(xiàn)實了
DUBBO SPI:

1、對 Dubbo 進行擴展彪见,不需要改動 Dubbo 的源碼

2儡司、延遲加載,可以一次只加載自己想要加載的擴展實現(xiàn)余指。

3捕犬、增加了對擴展點 IOC 和 AOP 的支持,一個擴展點可以直接 setter 注入其它擴展點。

4碉碉、Dubbo 的擴展機制能很好的支持第三方 IoC 容器柴钻,默認支持 Spring Bean。

21垢粮、Dubbo 支持分布式事務(wù)嗎贴届?

目前暫時不支持,可與通過 tcc-transaction 框架實現(xiàn)
介紹:tcc-transaction 是開源的 TCC 補償性分布式事務(wù)框架
TCC-Transaction 通過 Dubbo 隱式傳參的功能足丢,避免自己對業(yè)務(wù)代碼的入侵粱腻。

22、Dubbo 可以對結(jié)果進行緩存嗎斩跌?

為了提高數(shù)據(jù)訪問的速度绍些。Dubbo 提供了聲明式緩存,以減少用戶加緩存的工作量<dubbo:reference cache="true" />
其實比普通的配置文件就多了一個標簽 cache="true"

23耀鸦、服務(wù)上線怎么兼容舊版本柬批?

可以用版本號(version)過渡,多個不同版本的服務(wù)注冊到注冊中心袖订,版本號不同的服務(wù)相互間不引用氮帐。這個和服務(wù)分組的概念有一點類似。

24洛姑、Dubbo 必須依賴的包有哪些上沐?

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

25参咙、Dubbo telnet 命令能做什么?

dubbo 服務(wù)發(fā)布之后硫眯,我們可以利用 telnet 命令進行調(diào)試蕴侧、管理。Dubbo2.0.5 以上版本服務(wù)提供端口支持 telnet 命令
連接服務(wù)
telnet localhost 20880 //鍵入回車進入 Dubbo 命令模式两入。
查看服務(wù)列表

dubbo>ls
com.test.TestService
dubbo>ls com.test.TestService
create
delete
query

· ls (list services and methods)
· ls : 顯示服務(wù)列表净宵。
· ls -l : 顯示服務(wù)詳細信息列表。
· ls XxxService:顯示服務(wù)的方法列表裹纳。
· ls -l XxxService:顯示服務(wù)的方法詳細信息列表择葡。

26、Dubbo 支持服務(wù)降級嗎痊夭?

以通過 dubbo:reference 中設(shè)置 mock="return null"刁岸。mock 的值也可以修改為 true,然后再跟接口同一個路徑下實現(xiàn)一個 Mock 類她我,命名規(guī)則是 “接口名稱+Mock” 后綴虹曙。然后在 Mock 類里實現(xiàn)自己的降級邏輯

27迫横、Dubbo 如何優(yōu)雅停機?

Dubbo 是通過 JDK 的 ShutdownHook 來完成優(yōu)雅停機的酝碳,所以如果使用kill -9 PID 等強制關(guān)閉指令矾踱,是不會執(zhí)行優(yōu)雅停機的,只有通過 kill PID 時疏哗,才會執(zhí)行呛讲。
28、Dubbo 和 Dubbox 之間的區(qū)別返奉?

Dubbox 是繼 Dubbo 停止維護后贝搁,當當網(wǎng)基于 Dubbo 做的一個擴展項目,如加了服務(wù)可 Restful 調(diào)用芽偏,更新了開源組件等雷逆。

29、Dubbo 和 Spring Cloud 的區(qū)別污尉?

根據(jù)微服務(wù)架構(gòu)在各方面的要素膀哲,看看 Spring Cloud 和 Dubbo 都提供了哪些支持。

在這里插入圖片描述

使用 Dubbo 構(gòu)建的微服務(wù)架構(gòu)就像組裝電腦被碗,各環(huán)節(jié)我們的選擇自由度很高某宪,但是最終結(jié)果很有可能因為一條內(nèi)存質(zhì)量不行就點不亮了,總是讓人不怎么放心锐朴,但是如果你是一名高手兴喂,那這些都不是問題;而 Spring Cloud 就像品牌機焚志,在Spring Source 的整合下瞻想,做了大量的兼容性測試,保證了機器擁有更高的穩(wěn)定性娩嚼,但是如果要在使用非原裝組件外的東西,就需要對其基礎(chǔ)有足夠的了解滴肿。

30岳悟、你還了解別的分布式框架嗎?

別的還有 spring 的 spring cloud泼差,facebook 的 thrift贵少,twitter 的 finagle 等

file
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市堆缘,隨后出現(xiàn)的幾起案子滔灶,更是在濱河造成了極大的恐慌,老刑警劉巖吼肥,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件录平,死亡現(xiàn)場離奇詭異麻车,居然都是意外死亡,警方通過查閱死者的電腦和手機斗这,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門动猬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人表箭,你說我怎么就攤上這事赁咙。” “怎么了免钻?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵彼水,是天一觀的道長。 經(jīng)常有香客問我极舔,道長凤覆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任姆怪,我火速辦了婚禮叛赚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘稽揭。我一直安慰自己俺附,他們只是感情好,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布溪掀。 她就那樣靜靜地躺著事镣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪揪胃。 梳的紋絲不亂的頭發(fā)上璃哟,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機與錄音喊递,去河邊找鬼随闪。 笑死,一個胖子當著我的面吹牛骚勘,可吹牛的內(nèi)容都是我干的铐伴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼俏讹,長吁一口氣:“原來是場噩夢啊……” “哼当宴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起泽疆,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤户矢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后殉疼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梯浪,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡捌年,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了驱证。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片延窜。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖抹锄,靈堂內(nèi)的尸體忽然破棺而出逆瑞,到底是詐尸還是另有隱情,我是刑警寧澤伙单,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布获高,位于F島的核電站,受9級特大地震影響吻育,放射性物質(zhì)發(fā)生泄漏念秧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一布疼、第九天 我趴在偏房一處隱蔽的房頂上張望摊趾。 院中可真熱鬧,春花似錦游两、人聲如沸砾层。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肛炮。三九已至,卻和暖如春宝踪,著一層夾襖步出監(jiān)牢的瞬間侨糟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工瘩燥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留秕重,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓厉膀,卻偏偏與公主長得像悲幅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子站蝠,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355