Dubbo面試題整理筆記

Dubbo常問面試題


1.Dubbo是什麼

  • Apache Dubbo™ 是一款高性能、輕量級Java RPC框架
  • 三大核心能力:面向接口的遠程方法調用,智能容錯和負載均衡,以及服務自動註冊和發現。

節點角色說明

節點 角色說明
Provider 暴露服務的服務提供方
Consumer 調用遠程服務的服務消費方
Registry 服務註冊與發現的註冊中心
Monitor 統計服務的調用次數和調用時間的監控中心
Container 服務運行容器

調用關係說明

  1. 服務容器負責啓動,加載,運行服務提供者。
  2. 服務提供者在啓動時,向註冊中心註冊自己提供的服務。
  3. 服務消費者在啓動時,向註冊中心訂閱自己所需的服務。
  4. 註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連接推送變更數據給消費者。
  5. 服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,如果調用失敗,再選另一臺調用。
  6. 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。

2.dubbo的核心服務是什麼?

  • 面向接口代理的高性能RPC調用:提供高性能的基於代理的遠程調用能力,服務以接口爲粒度,爲開發者屏蔽遠程調用底層細節。
  • 智能負載均衡:內置多種負載均衡策略,智能感知下游節點健康狀況,顯著減少調用延遲,提高系統吞吐量。

  • 服務自動註冊與發現:支持多種註冊中心服務,服務實例上下線實時感知。

  • 高度可擴展能力:遵循微內核+插件的設計原則,所有核心能力如Protocol、Transport、Serialization被設計爲擴展點,平等對待內置實現和第三方實現。

  • 運行期流量調度:內置條件、腳本等路由策略,通過配置不同的路由規則,輕鬆實現灰度發佈,同機房優先等功能。

  • 可視化的服務治理與運維:提供豐富服務治理、運維工具:隨時查詢服務元數據、服務健康狀態及調用統計,實時下發路由策略、調整配置參數。

3.dubbo能做什麼?

  • 透明化的遠程方法調用,就像調用本地方法一樣調用遠程方法
  • 軟負載均衡及容錯機制,可在內網替代F5等硬件負載均衡器,降低成本,減少單點
  • 服務自動註冊與發現,不再需要寫死服務提供方地址,註冊中心基於接口名查詢服務提供者的IP地址,並且能夠平滑添加或刪除服務提供者。

4.服務提供者暴露一個服務的詳細過程

服務提供者暴露服務的主過程:

  - 具體服務 轉換爲Invoker
    ServiceConfig類拿到對外提供服務的實際類ref,然後通過ProxyFactory類的getInvoker方法使用ref生成一個AbstractProxyInvoker實例

  - Invoker轉換爲Exporter

   Dubbo處理服務暴露的關鍵就在Invoker轉換到Exporter的過程,下面我們以Dubbo和rmi這兩種典型協議的實現。

   Dubbo 的實現

      Dubbo 協議的 Invoker 轉爲 Exporter 發生在 DubboProtocol 類的 export 方法,它主要是打開 socket 偵聽服務,並接收客戶端發來的各種請求,通訊細節由 Dubbo 自己實現。

   RMI 的實現

      RMI 協議的 Invoker 轉爲 Exporter 發生在 RmiProtocol類的 export 方法,它通過 Spring 或 Dubbo 或 JDK 來實現 RMI 服務,通訊細節這一塊由 JDK 底層來實現,這就省了不少工作量。

5.服務消費者消費一個服務的詳細過程

       

 

服務消費的主過程: 
首先 ReferenceConfig 類的 init 方法調用 Protocol 的 refer 方法生成 Invoker 實例(如上圖中的紅色部分),這是服務消費的關鍵。接下來把 Invoker 轉換爲客戶端需要的接口(如:HelloWorld)。

6. 什麼情況下適用dubbo協議,什麼時候適用rmi協議?

Dubbo支持dubbo、rmi、hessian、http、webservice、thrift、redis等多種協議,但是dubbo協議是官網推薦使用的。

  • dubbo 缺省協議是dubbo協議,採用單一長連接和 NIO 異步通訊,適合於小數據量大併發的服務調用,以及服務消費者機器數遠大於服務提供者機器數的情況。反之,Dubbo 缺省協議不適合傳送大數據量的服務,比如傳文件,傳視頻等,除非請求量很低。
  • RMI協議採用阻塞式(同步)短連接和 JDK 標準序列化方式。適用範圍:傳入傳出參數數據包大小混合,消費者與提供者個數差不多,可傳文件。

