Java面試被問到Dubbo,怎麼回答可以得高分?

張哥說技術發表於2023-04-10

來源:哪吒程式設計

面試中被問到dubbo,我覺得可以從以下10點著手回答,堪稱完美!

Dubbo是一個高效能的Java RPC框架。RPC是遠端過程呼叫的縮寫,其基本思想是:客戶端像呼叫本地方法一樣,透過網路請求呼叫遠端伺服器上的服務。Dubbo可以幫助我們更方便地構建分散式應用程式,它具有高效的遠端呼叫、服務自動註冊和發現、負載均衡、容錯機制等眾多特性,是企業級應用中可靠的基礎架構。

三分鐘你將學會:

  1. 瞭解Dubbo是什麼?

  2. 全方位瞭解Dubbo
  3. 瞭解Dubbo的架構
  4. 如何正確地配置Dubbo?
  5. Dubbo的高可用與容錯
  6. Dubbo的負載均衡策略
  7. Dubbo的叢集容錯機制
  8. Dubbo的底層通訊
  9. Dubbo的擴充套件機制
  10. Dubbo的未來發展趨勢

Java面試被問到Dubbo,怎麼回答可以得高分?

一、介紹

1、Dubbo是什麼

Dubbo是一種高效能、輕量級的分散式服務框架,它的設計目標是為大規模分散式應用提供支援。

Dubbo由阿里巴巴提供,最初由Alibaba Dubbo Team開發,目前已經成為Apache基金會的頂級專案。Dubbo在國內得到了廣泛的應用,像阿里巴巴、京東、美團等眾多網際網路企業都在使用該框架。

Java面試被問到Dubbo,怎麼回答可以得高分?

2、為什麼需要Dubbo

在分散式系統中,服務之間相互依賴非常複雜,需要大量的通訊和協調。Dubbo可以幫助我們更方便地構建分散式應用程式,它具有高效的遠端呼叫、服務自動註冊和發現、負載均衡、容錯機制等眾多特性。透過Dubbo,我們可以更方便地實現服務治理、服務呼叫鏈追蹤、服務降級、服務熔斷等重要功能。

3、Dubbo的特性

Dubbo最重要的特性包括:

  • 高效的遠端呼叫,支援多種傳輸協議、序列化協議和叢集容錯機制;
  • 可擴充套件的服務自動發現,支援多種註冊中心;
  • 豐富的負載均衡策略,支援輪詢、隨機、最少活躍呼叫等多種策略;
  • 靈活的叢集容錯機制,支援多種容錯策略;
  • 多協議支援,Dubbo同時支援dubbo://、http://和hessian://等多種協議。

Java面試被問到Dubbo,怎麼回答可以得高分?

二、Dubbo的核心概念

1、暴露Export

Dubbo的暴露和引用是透過ProviderConfig和ConsumerConfig實現的。

ProviderConfig是服務提供者配置類,可以用於配置服務的介面、服務實現類、協議等,還可以設定暴露服務所用的協議、權重、埠號等資訊。

ConsumerConfig是服務消費者配置類,可以用於配置服務消費者所介面、協議等資訊,還可以設定引用服務所用的協議、叢集等資訊。

Java面試被問到Dubbo,怎麼回答可以得高分?
  1. 暴露過程中,首先需要解析配置,根據配置中的協議建立相應的協議實現;
  2. 將協議繫結到指定的 IP 和埠上;
  3. 將服務地址資訊註冊到註冊中心,以供其他呼叫者查詢;
  4. 通知訂閱者(監聽器)服務地址資訊的變化;
  5. 呼叫者接收到訂閱者的通知,得知服務地址資訊變化;
  6. 呼叫者透過網路層向提供者發起呼叫請求;
  7. 提供者處理請求後,返回結果給呼叫者。

2、引用Refer

引用的過程類似,只是方向相反,具體如下:

Java面試被問到Dubbo,怎麼回答可以得高分?
  1. 引用過程中,同樣需要解析配置,根據配置中的協議建立相應的協議實現;
  2. 連線到指定的服務地址;
  3. 查詢註冊中心,獲取對應服務地址資訊;
  4. 返回服務地址資訊給呼叫者;
  5. 提供者處理呼叫請求,返回結果給呼叫者;
  6. 呼叫者接收到結果,結束呼叫過程。

