圖解Dubbo,Dubbo服務介面詳解

架構師修行手冊發表於2023-04-17

來源:哪吒程式設計

大家好,我是哪吒。

上一篇分享了圖解Dubbo,Dubbo服務消費詳解。今天詳細的分解一下Dubbo服務消費機制,實現快速入門,豐富個人簡歷,提高面試level,給自己增加一點談資,秒變面試小達人,BAT不是夢。

三分鐘你將學會:

  1. Dubbo服務介面的基本概念
  2. Dubbo服務介面的註冊與發現
  3. Dubbo服務介面的呼叫
  4. Dubbo服務介面的屬性和引數
  5. Dubbo服務介面的異常處理
  6. Dubbo服務介面的日誌和監控

一、Dubbo服務介面的基本概念

1、Dubbo服務介面的基礎概念

Dubbo 服務介面是指提供服務的服務端和呼叫服務的客戶端之間通訊的介面,包括服務協議、傳輸協議、序列化協議和介面定義等。在 Dubbo 中,服務介面採用介面定義語言(IDL)描述服務協議和資料模型,支援多種協議,比如 Dubbo、HTTP、REST 等。

圖解Dubbo,Dubbo服務介面詳解

2、Dubbo服務介面的特點

  • 高效能:Dubbo 採用 Netty、Mina 等高效能 IO 框架,透過 NIO 實現高併發、低延遲的網路通訊;
  • 輕量級:Dubbo 服務介面非常輕量級,只需要幾行程式碼就可以實現一個簡單的服務介面;
  • 易擴充套件:Dubbo 支援擴充套件各種元件和外掛,比如序列化、容錯、負載均衡、路由、叢集等;
  • 服務治理:Dubbo 提供了豐富的服務治理功能,包括服務註冊與發現、動態路由、流量控制、限流、降級、容錯、監控等;
  • 多語言支援:Dubbo 支援多語言,比如 Java、Scala、Python、Node.js 等;
  • 生態豐富:Dubbo 生態豐富,有眾多公司和開發者在使用和維護 Dubbo,社群活躍,文件和教程豐富;

3、Dubbo 服務介面的應用場景

Dubbo 服務介面的實現方式包括兩種:基於 Spring 的 XML 配置方式和基於註解的方式。

(1)基於 Spring 的 XML 配置方式需要在 XML 配置檔案中配置服務介面的資訊,包括介面名稱、實現類、協議、埠等;

(2)基於註解的方式則需要在介面和實現類上新增相應的註解來配置服務介面資訊。

  1. 微服務架構:Dubbo 服務介面可以作為微服務架構中的核心元件,實現服務的註冊、發現、呼叫和治理。
  2. 分散式系統:Dubbo 服務介面可以在分散式系統中作為服務呼叫的協議,實現不同服務之間的通訊。
  3. 高併發系統:Dubbo 服務介面可以支援高併發的服務呼叫,透過配置連線池、執行緒池等引數,可以提高系統的效能和吞吐量。

4、以下是基於 Spring 的 XML 配置方式的實現流程的時序圖:

圖解Dubbo,Dubbo服務介面詳解

5、以下是基於 Spring 的註解方式的實現流程的時序圖:

圖解Dubbo,Dubbo服務介面詳解

二、Dubbo服務介面的註冊與發現

1、介紹 Dubbo 服務介面的序號產生器制

Dubbo 服務介面的實現方式包括兩種:基於 Spring 的 XML 配置方式和基於註解的方式。

(1)基於 Spring 的 XML 配置方式需要在 XML 配置檔案中配置服務介面的資訊,包括介面名稱、實現類、協議、埠等;

(2)基於註解的方式則需要在介面和實現類上新增相應的註解來配置服務介面資訊。

以下是Dubbo服務介面的序號產生器制的時序圖:

圖解Dubbo,Dubbo服務介面詳解

上圖執行步驟如下:

  1. 服務消費方向註冊中心訂閱所需的服務列表。
  2. 註冊中心查詢註冊的服務列表。
  3. 服務提供方向註冊中心註冊服務。
  4. 註冊中心將服務列表返回給服務消費方。
  5. 服務消費方呼叫服務。
  6. 服務提供方返回服務結果給服務消費方。

