本文首發於微信公眾號【猿燈塔】,轉載引用請說明出處
今天是猿燈塔“365天原創計划”第4天。
今天呢!燈塔君跟大家講:
一.Dubbo意義

網站應用的架構變化經歷了一個從所有服務分布在一台服務器上(All in one 、單一應用架構)到 垂直
應用架構 (MVC模式,按照各模塊的職能划分)到分布式應用架構(RPC、按照服務不同分布在不同的
服務器上)再到面向服務的架構(SOA,增加調度中心,負責集群的調度和管理)的過程。 Dubbo就
是處在SOA架構階段的一個遠程服務調用框架
二..系統架構

Dubbo系統分為五個部分:遠程服務運行容器(Container),遠程服務提供方(Provider)、注冊中
心(Register)、遠程服務調用者(Consumer)、監控中心(Monitor)。
Dubbo服務調用過程:
- 服務提供方(Provider)所在的應用在容器中啟動並運行(這個容器可以說是該應用部署的tomcat)
- 服務提供方(Provider)將自己要發布的服務注冊到注冊中心(Registry)
- 服務調用方(Consumer)啟動后向注冊中心訂閱它想要調用的服務
- 注冊中心(registry)存儲着Provider注冊的遠程服務,並將其所管理的服務列表通知給服務調用
- 方(Consumer),且注冊中心和提供方和調用方之間均保持長連接,可以獲取Provider發布的服
- 務的變化情況,並將最新的服務列表推送給Consumer
- Consumer根據從注冊中心獲得的服務列表,根據軟負載均衡算法選擇一個服務提供者
- (Provider)進行遠程服務調用,如果調用失敗則選擇另一台進行調用。(Consumer會緩存服務
- 列表,即使注冊中心宕機也不妨礙進行遠程服務調用)
- 監控中心(Monitor)對服務的發布和訂閱進行監控和統計服務消費者和提供者,在內存中累計調
- 用次數和調用時間,定時每分鍾發送一次統計數據到監控中心(Monitor);Monitor可以選擇
- Zookeeper、Redis或者Multiast注冊中心等,后序介紹。
三.Dubbo + Zookeeper

Dubbo可以用Zookeeper作為注冊中心,存儲Provider注冊的遠程服務信息。
Zookeeper采用樹形的目錄結構來存儲信息。

- 服務提供者啟動時: 向 /dubbo/com.foo.BarService/providers 目錄下寫入自己的 URL 地 址
- 服務消費者啟動時: 訂閱 /dubbo/com.foo.BarService/providers 目錄下的提供者 URL 地 址。並向 /dubbo/com.foo.BarService/consumers 目錄下寫入自己的 URL 地址
- 監控中心啟動時: 訂閱 /dubbo/com.foo.BarService 目錄下的所有提供者和消費者 URL 地 址。
支持以下功能:
- 當提供者出現斷電等異常停機時,注冊中心能自動刪除提供者信息
- 當注冊中心重啟時,能自動恢復注冊數據,以及訂閱請求
- 當會話過期時,能自動恢復注冊數據,以及訂閱請求
- 當設置<dubbo:registry check="false" />時,記錄失敗注冊和訂閱請求,后台定時重試
- 可通過設置<dubbo:registry username="admin" password="124" />設置zookeeper 登錄信息
- 可通過<dubbo:registry group="dubbo" />設置 zookeeper 的根節點,不設置將使用無 根樹
- 支持 * 號通配符 <dubbo:redistry group="" version="" />,可訂閱服務的所有分組 和所有版本的
提供者
四.Dubbo + Redis
Redis是一個基於內存的,以Key-Value形式存儲數據的高性能Nosql數據庫,可以用來存儲遠程服務信
息用作注冊中心

使用 Redis 的 Key—Map 結構存儲數據結構:
- 主鍵 Key 為服務名和服務類型:比如./dubbo/com.foo.BarService/providers或./dubbo/com.foo.BarService/providers,相當於Zookeeper中的第三層目錄
- 值 Map 中的 Key 為 URL 地址 ,Map 中的 Value 為過期時間,用於判斷臟數據,臟數據由監控中心刪除
使用 Redis 的 Publish/Subscribe 事件通知數據變更:
- 通過事件的值區分事件類型: register , unregister , subscribe , unsubscribe
- 普通消費者直接訂閱指定服務提供者的 Key,只會收到指定服務的 register , unregister 事件
- 監控中心通過 psubscribe 功能訂閱 /dubbo/* ,會收到所有服務的所有變更事件
調用過程:
- 服務提供方啟動時,向 Key:/dubbo/com.foo.BarService/providers 下,添加當前提供者的地址, 並向 Channel:/dubbo/com.foo.BarService/providers 發送 register 事件
- 服務消費方啟動時,從 Channel:/dubbo/com.foo.BarService/providers 訂閱 register 和unregister 事件 , 並向 Key:/dubbo/com.foo.BarService/providers 下,添加當前消費者的地址
- 服務消費方收到 register 和 unregister 事件后,從 Key:/dubbo/com.foo.BarService/providers
下獲取提供者地址列表
- 服務監控中心啟動時,從 Channel:/dubbo/* 訂閱 register 和 unregister ,以及subscribe 和unsubsribe 事件
- 服務監控中心收到 register 和 unregister 事件后,從Key:/dubbo/com.foo.BarService/providers 下獲取提供者地址列表
- 服務監控中心收到 subscribe 和 unsubsribe 事件后,從Key:/dubbo/com.foo.BarService/consumers 下獲取消費者地址列表
365天干貨不斷,可以微信搜索「 猿燈塔」第一時間閱讀,回復【資料】【面試】【簡歷】有我准備的一線大廠面試資料和簡歷模板