Java面試被問到Dubbo,怎麼回答可以得高分?

3、服務提供者和服務消費者

Dubbo的服務提供者是指提供服務的主體,通常會暴露自己的服務介面,並透過某種協議提供服務。而服務消費者是使用服務的主體,通常會引用提供者的服務介面,並透過某種協議呼叫服務。

Java面試被問到Dubbo,怎麼回答可以得高分?
  • 服務提供者向 Zookeeper 註冊服務,服務消費者向 Zookeeper 訂閱服務;
  • 服務消費者透過 Zookeeper 獲取服務提供者的地址資訊,然後呼叫服務提供者的服務。

4、註冊中心

Dubbo最核心的概念就是註冊中心,它用於管理服務提供者的註冊與發現,使服務消費者能夠動態地發現和訪問服務提供者。Dubbo支援多種註冊中心,包括Zookeeper、Redis、Multicast等等,其中Zookeeper是Dubbo預設的註冊中心。

Java面試被問到Dubbo,怎麼回答可以得高分?
  • 服務提供者將自己提供的服務註冊到註冊中心。

  • 服務消費者從註冊中心訂閱所需的服務列表。

  • 註冊中心返回可用的服務列表給服務提供者和服務消費者。

  • 服務消費者呼叫服務提供者的服務。

  • 服務提供者返回服務結果給服務消費者。

5、負載均衡

Dubbo 的負載均衡是指服務消費者在呼叫服務提供者的時候,如何從多個服務提供者中選擇一個進行呼叫。

Dubbo 預設提供了多種負載均衡策略,例如隨機、輪詢、最少活躍數等。服務消費者透過 Dubbo 的負載均衡模組,將請求分發給多個服務提供者,然後由負載均衡模組根據選定的負載均衡策略選擇一個服務提供者進行呼叫,從而達到分攤負載的效果。

Java面試被問到Dubbo,怎麼回答可以得高分?

在圖中,服務消費者 A 需要呼叫一個服務提供者,但是有多個服務提供者可供選擇,這時候負載均衡 B 就發揮作用了。B 會根據負載均衡策略,選擇一個服務提供者進行呼叫,例如選擇了服務提供者1 C。如果 C 發生故障或當機,B 就會重新選擇一個可用的服務提供者,例如選擇了服務提供者2 D。這樣,服務消費者 A 就可以透過 Dubbo 的負載均衡模組,動態地選擇服務提供者,從而實現負載均衡。

6、叢集容錯

Dubbo的叢集容錯是指當服務提供者發生故障時,Dubbo如何從備選節點中選擇一個可用的節點讓服務消費者訪問。Dubbo提供了多種叢集容錯策略,包括快速失敗、失敗切換、失敗重試等等,可以根據需求選擇適合的策略。

Java面試被問到Dubbo,怎麼回答可以得高分?
  • Consumer:服務的消費者,發起服務呼叫的一方。
  • Invoker:Dubbo 中的呼叫器,將消費者的請求轉換成可執行的任務並執行。
  • Cluster:Dubbo 中的叢集容錯模組,將多個 Invoker 封裝成一個叢集。
  • Failover:Dubbo 叢集容錯模組中的容錯策略之一,如果某次呼叫失敗,會自動切換到下一個 Invoker 進行呼叫,直到成功為止。
  • Failfast:Dubbo 叢集容錯模組中的容錯策略之一,如果某次呼叫失敗,會立即丟擲異常。
  • Failsafe:Dubbo 叢集容錯模組中的容錯策略之一,如果某次呼叫失敗,會記錄下異常,但不會丟擲異常。
  • Failback:Dubbo 叢集容錯模組中的容錯策略之一,如果某次呼叫失敗,會在後臺非同步重試。
  • Forking:Dubbo 叢集容錯模組中的容錯策略之一,將請求併發呼叫多個 Invoker,只要有一個 Invoker 成功返回結果,就立即返回。