2、介紹 Dubbo 服務介面的發現機制

Dubbo 服務介面的發現機制是指客戶端在呼叫服務介面時,如何找到服務介面的例項。

Dubbo 提供了兩種服務介面發現機制:廣播機制和註冊中心機制。

(1)廣播機制

廣播機制是指服務介面的例項在執行時主動向其他服務例項廣播自己的服務資訊,其他服務例項接收到廣播後可以根據廣播的資訊來發現服務介面的例項。

在廣播機制中,服務介面的例項不需要手動去註冊到註冊中心,而是在執行時動態地廣播自己的服務資訊。

客戶端透過呼叫服務介面的方法時,會向服務介面例項傳送廣播請求,服務介面例項會響應廣播請求並廣播自己的服務資訊,其他服務例項接收到廣播後可以根據廣播的資訊來發現服務介面的例項。

圖解Dubbo,Dubbo服務介面詳解

上圖執行步驟如下:

  1. 服務提供者Provider將自己的服務註冊到註冊中心Registry上;
  2. 註冊中心Registry返回註冊成功的結果給服務提供者Provider;
  3. 服務提供者Provider向註冊中心Registry傳送心跳以保持連線;
  4. 服務消費者Consumer從註冊中心Registry訂閱服務;
  5. 註冊中心Registry返回可用的服務提供者列表給服務消費者Consumer;
  6. 服務消費者Consumer呼叫服務提供者Provider提供的服務;
  7. 如果服務提供者Provider出現故障,會向註冊中心Registry傳送失敗通知;
  8. 註冊中心Registry將更新的可用服務提供者列表返回給服務消費者Consumer;
  9. 服務消費者Consumer重新呼叫可用的服務提供者Provider提供的服務;

(2)註冊中心機制

註冊中心機制是指服務介面的例項主動將自己的服務資訊註冊到註冊中心,註冊中心負責維護服務介面例項的資訊。在註冊中心機制中,服務介面的例項需要手動去註冊到註冊中心,並由註冊中心來維護和管理服務介面例項的資訊。

客戶端透過呼叫服務介面的方法時,會向註冊中心傳送註冊請求,註冊中心會響應註冊請求並將服務介面的例項資訊儲存到登錄檔中。其他服務例項在需要發現服務介面例項時,可以向註冊中心傳送查詢請求,註冊中心會根據查詢請求中的服務介面名稱和版本等資訊來查詢對應的服務介面例項,並將其返回給請求者。

三、Dubbo服務介面的呼叫

1、介紹 Dubbo 服務介面的呼叫流程

圖解Dubbo,Dubbo服務介面詳解

以上是Dubbo服務介面的呼叫流程時序圖,它展示了服務呼叫的整個流程,從服務消費者到服務提供者再到服務消費者,過程中經過協議層、叢集層、路由層和註冊中心,各個層之間透過Invoker物件和Protocol物件進行互動,最終返回結果給服務消費者。

  1. Consumer呼叫服務代理物件的方法,將請求封裝成Invocation物件;
  2. Invocation物件透過Protocol層傳遞給Invoker物件;
  3. Cluster層負責呼叫Router物件的route方法,根據負載均衡策略選擇一個服務提供者地址;
  4. Registry層負責獲取服務提供者地址列表,返回給Invoker物件;
  5. Invoker物件透過Protocol層呼叫服務提供者,將結果封裝成Response物件;
  6. Response物件透過Protocol層傳遞給服務代理物件Proxy;
  7. Proxy返回結果給Consumer;

2、介紹 Dubbo 服務介面的請求和響應機制

Dubbo 服務介面的請求和響應機制涉及到服務提供者和服務消費者之間的通訊。

以下是一個詳細的時序圖描述了 Dubbo 服務介面的請求和響應機制:

圖解Dubbo,Dubbo服務介面詳解

