2020年Dubbo30道高頻面試題!還在為面試煩惱趕快來看看!
阿新 • • 發佈:2020-07-17
# 前言
Dubbo是一個分散式服務框架,致力於提供高效能和透明化的RPC遠端服務呼叫方案,以及SOA服務治理方案。簡單的說,dubbo就是個服務框架,如果沒有分散式的需求,其實是不需要用的,只有在分散式的時候,才有dubbo這樣的分散式服務框架的需求,並且本質上是個服務呼叫的東東,說白了就是個遠端服務呼叫的分散式框架(告別Web Service模式中的WSdl,以服務者與消費者的方式在dubbo上註冊)。
![在這裡插入圖片描述](https://img2020.cnblogs.com/other/1973721/202007/1973721-20200717193315185-1784371578.png)
很多時候,其實我們使用這個技術的時候,可能都是因為專案需要,所以,我們就用了,但是,至於為什麼我們需要用到這個技術,可能自身並不是很瞭解的,但是,其實瞭解技術的來由及背景知識,對於理解一項技術還是有幫助的。
關於Dubbo的知識總結了個思維導圖
![在這裡插入圖片描述](https://img2020.cnblogs.com/other/1973721/202007/1973721-20200717193315883-240741649.jpg)
# Dubbo 面試題
> 1、為什麼要用 Dubbo?
>
> 2、Dubbo 的整體架構設計有哪些分層?
>
> 3、預設使用的是什麼通訊框架,還有別的選擇嗎?
>
> 4、服務呼叫是阻塞的嗎?
>
> 5、一般使用什麼註冊中心?還有別的選擇嗎?
>
> 6、預設使用什麼序列化框架,你知道的還有哪些?
>
> 7、服務提供者能實現失效踢出是什麼原理?
>
> 8、服務上線怎麼不影響舊版本?
>
> 9、如何解決服務呼叫鏈過長的問題?
>
> 10、說說核心的配置有哪些?
>
> 11、Dubbo 推薦用什麼協議?
>
> 12、同一個服務多個註冊的情況下可以直連某一個服務嗎?
>
> 13、畫一畫服務註冊與發現的流程圖?
>
> 14、Dubbo 叢集容錯有幾種方案?
>
> 15、Dubbo 服務降級,失敗重試怎麼做?
>
> 16、Dubbo 使用過程中都遇到了些什麼問題?
>
> 17、Dubbo Monitor 實現原理?
>
> 18、Dubbo 用到哪些設計模式?
>
> 19、Dubbo 配置檔案是如何載入到 Spring 中的?
>
> 20、Dubbo SPI 和 Java SPI 區別?
>
> 21、Dubbo 支援分散式事務嗎?
>
> 22、Dubbo 可以對結果進行快取嗎?
>
> 23、服務上線怎麼相容舊版本?
>
> 24、Dubbo 必須依賴的包有哪些?
>
> 25、Dubbo telnet 命令能做什麼?
>
> 26、Dubbo 支援服務降級嗎?
>
> 27、Dubbo 如何優雅停機?
>
> 28、Dubbo 和 Dubbox 之間的區別?
>
> 29、Dubbo 和 Spring Cloud 的區別?
>
> 30、你還了解別的分散式框架嗎?
![在這裡插入圖片描述](https://img2020.cnblogs.com/other/1973721/202007/1973721-20200717193317907-1313908115.png)
**下面是Dubbo 面試題答案解析**
# 1、為什麼要用 Dubbo?
隨著服務化的進一步發展,服務越來越多,服務之間的呼叫和依賴關係也越來越複雜,誕生了面向服務的架構體系(SOA),也因此衍生出了一系列相應的技術,如對服務提供、服務呼叫、連線處理、通訊協議、序列化方式、服務發現、服務路由、日誌輸出等行為進行封裝的服務框架。就這樣為分散式系統的服務治理框架就出現了,Dubbo 也就這樣產生了。
# 2、Dubbo 的整體架構設計有哪些分層?
> 介面服務層(Service):該層與業務邏輯相關,根據 provider 和 consumer 的業務設計對應的介面和實現
>
> 配置層(Config):對外配置介面,以 ServiceConfig 和 ReferenceConfig 為中心
>
> 服務代理層(Proxy):服務介面透明代理,生成服務的客戶端 Stub 和 服務端的 Skeleton,以 ServiceProxy 為中心,擴充套件介面為 ProxyFactory
>
> 服務註冊層(Registry):封裝服務地址的註冊和發現,以服務 URL 為中心,擴充套件介面為 RegistryFactory、Registry、RegistryService
>
> 路由層(Cluster):封裝多個提供者的路由和負載均衡,並橋接註冊中心,以Invoker 為中心,擴充套件介面為 Cluster、Directory、Router 和 LoadBlancce
>
> 監控層(Monitor):RPC 呼叫次數和呼叫時間監控,以 Statistics 為中心,擴充套件介面為 MonitorFactory、Monitor 和 MonitorService
>
> 遠端呼叫層(Protocal):封裝 RPC 呼叫,以 Invocation 和 Result 為中心,擴充套件介面為 Protocal、Invoker 和 Exporter
>
> 資訊交換層(Exchange):封裝請求響應模式,同步轉非同步。以 Request 和Response 為中心,擴充套件介面為 Exchanger、ExchangeChannel、ExchangeClient 和 ExchangeServer
>
> 網路 傳輸 層(Transport):抽象 mina 和 netty 為統一介面,以 Message 為中心,擴充套件介面為 Channel、Transporter、Client、Server 和 Codec
>
> 資料序列化層(Serialize):可複用的一些工具,擴充套件介面為 Serialization、ObjectInput、ObjectOutput 和 ThreadPool
# 3、預設使用的是什麼通訊框架,還有別的選擇嗎?
預設也推薦使用 netty 框架,還有 mina。
# 4、服務呼叫是阻塞的嗎?
預設是阻塞的,可以非同步呼叫,沒有返回值的可以這麼做。Dubbo 是基於 NIO 的非阻塞實現並行呼叫,客戶端不需要啟動多執行緒即可完成並行呼叫多個遠端服務,相對多執行緒開銷較小,非同步呼叫會返回一個 Future 物件。
# 5、一般使用什麼註冊中心?還有別的選擇嗎?
推薦使用 Zookeeper 作為註冊中心,還有 Redis、Multicast、Simple 註冊中心,但不推薦。
# 6、預設使用什麼序列化框架,你知道的還有哪些?
推薦使用 Hessian 序列化,還有 Duddo、FastJson、Java 自帶序列化。
# 7、服務提供者能實現失效踢出是什麼原理?
服務失效踢出基於 zookeeper 的臨時節點原理。
# 8、服務上線怎麼不影響舊版本?
採用多版本開發,不影響舊版本。
# 9、如何解決服務呼叫鏈過長的問題?
可以結合 zipkin 實現分散式服務追蹤。
# 10、說說核心的配置有哪些?
![在這裡插入圖片描述](https://img2020.cnblogs.com/other/1973721/202007/1973721-20200717193318932-1961921000.png)
# 11、Dubbo 推薦用什麼協議?
![在這裡插入圖片描述](https://img2020.cnblogs.com/other/1973721/202007/1973721-20200717193319804-1258780594.png)
# 12、同一個服務多個註冊的情況下可以直連某一個服務嗎?
可以點對點直連,修改配置即可,也可以通過 telnet 直接某個服務。
# 13、畫一畫服務註冊與發現的流程圖?
![在這裡插入圖片描述](https://img2020.cnblogs.com/other/1973721/202007/1973721-20200717193320316-820938168.png)
14、Dubbo 叢集容錯有幾種方案?
![在這裡插入圖片描述](https://img2020.cnblogs.com/other/1973721/202007/1973721-20200717193320731-577064467.png)
## 15、Dubbo 服務降級,失敗重試怎麼做?
可以通過 dubbo:reference 中設定 mock="return null"。mock 的值也可以修改為 true,然後再跟介面同一個路徑下實現一個 Mock 類,命名規則是 “介面名稱+Mock” 字尾。然後在 Mock 類裡實現自己的降級邏輯
## 16、Dubbo 使用過程中都遇到了些什麼問題?
在註冊中心找不到對應的服務,檢查 service 實現類是否添加了@service 註解無法連線到註冊中心,檢查配置檔案中的對應的測試 ip 是否正確
## 17、Dubbo Monitor 實現原理?
Consumer 端在發起呼叫之前會先走 filter 鏈;provider 端在接收到請求時也是先走 filter 鏈,然後才進行真正的業務邏輯處理。預設情況下,在 consumer 和 provider 的 filter 鏈中都會有 Monitorfilter。
1. MonitorFilter 向 DubboMonitor 傳送資料
2. DubboMonitor 將資料進行聚合後(預設聚合 1min 中的統計資料)暫存到Concu