Java面試被問到Dubbo,怎麼回答可以得高分?

三、Dubbo的架構

1、服務提供者和服務消費者之間的通訊流程

在Dubbo中,服務提供者和服務消費者之間的通訊流程較為複雜,涉及到多個角色的互動。

下面簡要介紹Dubbo的通訊流程:

  1. 服務消費者向註冊中心發起服務發現請求,獲取服務列表。
  2. 註冊中心返回服務列表給服務消費者。
  3. 服務消費者根據負載均衡策略選擇一個服務提供者。
  4. 服務提供者返回自身的 IP 地址和埠號給服務消費者。
  5. 服務消費者透過網路向服務提供者傳送請求訊息。
  6. 服務提供者處理請求並返回響應訊息給服務消費者。
Java面試被問到Dubbo,怎麼回答可以得高分?

整個通訊流程中,Dubbo使用了類似RPC(Remote Procedure Call)的方式進行通訊,即服務消費者傳送請求給服務提供者,服務提供者返回結果給服務消費者。

Dubbo的主要區別在於,Dubbo支援多種協議和序列化機制,同時還提供了負載均衡、叢集容錯等功能。

2、Dubbo的三層架構

Dubbo的三層架構包括:

(1)介面層

介面層是Dubbo的核心,它定義了服務提供者和服務消費者之間的通訊介面。在Dubbo中,介面預設使用Java介面實現,具有很強的可擴充套件性。

(2)配置層

配置層的作用是透過配置檔案或程式碼來配置Dubbo的各種引數,包括連線引數、超時時間、重試次數等等。Dubbo支援多種配置方式,包括XML配置、註解配置和屬性配置。

(3)基礎設施層

基礎設施層是Dubbo的底層架構,包括了Dubbo的RPC框架、網路通訊、序列化和反序列化等實現細節。Dubbo的基礎設施層具有較高的效能和可定製性。

Java面試被問到Dubbo,怎麼回答可以得高分?

3、Dubbo的擴充套件機制

Dubbo提供了較為完善的擴充套件機制,使得開發者可以輕鬆改變Dubbo的預設行為,實現個性化定製。

Dubbo的擴充套件機制主要有三種:

(1)SPI機制

Dubbo使用了SPI(Service Provider Interface)機制,開發者可以透過在class path下提供指定的介面實現類來替換Dubbo框架預設的實現。在Dubbo中,SPI機制透過Java的ServiceLoader實現。

(2)Adaptive機制

Dubbo的Adaptive機制是對SPI機制的一種補充,它可以根據不同的場景自動適配最合適的實現類。Adaptive機制透過動態生成的代理類來實現。

(3)Extension機制

Extension機制是Dubbo的核心擴充套件機制,它允許開發者自定義Dubbo的各種外掛,包括Protocol、Transport和Serialization等。Extension機制透過@SPI和@Adaptive註解實現。開發者可以透過實現指定介面和在註解中指定擴充名,來實現自定義外掛的載入和使用。

Java面試被問到Dubbo,怎麼回答可以得高分?

四、Dubbo的配置

1、XML配置

Dubbo的XML配置是最早的配置方式,在配置過程中需要編寫XML檔案,指定Dubbo相關的標籤和屬性。其中,最基本的配置是服務提供者和服務消費者的相關配置,如下:

<!-- 服務提供者註冊到註冊中心 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>

<!-- 暴露服務 -->
<dubbo:service interface="com.xxx.xxxService" ref="xxxServiceImpl" timeout="3000" />

<!-- 引用服務 -->
<dubbo:reference interface="com.xxx.xxxService" id="xxxService" timeout="3000" />

在這段XML配置中,我們首先在標籤中指定了註冊中心的地址資訊,然後在標籤中指定了服務提供者的介面和實現類,以及引用服務的介面和實現。timeout屬性用於設定超時時間。

除了服務提供者和服務消費者的相關配置外,還有其他相關的配置。比如,可以使用<dubbo:protocol>標籤指定Dubbo使用的協議型別和埠號,同時也可以在<dubbo:method>標籤中為方法單獨指定超時時間等引數。

2、註解配置