7. Dubbo有幾種容錯機制

什麼是容錯機制?容錯機制指的是某中系統控制在一定範圍的一種允許或包容犯錯情況的發生,舉個簡單的例子,我們在電腦上運行一個程序,有時候會出現無響應的情況,然後系統回彈出一個提示框讓我們選擇,是立即結束還是繼續等待,然後根據我們的選擇執行對應的操作,這就是“容錯”。

   在分佈式架構下,網絡,硬件,應用都可以發生故障,由於各個服務之間可能存在依賴關係,如果一條鏈路中的某一個節點出現故障,將會導致雪崩效應。爲了減少某一個節點故障的影響範圍,所以我們才需要去構建容錯服務,來優雅的處理這種中斷的響應結果
 

Failover Cluster

失敗自動切換,當出現失敗,重試其它服務器 [1]。通常用於讀操作,但重試會帶來更長延遲。可通過 retries="2" 來設置重試次數(不含第一次)。

重試次數配置如下:

<dubbo:service retries="2" />

<dubbo:reference retries="2" />

<dubbo:reference>
    <dubbo:method name="findFoo" retries="2" />
</dubbo:reference>

Failfast Cluster

快速失敗,只發起一次調用,失敗立即報錯。通常用於非冪等性的寫操作,比如新增記錄。

Failsafe Cluster

失敗安全,出現異常時,直接忽略。通常用於寫入審計日誌等操作。

Failback Cluster

失敗自動恢復,後臺記錄失敗請求,定時重發。通常用於消息通知操作。

Forking Cluster

並行調用多個服務器,只要一個成功即返回。通常用於實時性要求較高的讀操作,但需要浪費更多服務資源。可通過 forks="2" 來設置最大並行數。

Broadcast Cluster

廣播調用所有提供者,逐個調用,任意一臺報錯則報錯 [2]。通常用於通知所有提供者更新緩存或日誌等本地資源信息

8.dubbo的服務降級

降級的目的是爲了保證核心服務可用

降級可以有幾個層面的分類:自動降級,人工降級;按照功能可以分爲:讀服務降級和寫服務降級;

1.對一些非核心服務進行人工降級,在大促之前通過降級開關關閉那些推薦內容,評價等對主流程序沒有影響的功能

2.故障降級,比如調用的遠程服務掛了,網絡故障,或者RPC服務返回異常。那麼可以直接降級,降級的方案比如設置默認值,採用兜底數據(系統推薦的行爲廣告掛了,可以提前準備靜態頁面做返回)等等

3.限流降級,在秒殺這種流量比較集中並且流量特別大的情況下,因爲突發訪問量特別大可能導致系統支撐不了。這個時候可以採用限流來限制訪問量。當達到閾值時,後續的請求被降級,比如進入排隊頁面,比如跳轉到錯誤頁面(活動火爆,請稍後重試)

Dubbo的降級方式:Mock

實現步驟

1.在client端創建一個testmock類,實現對應的IGphello的接口(需要對哪個接口進行mock,就實現哪個)名稱必須以mock結尾

2.在client端的xml配置文件中,添加如下配置,增加一個mock屬性指向創建的testmock

3.模擬錯誤(設置timeout)模擬超時異常,運行測試代碼即可訪問到testmock這個類,當服務端故障解除以後,調用過程將恢復正常

9. dubbo的優先級配置

配置優先級別

1.以timeout爲例,顯示了配置的查找順序,其他retries,loadbalance等類似。

(1)方法級優先,接口級次之,全局配置在次之

(2)如果級別一樣,則消費方優先,提供方次之

(3)其中,服務提供方配置,通過URL經由註冊中心傳遞給消費方

2.建議由服務提供方設置超時,因爲一個方法需要執行多長時間,服務提供方更清楚,如果一個消費方同時引用多個服務,就不需要關心每個服務的超時設置。
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發佈了37 篇原創文章 · 獲贊 24 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章