具體說明:

  1. 客戶端向服務提供者傳送請求訊息;
  2. 服務提供者建立 ProviderContext 物件,並進入過濾器鏈;
  3. 過濾器鏈會根據配置檔案載入相應的過濾器,並按照順序依次執行;
  4. ProviderContext 物件會呼叫 Invoker 物件的 getInvoker() 方法獲取 Invoker
  5. Invoker 物件會載入 Cluster,並根據負載均衡策略選擇一個合適的 Invoker
  6. 選擇合適的 Invoker 後,Invoker 物件會進入過濾器鏈;
  7. 過濾器鏈會根據配置檔案載入相應的過濾器,並按照順序依次執行;
  8. InvokerDelegate 會呼叫相應的服務方法;
  9. 服務方法的執行結果會被封裝成 Result 物件;
  10. Result 物件會進入過濾器鏈;
  11. 過濾器鏈會根據配置檔案載入相應的過濾器,並按照順序依次執行;
  12. InvokerDelegate 會將處理結果返回給客戶端;

四、Dubbo服務介面的屬性和引數

1、介紹 Dubbo 服務介面的屬性和引數型別

Dubbo 服務介面的屬性和引數型別在選擇時需要根據實際需求進行選擇。一般來說,如果服務介面需要傳遞的基本資料型別或字串型別,可以使用 Java 基本資料型別或字串型別作為引數。如果服務介面需要傳遞物件型別,可以使用 Java 物件型別或 JSON 物件型別作為引數。

圖解Dubbo,Dubbo服務介面詳解

下面是 Dubbo 服務介面中常用的引數型別:

  • 基本資料型別:包括 byte、short、int、long、float、double、char、boolean 等。
  • 字串型別:包括 String、StringBuilder、StringBuffer 等。
  • 物件型別:包括 Java 物件型別,如 Map、List、struct 等。
  • JSON 物件型別:包括 JSONObject 和 JSONArray 等。

在 Dubbo 框架中,服務介面的屬性引數可以透過屬性名稱和值的傳遞方式,也可以透過物件序列化和反序列化的方式傳遞

使用物件序列化和反序列化的方式傳遞引數可以實現引數的自定義,並且可以支援複雜的資料結構。如果需要傳遞物件型別,可以使用 Java 物件型別或 JSON 物件型別作為引數,具體的引數型別需要根據服務介面的需求進行選擇。

2、介紹 Dubbo 服務介面引數的傳遞方式

Dubbo 服務介面的屬性引數是指在服務呼叫過程中,需要傳遞的引數。這些引數可以是基本資料型別、字串、物件等。在 Dubbo 框架中,服務介面的屬性引數可以透過屬性名稱和值來傳遞,也可以透過物件序列化和反序列化來傳遞。

(1)屬性名稱和值的傳遞

圖解Dubbo,Dubbo服務介面詳解

在上圖中

  1. 客戶端(Client)首先向註冊中心(Registry)訂閱服務,獲得可用的提供者列表;
  2. 然後,客戶端選擇一臺提供者,向其傳送請求。在傳送請求之前,請求會經過一系列的過濾器(Filter),最終由負載均衡器(LoadBalance)選擇一臺提供者;
  3. 選擇完成後,請求被髮送到提供者,提供者處理請求並返回響應結果;
  4. 在返回響應結果之前,響應結果也會經過一系列的過濾器,最終返回給客戶端;
  5. 在整個過程中,屬性名稱和值被傳遞和處理,以確保請求和響應都被正確地處理和解析;

以下是一個 Dubbo 服務介面的示例:

@Service  
public interface HelloService {  
    String sayHello(String name) throws Exception;  
}

在這個示例中,HelloService 介面有一個名為“sayHello”的方法,它需要一個名為“name”的引數。在客戶端呼叫 HelloService 介面的“sayHello”方法時,需要將引數“name”作為 HTTP 請求引數傳遞給服務端。這可以透過以下程式碼實現:

Client client = new Client();  
Address address = new Address("127.0.0.1"8080);  
Scheme scheme = new Scheme("http", address, 80);  
ClientContext clientContext = new ClientContext(scheme, client);  
HelloService service = new DubboClient<>(HelloService.classclientContext);  
String result = service.sayHello("world");  