註解配置是一種比較簡便的配置方式,可以直接在Java程式碼中使用註解指定Dubbo相關的配置資訊。使用註解配置時,需要在配置類中新增@EnableDubbo註解開啟Dubbo相關功能,示例如下:

@Configuration
@EnableDubbo(scanBasePackages = "com.xxx.service.impl")
public class DubboConfig {
}

其中,scanBasePackages屬性指定了Dubbo掃描的包路徑。然後就可以在服務提供者和服務消費者的實現類中使用Dubbo提供的註解進行配置,示例如下:

@Service(timeout = 3000)
public class XxxServiceImpl implements XxxService {
    
    @Override
    public String hello(String name) {
        return "Hello " + name;
    }
}

對於服務消費者,則可以使用@DubboReference註解引用服務,示例如下:

@Service
public class XxxConsumer {
  @DubboReference(timeout = 3000)
  private XxxService xxxService;

  public String hello(String name) {
      return xxxService.hello(name);
  }
}

在這個例子中,我們使用@DubboReference註解指定了服務的介面和超時時間,然後在XxxConsumer類中透過xxxService呼叫服務。

3、屬性配置

屬性配置是一種比較靈活的配置方式,它允許我們在配置檔案中定義屬性,然後在程式碼中讀取這些屬性並進行相關操作。使用屬性配置時,我們需要在程式碼中建立一個DubboProperties物件,並將其中的屬性值透過@ConfigurationProperties註解注入到該物件中。示例如下:

@Component
@ConfigurationProperties(prefix = "dubbo")
public class DubboProperties {
    private String registryAddress;

    // get/set方法省略
}

然後,我們可以使用這個DubboProperties物件中定義的屬性配置Dubbo相關的引數,示例如下:

@Service(timeout = "#{dubboProperties.timeout}")
public class XxxServiceImpl implements XxxService {

    @Autowired
    private DubboProperties dubboProperties;

    @Override
    public String hello(String name) {
        return "Hello " + name;
    }
}

在這個例子中,我們使用了#{dubboProperties.timeout}的方式,讀取DubboProperties物件中的timeout屬性來指定服務超時時間。我們還可以在DubboProviders物件中定義其他屬性,在需要的地方使用${}的方式讀取這些屬性。

Java面試被問到Dubbo,怎麼回答可以得高分?

五、Dubbo的高可用與容錯

1、服務降級

服務降級指的是當系統出現故障或者異常情況時,系統可以透過關閉一些非核心的功能來保證其他核心功能的正常執行。Dubbo提供了服務降級的功能,透過這個功能,Dubbo可以在某些條件下提供替代方案,比如返回空結果、返回預設結果等等。

Dubbo的服務降級是透過Mock來實現的,Mock可以在介面定義的時候指定。Dubbo在正常情況下會使用服務提供者提供的服務,當服務提供者出現異常或者超時時,Dubbo會自動呼叫Mock中的方法返回預設的值。

2、服務熔斷

服務熔斷是指當系統中某個服務出現異常或者超時等情況時,Dubbo會在一定時間內暫停對該服務的呼叫,防止服務雪崩,提高系統的可用性。Dubbo支援配置熔斷的時間視窗和請求的最大失敗次數,當超過這個次數後,Dubbo將不再呼叫該服務,直到時間視窗結束。

Dubbo的服務熔斷是透過circuit breaker模式來實現的,Dubbo會根據服務的負載情況來判斷是否需要熔斷。

3、服務隔離

服務隔離指的是將不同的服務放在不同的程式或者容器中執行,防止某個服務出現故障影響到其他服務的正常執行。Dubbo支援將不同的服務放在不同的程式或者容器中執行,實現服務的隔離。

4、重試機制

重試機制指的是在服務呼叫失敗後,Dubbo會根據一定的規則進行重試,直到服務呼叫成功或達到最大重試次數。Dubbo可以配置重試次數、重試間隔時間等引數,實現重試機制。

Dubbo預設提供了重試機制,可以透過在配置檔案中設定retries引數來啟用。如果服務呼叫失敗,則Dubbo會自動重新嘗試呼叫服務,直到達到最大重試次數或服務呼叫成功。重試過程中,Dubbo會等待一定的時間間隔,以避免對服務的過度壓力。

