Dubbo是管理中間層的工具,在業務層到數據倉庫間有很是多服務的接入和服務提供者須要調度,dubbo提供一個框架解決這個問題。Dubbo基於RPC(Remote Procedure Call 遠程過程調用)協議,服務提供方和服務消費方之間的調用關係:nginx
節點角色說明web
Provider: 暴露服務的服務提供方。
Consumer: 調用遠程服務的服務消費方。
Registry: 服務註冊與發現的註冊中心。
Monitor: 統計服務的調用次調和調用時間的監控中心。
Container: 服務運行容器。
調用關係說明算法
0.服務容器負責啓動,加載,運行服務提供者。數據庫
1.服務提供者在啓動時,向註冊中心註冊本身提供的服務。緩存
2.服務消費者在啓動時,向註冊中心訂閱本身所需的服務。服務器
3.註冊中心返回服務提供者地址列表給消費者,若是有變動,註冊中心將基於長鏈接推送變動數據給消費者。併發
4.服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,若是調用失敗,再選另外一臺調用。負載均衡
5.服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。框架
這個框架要完成調度必需要有一個分佈式的註冊中心,存儲全部服務的元數據,用到zookeeper。分佈式
zookeeper用來註冊服務和負載均衡。
哪個服務由哪個機器來提供必須讓調用者知道,簡單來講就是ip地址和服務器名稱的對應關係。 固然也能夠將這種對應關係經過硬編碼在調用方業務代碼中實現,可是若是提供服務的機器掛掉調用方沒法知曉,若是不更改代碼會繼續請求掛掉的機器提供服務。zookeeper能夠經過心跳機制檢測掛掉的服務器並將掛掉的服務器的ip和服務器對應的關係從列表中刪除。
至於支持高併發,就是橫向擴展,在不更改代碼的狀況經過添加機器來提升運算能力。
Dubbo將註冊中心進行抽象,使得它能夠外接不一樣的存儲媒介給註冊中心提供服務。
引入zookeeper做爲存儲媒介,也就把zookeeper的特性引了進來。
首先是負載均衡:單註冊中心的承載能力是有限的,在流量達到必定程度的時候須要分流,負載均衡就是爲了分流而存在的,一個zookeeper集羣配合相應的web應用就很容易達到負載均衡;
資源同步:單單有負載均衡還不夠,節點之間的數據和資源是須要同步,zookeeper集羣就自然具有有這樣的功能;
命名服務:將樹狀結構用於維護全局的服務地址列表,服務提供者在啓動的時候,向zookeeper上的指定節點目錄下寫入本身的URL地址,這個操做就完成了服務的發佈
Mast:ZooKeeper能會保證客戶端沒法建立一個已經存在的ZNode。也就是說,若是同時有多個客戶端請求建立同一個臨時節點,那麼最終必定只有一個客戶端請求可以建立成功。利用這個特性,就能很容易地在分佈式環境中進行Master選舉了。
分佈式鎖:分佈式鎖是控制分佈式系統之間同步訪問共享資源的一種方式。當前得到鎖的客戶端機器發生宕機或重啓,那麼該臨時節點就會被刪除,釋放鎖。正常執行完業務邏輯後,客戶端就會主動將本身建立的臨時節點刪除,釋放鎖。
優勢:
透明化的遠程方法調用
像調用本地方法同樣調用遠程方法;只需簡單配置,沒有任何API侵入。
軟負載均衡及容錯機制
可在內網替代nginx lvs等硬件負載均衡器。
服務註冊中心自動註冊 & 配置管理
不須要寫死服務提供者地址,註冊中心基於接口名自動查詢提供者ip。
使用相似zookeeper等分佈式協調服務做爲服務註冊中心,能夠將絕大部分項目配置移入zookeeper集羣。
服務接口監控與治理
Dubbo-admin與Dubbo-monitor提供了完善的服務接口管理與監控功能,針對不一樣應用的不一樣接口,能夠進行 多版本,多協議,多註冊中心管理。
缺點:只支持JAVA語言
啓動dubbo時,消費者會從zookeeper中拉去註冊的生產者的地址接口等數據,緩存在本地.每次調用時,按照本地存儲的地址進行調用.可是在註冊中心所有掛掉後增長新的提供者,則不能被消費者發現
健壯性:
監控中心宕掉不影響使用,只是丟失部分採樣數據
數據庫宕掉後,註冊中心仍能經過緩存提供服務列表查詢,但不能註冊新服務
註冊中心對等集羣,任意一臺宕掉後,將自動切換到另外一臺
註冊中心所有宕掉後,服務提供者和服務消費者仍能經過本地緩存通信
服務提供者無狀態,任意一臺宕掉後,不影響使用
服務提供者所有宕掉後,服務消費者應用將沒法使用,並沒有限次重連等待服務提供者恢復
做者:普度衆生的面癱青年(原文做者)連接:https://www.jianshu.com/p/527e2944034c