在上面的程式碼中,我們建立了一個 Dubbo 客戶端,並將其與 localhost:8080 進行通訊。然後,我們呼叫了 HelloService 介面的“sayHello”方法,並將引數“world”作為 HTTP 請求引數傳遞給服務端。最終,服務端根據請求引數,生成了響應並返回給客戶端。

(2)物件序列化和反序列化

圖解Dubbo,Dubbo服務介面詳解

在上圖中

  1. 說明了在Dubbo服務介面中,客戶端將請求物件序列化為位元組陣列併傳送給服務提供方;
  2. 服務提供方將響應物件序列化為位元組陣列並返回給客戶端;
  3. 客戶端接收到響應位元組陣列後,將其反序列化為響應物件。

例如,以下是一個 Dubbo 服務介面的示例:

@Service  
public interface UserService {  
    User getUserById(int id);  
}

在這個示例中,UserService 介面有一個名為“getUserById”的方法,它需要一個名為“id”的引數。在客戶端呼叫 UserService 介面的“getUserById”方法時,需要將引數“id”透過物件序列化和反序列化的方式傳遞給服務端。這可以透過以下程式碼實現:

Client client = new Client();  
Address address = new Address("127.0.0.1"8080);  
Scheme scheme = new Scheme("http", address, 80);  
ClientContext clientContext = new ClientContext(scheme, client);  
UserService service = new DubboClient<>(UserService.classclientContext);  
User result = (User) service.getUserById(1);  

在上面的程式碼中

  1. 我們建立了一個 Dubbo 客戶端,並將其與 localhost:8080 進行通訊;
  2. 然後,我們呼叫了 UserService 介面的“getUserById”方法,並將引數“1”透過物件序列化和反序列化的方式傳遞給服務端;
  3. 最終,服務端根據請求引數,生成了響應並返回給客戶端。
圖解Dubbo,Dubbo服務介面詳解

五、Dubbo服務介面的異常處理

1、介紹 Dubbo 服務介面的異常處理機制

Dubbo 服務介面的異常處理機制是指當服務介面在呼叫過程中出現異常時,如何進行異常處理和錯誤處理。

在 Dubbo 框架中,服務介面的異常處理機制分為以下幾種:

(1)預設異常處理機制

在 Dubbo 框架中,預設情況下,服務介面會在呼叫過程中出現異常時,將異常丟擲,客戶端將會丟擲異常資訊

這種異常處理機制適用於一些簡單的服務介面,不需要進行復雜的異常處理。

(2)日誌記錄異常處理機制

在 Dubbo 框架中,可以透過配置日誌記錄器,記錄服務介面呼叫過程中的異常資訊。這種異常處理機制適用於需要記錄異常資訊的服務介面,可以透過日誌記錄器來記錄異常資訊,方便進行後續的故障排查。

(3)重試異常處理機制

在 Dubbo 框架中,可以透過配置重試機制,對服務介面呼叫進行重試。

這種異常處理機制適用於服務介面呼叫出現異常時,需要對服務介面進行多次嘗試,直到成功為止。

(4)容錯異常處理機制

在 Dubbo 框架中,可以透過配置容錯機制,將服務介面呼叫失敗的情況記錄下來,並透過負載均衡等方式將請求轉發到其他服務例項中。

這種異常處理機制適用於需要對服務介面呼叫進行容錯處理的服務介面,可以透過負載均衡等方式來提高服務介面的可用性。

(5)Dubbo 服務介面的異常處理機時序圖

圖解Dubbo,Dubbo服務介面詳解

在上圖中

  1. 當 Dubbo 服務介面呼叫時發生異常時,Dubbo 會嘗試進行重試或容錯處理;
  2. 重試過程中,Dubbo 會根據重試次數和重試策略進行重試;
  3. 如果重試失敗,Dubbo 會嘗試進行容錯處理,容錯過程中,Dubbo 會呼叫容錯策略來處理異常並返回容錯結果;
  4. 如果服務正常返回,則直接返回結果。

2、介紹 Dubbo 服務介面異常處理的方法和技巧

(1)使用異常處理機制

在 Dubbo 中,可以使用異常處理機制來處理服務呼叫過程中的異常情況。

具體來說,可以在服務介面的實現中丟擲異常,並在服務呼叫端監聽異常並採取相應的措施,例如重試、降級等。