六、Dubbo的負載均衡策略

1、輪詢負載均衡

輪詢負載均衡演算法是預設的演算法,它會將服務提供者列表按照順序輪流選擇。如果其中一個服務提供者的效能較差,那麼使用輪詢演算法會導致它會被頻繁地請求,從而降低整體效能。因此,輪詢演算法適用於所有服務提供者效能相同的情況下。

2、隨機負載均衡

隨機負載均衡演算法可以隨機選擇一個服務提供者來處理請求。與輪詢演算法相比,隨機演算法並不考慮服務提供者之間的負載或效能,因此速度更快。但是,在某些情況下,服務提供者之間的負載差異太大,隨機演算法可能會導致某些服務提供者接受過多的請求。因此,隨機演算法適用於所有服務提供者效能相同的情況下,或服務提供者之間的效能差異較小的情況下

3、最少活躍呼叫負載均衡

最少活躍呼叫(Least Active)是一種智慧負載均衡演算法。該演算法會選擇活躍呼叫數最少的服務提供者來處理請求,也就是當前正忙碌程度最小的服務提供者。這種演算法適合那些提供長時間服務的服務者,比如像查詢某種快取服務,查詢開始不佔用太多伺服器資源,但是隨著查詢次數增加會佔用 相當多的服務端資源,這時候使用Least Active演算法可以選取負載最小的服務提供者,避免資源過度佔用。

4、一致性雜湊負載均衡

一致性雜湊負載均衡是一種智慧負載均衡演算法,在分散式場景下,可以保證負載均衡和資料一致性。該演算法會將所有服務提供者看作一個環,每個服務提供者對應一個獨特的雜湊值。

對於一個請求,一致性雜湊演算法透過雜湊值將其對映到服務提供者環中的一個位置,然後選擇服務提供者環上第一個順時針方向遇到的服務提供者來處理請求。

該演算法優點在於,當新增或刪除一個服務提供者時,僅需重新對映部分請求到新的服務提供者,而不是全部請求,從而避免了大規模遷移,可以提高系統的穩定性和擴充套件性

Java面試被問到Dubbo,怎麼回答可以得高分?

七、Dubbo的叢集容錯機制

1、失敗自動切換

在呼叫服務時,Dubbo會選擇一個可用的服務提供者,如果該提供者未響應或發生異常,Dubbo會自動切換到下一個可用的服務提供者進行呼叫,這就是失敗自動切換機制

2、失敗安全保護

在失敗自動切換的基礎上,Dubbo提供了另一種叢集容錯機制:失敗安全保護。它的原理是當出現某個服務提供者不可用時,Dubbo會暫時禁用該服務提供者,一段時間後再次開啟,檢查其可用性。透過這種方式,Dubbo保證了系統的穩定性以及在出現異常情況時呼叫的可用性

3、並行呼叫

Dubbo在叢集容錯中提供了一種新的機制:並行呼叫

當服務提供者在某個時間段內不能響應請求時,Dubbo會開啟多個服務提供者例項,將請求傳送給這些例項進行並行處理,快速的獲取結果並返回給服務消費者。

4、快速失敗

快速失敗機制指當某個服務提供者出現異常時,Dubbo會快速的丟擲異常給服務消費者,避免服務呼叫者長時間等待請求響應結果。同時,Dubbo也提供了一個超時時間,如果服務提供者在規定時間內未能響應請求,則Dubbo會快速的丟擲異常給服務消費者,避免請求長時間等待沒有響應結果。

Java面試被問到Dubbo,怎麼回答可以得高分?

八、Dubbo的底層通訊

1、Dubbo的網路通訊

Dubbo的底層通訊是建立在Netty的通訊框架上的,Netty是一個高效能的、非同步的、事件驅動的網路應用程式框架。在Dubbo中,Netty扮演著很重要的角色,其提供的通訊能力能夠支援Dubbo不同節點之間的通訊,並且透過高效的I/O操作完成請求響應的過程。Dubbo利用Netty的通訊框架實現了從網路層到協議層的完整封裝,使得Dubbo的通訊效率得到很大的提升

