圖解Dubbo,Dubbo服務提供者詳解
今天詳細的分解一下Dubbo服務提供者,實現快速入門,豐富個人簡歷,提高面試level,給自己增加一點談資,秒變面試小達人,BAT不是夢。
三分鐘你將學會:
- 什么是服務提供者
- 服務提供者的配置
- 服務提供者集群
- 服務提供者的網絡通信
- 服務提供者的線程模型
- 服務提供者的動態配置
當今分布式系統已經成為企業中不可或缺的一部分。
在分布式系統中,服務網格是一個重要的組成部分。服務網格用于管理和調度服務,以確保系統的可用性和可擴展性。
其中 Dubbo 是一個流行的服務網格框架,它提供了一種簡單、可靠、高性能的方式來構建分布式系統。
在 Dubbo 中,服務提供者是框架的核心組件之一,它負責提供服務并將服務暴露給外部應用程序。
本文將介紹 Dubbo 中的服務提供者,包括服務提供者的定義、服務暴露的方式、服務注冊的實現、服務提供者的容錯處理、服務提供者集群以及服務提供者的網絡通信。
一、服務提供者
Dubbo 服務提供者是指使用 Dubbo 協議提供服務的 Java 程序,它是 Dubbo 服務架構的核心部分。服務提供者通過在服務消費方和提供方之間提供 RPC(遠程過程調用) 服務,實現了服務之間的松耦合和低耦合。
在 Dubbo 服務架構中,服務提供者主要負責
- 將服務暴露給服務消費方;
- 并將服務消費方的請求轉化為 Dubbo 協議的請求;
- 然后將響應返回給服務消費方。
Dubbo服務提供者啟動流程時序圖:
Dubbo服務提供者啟動流程
Dubbo服務提供者關閉流程時序圖:
Dubbo服務提供者關閉流程
1、Dubbo服務提供者的定義
服務提供者是 Dubbo 框架的核心組件之一,它是負責提供服務的應用程序。
在 Dubbo 中,服務提供者的定義如下:
- 服務提供者是一個 Java 類,它實現了 Dubbo 服務接口。
- 服務提供者必須實現DubboRPC接口,該接口定義了服務調用的基本邏輯。
- 服務提供者必須實現getService()方法,該方法返回服務實例的引用。
在 Dubbo 中,服務暴露的方式有兩種:廣播式服務暴露和點式服務暴露。
?廣播式服務暴露是指服務提供者向所有注冊的客戶端廣播服務發布信息,客戶端根據服務名稱和版本號等信息自動發現服務。
點式服務暴露是指服務提供者向單個客戶端廣播服務發布信息,客戶端主動請求服務。
2、服務暴露的方式
在 Dubbo 服務架構中,服務提供者可以將服務暴露為 HTTP 服務、RPC 服務或者二者的結合體。
具體來說,服務提供者可以通過以下幾種方式暴露服務:
- HTTP 服務:服務提供者可以通過 HTTP 協議提供服務,服務消費方可以通過 HTTP 請求的方式調用服務提供者的服務。
- RPC 服務:服務提供者可以通過 Dubbo 協議提供 RPC 服務,服務消費方可以通過 Dubbo 協議的 RPC 請求調用服務提供者的服務。
- HTTP+RPC 服務:服務提供者可以通過 HTTP 協議提供 RPC 服務,服務消費方可以通過 HTTP 請求的方式調用服務提供者的 RPC 服務。
Dubbo服務提供者暴露服務流程時序圖:
Dubbo服務提供者暴露服務流程
3、服務注冊的實現
Dubbo 服務注冊是指將服務提供者的信息注冊到 Dubbo 注冊中心,讓服務消費者可以通過注冊中心查找到服務提供者并進行調用。
下面是一個簡單的 Dubbo 服務注冊實現示例,基于 Apache Barrow 框架:
(1)創建服務接口
在這個示例中,我們定義了一個名為 MyService 的服務接口,它有兩個方法:hello() 和 world()。
(2)實現服務接口
在這個示例中,我們實現了 MyService 服務接口,并添加了一個 hello() 方法。
(3)注冊服務
在這個示例中,我們將 MyService 服務接口注冊到 Dubbo 注冊中心。
在這個示例中,我們首先創建了一個 WebRegistry,它使用 WebServlet 監聽端口 9090,用于向注冊中心注冊和查找服務。然后,我們將 MyService 服務接口注冊到注冊中心。最后,我們啟動了 Dubbo 服務。
(4)服務消費者
在這個示例中,我們將創建一個服務消費者,它使用 Dubbo 注冊中心查找服務并調用服務接口。
在這個示例中:
- 我們創建了一個 ConsumerRegistry,它使用 HashMap 存儲注冊中心的信息。
- 然后,我們將 MyService 服務接口注冊到注冊中心。
- 最后,我們使用 ServiceLoader 查找服務,并將其綁定到注冊中心。
二、服務提供者的配置
1、服務提供者的XML配置
XML 配置是 Dubbo 服務架構中最常用的配置方式。服務提供者可以通過 XML 文件來配置服務相關的信息,如服務接口、服務實現、負載均衡、超時時間等。
XML 配置如下:
2、服務提供者的注解配置
注解配置是 Dubbo 服務架構中另一種常用的配置方式。服務提供者可以通過注解來配置服務相關的信息,如服務接口、服務實現、負載均衡、超時時間等。
注解配置如下:
3、服務提供者的容錯處理
(1)失敗重試機制
失敗重試機制
解釋:
- 客戶端(Client)向Dubbo服務提供者(Provider)發送請求。
- 如果請求成功,服務提供者將返回響應。
- 如果請求失敗,則Dubbo服務提供者將通過熔斷器(Circuit Breaker)返回服務熔斷響應。
- 如果請求過載,Dubbo服務提供者將通過熔斷器返回請求過載響應。
- 如果服務降級,則Dubbo服務提供者將返回服務降級響應,使用線程池(Thread Pool)處理請求。
(2)隔離機制
隔離機制
Dubbo服務提供者的容錯處理的隔離機制實現了服務的隔離,當一個服務出現問題時,該服務的容錯處理機制會隔離該服務,以防止問題擴大到整個應用程序中。隔離容器可以是一個獨立的線程池,這個線程池只處理隔離的服務,以此來保護應用程序的其他部分。
(3)超時機制
在 Dubbo 服務架構中,服務提供者支持超時機制,以保障服務的響應速度和可用性。超時機制可以通過配置服務提供者的超時時間參數來實現。
下圖描述了 Dubbo 服務提供者的容錯處理的失敗超時機制的流程。在該圖中:
- 服務提供者首先向服務注冊中心注冊服務;
- 然后消費者通過服務注冊中心查找到服務提供者列表,向服務提供者發送請求;
- 服務提供者在處理請求時,如果請求超時,會返回超時響應;否則,會返回正常響應。
超時機制
三、服務提供者集群
1、集群容錯模式
(1)Failover Cluster(失敗自動切換)
Failover Cluster是Dubbo默認的集群容錯模式,它適用于可重試的失敗場景。
在該模式下,Dubbo會自動地將調用失敗的請求重試到其他的服務提供者上,直到其中一個服務提供者成功返回為止。
失敗自動切換
(2)Failfast Cluster(快速失敗)
Failfast Cluster適用于非冪等性的請求場景。
在該模式下,Dubbo只會嘗試調用一次服務提供者,如果調用失敗則立即返回失敗結果,不會進行重試。
快速失敗
(3)Failsafe Cluster(失敗安全)
Failsafe Cluster適用于非關鍵性請求場景。
在該模式下,Dubbo會直接忽略服務提供者的異常,將異常視為服務調用失敗,并將失敗結果返回給調用方。
失敗安全
(4)Failback Cluster(失敗自動恢復)
Failback Cluster適用于對可靠性要求較高、但不想阻塞服務調用的場景。
在該模式下,Dubbo會將調用失敗的請求保存到本地,定時重新嘗試調用服務提供者,直到成功返回為止。
失敗自動恢復
2、集群容錯策略
在 Dubbo 服務提供者集群中,常見的容錯策略包括如下幾種:
- 輪詢策略:在集群中選擇一臺服務器作為主服務器,其他服務器作為從服務器。當主服務器出現故障時,從服務器會自動切換到主服務器,并繼續提供服務。
- 負載均衡策略:在集群中將所有服務提供者部署在不同的節點上,并通過負載均衡算法來均衡服務提供者的負載。
- 容錯連接策略:在集群中將所有服務提供者部署在不同的節點上,并通過集群間的通信來保障集群的穩定性和可用性。
3、集群容錯實現
在 Dubbo 服務提供者集群中,常用的容錯實現方式包括如下幾種:
- 服務注冊與發現:將服務提供者部署在注冊中心上,服務消費者可以通過注冊中心來查找服務提供者,并提供服務。
- 服務網關:在服務提供者和服務消費者之間加入服務網關,網關作為服務提供者和消費者之間的接口,負責處理服務調用和容錯處理。
- 消息隊列:將服務提供者和消費者之間的通信通過消息隊列來實現,當服務提供者出現故障時,可以通過消息隊列來傳遞消息,繼續提供服務。
- 集群間通信:將服務提供者部署在不同的節點上,通過集群間通信來保障集群的穩定性和可用性。常用的集群間通信方式包括負載均衡、消息隊列、Zookeeper 等。
四、服務提供者的網絡通信
1、Dubbo基于TCP通信
Dubbo 是基于 TCP 通信的,它支持多種通信模式,包括經典模式、RPC 模式和 HTTP 模式。在經典模式下,Dubbo 使用 TCP 協議進行通信,服務提供者和消費者之間的通信是通過套接字進行的。在 RPC 模式下,Dubbo 使用 Dubbo 協議進行通信,服務提供者和消費者之間的通信也是通過套接字進行的。在 HTTP 模式下,Dubbo 使用 HTTP 協議進行通信,服務提供者和消費者之間的通信是通過 HTTP 請求和響應進行的。
2、通信級別的概念
在 Dubbo 中,通信級別指的是服務消費者和服務提供者之間的通信級別。
具體來說,通信級別包括如下幾個:
- 接口級別:指服務消費者和服務提供者之間的接口級別通信,也就是服務消費者通過接口調用服務提供者的方法。
- 方法級別:指服務消費者和服務提供者之間的方法級別通信,也就是服務消費者通過接口調用服務提供者的方法,服務提供者在接收到調用后,執行具體的服務邏輯。
- 服務級別:指服務消費者和服務提供者之間的服務級別通信,也就是服務消費者通過調用服務提供者的服務,服務提供者在接收到調用后,執行具體的服務邏輯。
3、通信協議
在 Dubbo 中,服務消費者和服務提供者之間的通信采用 Dubbo 協議進行。Dubbo 協議采用 JSON 格式進行傳輸,支持遠程調用和事件監聽等功能。
具體來說,Dubbo 協議包括以下內容:
- 服務接口信息:包括服務接口的類名、版本號、方法信息等。
- 服務實現信息:包括服務實現的類名、版本號、方法信息等。
- 調用參數信息:包括調用方法的參數類型、參數值等。
- 調用結果信息:包括調用方法的返回值類型、返回值值等。
4、Dubbo默認的序列化方式
在 Dubbo 中,默認的序列化方式為 Java 序列化。Java 序列化是一種將對象序列化為字符串的序列化方式,它支持對象在內存中的序列化和反序列化,可以保證對象在不同平臺和不同語言之間進行傳輸和交換。但是,Java 序列化在傳輸過程中可能會出現數據丟失和變形等問題,因此需要謹慎使用。
5、序列化方式的擴展支持
Dubbo 提供了多種序列化方式,包括 JSON 序列化、XML 序列化、化石序列化等。服務提供者可以根據需要,自行選擇序列化方式。同時,Dubbo 還提供了序列化方式的擴展支持,可以自定義序列化方式,滿足不同的需求。
6、Dubbo協議的傳輸方式
Dubbo 協議采用 HTTP 協議進行傳輸,支持客戶端和服務器之間的通信。
具體來說,Dubbo 協議的傳輸方式包括如下幾種:
- GET 方式:客戶端向服務器發送 GET 請求,服務器返回請求結果。
- POST 方式:客戶端向服務器發送 POST 請求,服務器接收請求數據,并根據請求數據執行相應的操作。
- PUT 方式:客戶端向服務器發送 PUT 請求,服務器將請求數據保存到服務器中。
- DELETE 方式:客戶端向服務器發送 DELETE 請求,服務器刪除請求數據。
7、傳輸方式的擴展支持
Dubbo 協議的傳輸方式可以通過自定義 HTTP 客戶端和服務器進行擴展支持。自定義 HTTP 客戶端和服務器可以實現自定義的傳輸方式,滿足不同的需求。同時,Dubbo 還提供了 HTTP 傳輸方式的擴展支持,可以自定義 HTTP 傳輸方式,滿足不同的需求。
五、服務提供者的線程模型
1、什么是線程模型
線程模型是指描述計算機程序中線程 (也稱為進程或實例) 如何執行的模型。在一個計算機程序中,線程是程序執行的基本單位。每個線程都有自己的堆棧、變量和執行順序,它們可以獨立地運行,直到它們被阻塞或超時為止。線程模型描述了線程如何協作、同步和通信,以確保程序的正確性和可靠性。
2、Dubbo線程模型
Dubbo 線程模型是 Dubbo 框架中用于實現服務消費和服務提供者之間通信的線程模型。在 Dubbo 中,服務消費者和服務提供者之間是通過線程池進行的,每個線程池代表一個服務消費者或服務提供者,線程池中的線程負責執行服務消費者的請求或服務提供者的服務。
3、線程池模型
線程池模型是指服務提供者在執行服務請求時使用的線程模型。在線程池模型中,服務提供者會創建一個或多個線程,用于執行服務請求。每個線程都擁有自己的堆棧和變量,當服務請求結束時,服務提供者會自動銷毀線程,釋放資源。
4、單一線程模型
單一線程模型是指服務提供者在執行服務請求時使用的線程模型。在單一線程模型中,服務提供者只會創建一個線程,用于執行服務請求。當服務請求結束時,服務提供者不會自動銷毀線程,而是等待線程完成任務后才會銷毀線程。
5、伸縮線程模型
伸縮線程模型是指服務提供者在執行服務請求時使用的線程模型,它可以根據實際需求自動增加或減少線程的數量。在伸縮線程模型中,服務提供者會創建多個線程,當服務請求數量增加時,服務提供者會自動增加線程的數量,以保證服務請求的及時處理。當服務請求數量減少時,服務提供者會自動減少線程的數量,減少資源浪費。
六、服務提供者的動態配置
1、配置方式的概述
靜態配置是指在代碼中直接編寫服務提供者的配置信息,例如服務接口的 IP 地址、端口號、協議、依賴庫等信息。這種方式的優點是簡單易用,可以快速地搭建服務提供者,但是在運行時無法根據實際情況進行修改。
動態配置是指在運行時根據請求的實際情況動態地配置服務提供者。這種方式的優點是靈活性高,可以根據實際情況進行修改,但是在代碼量上會多一些。
2、動態配置方式
Dubbo 提供了多種方式來實現動態配置,其中最常用的方式是使用 RegisterUtil.register() 方法進行注冊。在使用動態配置時,需要先創建一個 RegisterUtil 對象,然后使用該對象進行注冊。注冊完成后,可以通過調用 RegisterUtil.unregister() 方法來取消注冊。
另外,Dubbo 還支持使用 XML 文件進行配置,可以使用 XML 文件來存儲服務提供者的配置信息。XML 文件的格式如下:
在上面的 XML 文件中,interface 屬性指定了服務接口的名稱,name 屬性指定了服務的名稱,registry-address 屬性指定了服務注冊中心的連接地址,dubbo:reference 屬性指定了服務依賴的對象。
3、配置規則
Dubbo 的配置規則主要包括以下幾個方面:
- 服務接口的命名空間:服務接口的命名空間指定了服務接口的命名空間,例如 com.example.demo。
- 服務名稱:服務名稱指定了服務的名稱,例如 demoService。
- 服務注冊中心:服務注冊中心指定了服務注冊的中心地址,例如 localhost:20888。
- 服務依賴庫:服務依賴庫指定了服務依賴的其他庫,例如 com.example.demo.Dao.。
4、 配置規則的實現
在實現服務提供者的配置信息時,需要按照上述規則進行編寫。例如,下面是一個符合規則的服務提供者的配置信息:
在上面的代碼中,@Component 注解標記了 DemoService 和 DemoDao 兩個組件,并且它們都實現了 Service 接口。@Configuration 注解標記了 DemoConfig 類,它包含了兩個 @Bean 注解,分別標記了 DemoService 和 DemoDao 組件的注入點。
本文轉載自微信公眾號「哪吒編程」,可以通過以下二維碼關注。轉載本文請聯系哪吒編程公眾號。