(2)編寫健壯的服務介面

在編寫服務介面時,應該儘可能地編寫健壯的介面,以避免在呼叫過程中出現異常情況。具體來說,應該考慮處理輸入引數的異常、處理輸出引數的異常、處理服務呼叫失敗的異常等。

(3)使用日誌

在服務介面呼叫過程中,可以記錄一些重要的資訊,例如呼叫時間、呼叫結果等,以便於追蹤和分析服務呼叫過程中出現的問題。Dubbo 提供了豐富的日誌配置選項,可以根據不同的場景和需求配置不同的日誌格式和級別。

(4)使用錯誤處理機制

在 Dubbo 中,可以使用錯誤處理機制來處理服務呼叫過程中出現的錯誤。具體來說,可以在服務介面的實現中丟擲錯誤,並在服務呼叫端監聽錯誤並採取相應的措施,例如重試、降級等。

(5)使用異常處理機制和錯誤處理機制的組合

在實際開發中,應該儘可能地使用異常處理機制和錯誤處理機制的組合來處理服務呼叫過程中的異常情況。這樣可以最大程度地保證服務介面的健壯性和可靠性。

圖解Dubbo,Dubbo服務介面詳解

六、Dubbo服務介面的日誌和監控

1、介紹 Dubbo 服務介面的日誌機制

(1)預設日誌機制

Dubbo 預設使用 org.apache.dubbo.log.Log4jLogManager 日誌管理器,可以透過在 Dubbo 配置檔案中設定 "dubbo.log.dir""dubbo.log.file" 屬性來指定日誌檔案的儲存位置和檔名。在預設情況下,每個服務的日誌檔名稱以服務名稱和時間來命名,例如 "serviceA-2020-02-24-14:52:32.log"

Dubbo 還提供了 org.apache.dubbo.log.Level 日誌級別,可以透過在 Dubbo 配置檔案中設定 "dubbo.log.level" 屬性來指定日誌級別的優先順序,例如 "ERROR,SEVERE,WARN,INFO,DEBUG,TRACE" 等。

(2)自定義日誌機制

如果您想要自定義日誌機制,可以繼承 org.apache.dubbo.log.LogFactory 類並實現它的 createLogManager() 方法來建立自己的日誌管理器。在實現 createLogManager() 方法時,需要返回一個 org.apache.dubbo.log.LogManager 物件,這樣就可以自定義日誌的列印格式、日誌級別等。

另外,您還可以自定義日誌檔案的儲存位置、檔名等,可以透過實現 org.apache.dubbo.log.LogFactory 類的 createLogFileManager() 方法來建立自己的日誌檔案管理器。在實現 createLogFileManager() 方法時,需要返回一個 org.apache.dubbo.log.LogFileManager 物件,這樣就可以自定義日誌檔案的儲存位置、檔名等。

(3)Dubbo 服務介面的日誌機制使用時序圖描述:

圖解Dubbo,Dubbo服務介面詳解

2、介紹 Dubbo 服務介面的監控機制

圖解Dubbo,Dubbo服務介面詳解

(1)預設監控器

Dubbo 框架預設情況下,會使用效能監控器來監控服務介面的效能。效能監控器可以記錄服務介面的呼叫時間、呼叫次數、響應時間等資訊,以便對服務介面的效能進行分析和最佳化。

(2)自定義監控器

如果預設效能監控器無法滿足實際需求,可以透過自定義監控器來實現服務介面的監控。自定義監控器需要編寫相應的監控器實現類,並根據需要設定監控引數和閾值等。

(3)日誌監控器

Dubbo 框架支援日誌監控器,可以記錄服務介面的呼叫日誌等資訊。日誌監控器可以透過配置日誌記錄器來實現,可以在日誌檔案中記錄服務介面的呼叫日誌等資訊。

(4)報警機制

在 Dubbo 框架中,支援報警機制,可以對服務介面的效能、狀態等資訊進行報警。報警機制可以透過配置報警伺服器來實現,可以將報警資訊傳送到報警伺服器,以便對服務介面的狀態進行分析和最佳化。

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

相關文章