Dubbo的網路通訊過程是非常複雜的,在服務提供者和服務消費者之間建立連線,並進行請求響應的過程中,每一步都可能出現各種問題,例如網路延遲、服務端當機、序列化錯誤等等,因此Dubbo在網路通訊過程中加入了多種機制來提高網路通訊的效率和安全性。其中,比較重要的機制包括心跳機制、序列化與反序列化、長連線池等等。

2、序列化和反序列化

Dubbo利用Java自帶的ObjectInputStream和ObjectOutputStream類實現序列化和反序列化的過程,透過序列化和反序列化使得複雜的物件能夠在網路中傳輸。

Dubbo支援多種序列化協議,包括Java原生的序列化協議(即Dubbo協議)、JSON、Hessian、Kryo等。Dubbo預設採用Java原生的序列化協議,雖然其具有很好的相容性,但是其效能較差。因此,通常情況下建議使用其他的序列化協議,例如Hessian或Kryo,以提高序列化的效率。

九、Dubbo的擴充套件機制

1、自定義SPI擴充套件

Dubbo採用SPI(Service Provider Interface)的機制,用於擴充套件或替換框架中的某個實現。Dubbo對SPI機制的擴充套件可以透過Java的SPI機制實現,也可以透過Dubbo自己定義的SPI機制實現,Dubbo自己定義的SPI機制要完善一些。

Dubbo自定義的SPI機制定義了一個擴充套件點介面,每個擴充套件點介面對應了一組擴充套件實現類,而這些實現類都必須要使用SPI的配置檔案進行配置。

Dubbo的擴充套件點介面中,我們可以定義類似於ExtensionLoader這樣的類,透過這些類,我們可以獲取到相關擴充套件實現類,從而進行自定義的擴充套件。

2、自定義過濾器

Dubbo的過濾器是一種攔截器,可以在請求到達消費者時、在提供者執行服務邏輯前後以及在呼叫方收到響應時對請求和響應進行處理。Dubbo提供了一些內建的過濾器,例如安全過濾器、異常過濾器、日誌過濾器等。

不過,Dubbo也允許我們自定義過濾器來實現自己的特定需求,自定義的過濾器需要實現Filter介面,然後透過SPI機制進行擴充套件。

自定義的過濾器可以用於多種場景,例如監控、鑑權、統計和日誌等。

3、自定義負載均衡策略

Dubbo框架內建了多種負載均衡策略,例如隨機負載均衡、輪詢負載均衡和最少活躍呼叫負載均衡等。但是,這些負載均衡策略並不一定適用於所有的場景,因此Dubbo也允許我們自定義負載均衡策略。

自定義負載均衡策略需要實現LoadBalance介面,然後透過SPI機制進行擴充套件。自定義負載均衡策略可以根據不同場景的需求,實現不同的演算法和邏輯,從而更好地滿足業務需求。

Java面試被問到Dubbo,怎麼回答可以得高分?

十、總結

1、Dubbo的優缺點

Dubbo是阿里巴巴公司開發的一款高效能、高可用的分散式服務框架。在分散式架構中,Dubbo擔任著重要的角色,實現了服務的註冊、發現、負載均衡、容錯等功能,為分散式系統提供了更好的可擴充套件性和可維護性

同時,Dubbo也存在一些優缺點。

首先,Dubbo具有較強的可定製化性,可以根據實際業務需求來選擇不同的配置和擴充套件機制。

其次,Dubbo的效能表現出色,適用於高併發、大規模的分散式系統。但是,Dubbo也存在一些問題,比如複雜的部署和配置流程,限制了其在小型專案中的應用。

2、Dubbo的未來發展趨勢

未來,Dubbo將會繼續發展和改進,市場對Dubbo的需求也將繼續增加。除了更新迭代,Dubbo還將更加註重安全、大資料等領域的擴充和應用。

總的來說,Dubbo在分散式架構中的地位和應用前景都非常廣闊。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024923/viewspace-2944733/,如需轉載,請註明出處,否則將追究法律責任。

相關文章