學習博文:https://www.imooc.com/t/6300745java
dubbo是一個分佈式服務框架,致力於提供高性能透明化RPC遠程調用方案,提供SOA服務治理解決方案。web
- 因爲dubbo各個分層都是不少擴展,
- 註冊中心有redis、zookeeper選項,
- 通訊模塊有netty、mina,
- 序列化有hession、hession二、java序列化等,
- 本文不能面面俱到,重點闡述主線流程,
- 註冊中心選擇zookeeper(client選擇curator),
- 通訊選擇netty,
- 協議選擇dubbo,
- 序列化選擇hession2,
- 容器選擇Spring。
- 將應用拆分,並抽取出核心服務來解決上述問題,
- 還要考慮負載均衡、服務監控、高可用性、服務隔離與降級、路由策略、完善的容錯機制、序列化方案的選擇、通訊框架的選擇、開發人員對底層細節無感知、服務升級兼容性等問題。
分佈式服務調用時,每每會用到dubbo的負載均衡,dubbo提供多種可選的負載均衡策略進行配置,redis
- 但如何在調用的時候動態的指定某臺機器直接調用呢,負載均衡策略並不能知足這個需求,解決這個問題,則須要經過動態配置路由策略來實現。
節點角色說明:算法
- Consumer:服務消費者,即服務調用方;
- Provider:服務提供者,即被調用方;
- Registry:註冊中心,服務註冊與服務發現,dubbo支持4種註冊中心(multicast zookeeper redis simple),dubbo推薦使用zookeeper註冊中心;
- Monitor:服務監控中心,提供服務調用次數和調用時間統計;
- Container:服務運行容器;
調用關係說明:安全
- 0. 服務容器負責啓動,加載,運行服務提供者;
- 1. 服務提供者在啓動時,向註冊中心註冊本身提供的服務;
- 2. 服務消費者在啓動時,向註冊中心訂閱本身所需的服務;
- 3. 註冊中心返回服務提供者地址列表給消費者,若是有變動,註冊中心將基於長鏈接推送變動數據給消費者;
- 4. 服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,若是調用失敗,再選另外一臺調用;
- 5. 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。
Dubbo負載均衡
在集羣負載均衡時,dubbo提供了4種均衡策略,缺省爲random隨機調用,具體策略以下:服務器
直連提供者
- dubbo自己也會提供直連指定服務提供者的方式,繞過註冊中心,點對點鏈接到提供者。
動態配置路由規則
- dubbo服務的調用都是經過zookeeper註冊中心完成,咱們是否能夠向註冊中心寫入必定的路由規則,達到動態調用指定提供者的需求
- 以上代碼的規則,歸納就是:
- 對於全部調用com.foo.BarService接口的消費者,
- 若是消費者的ip是"10.20.153.10",那麼這個消費者將調用ip爲"10.20.153.11"的提供者,
- 這樣,經過動態配置註冊中心的路由規則,就實現了動態指定某個提供者的需求。
管理端
監控中心:
dubbo幾大核心組件:按照角色來劃分分爲:
- provider(服務提供方,對應前文的服務方)
- consumer(服務消費方,對應前文的調用方)
- monitor center(監控中心)
- registry center(註冊中心,接下來咱們以zookeeper爲例子說明)
- admin web console(管理端,用於修改路由、修改配置,最終做用於註冊中心)
更細緻的組件關係圖:按功能來劃分:
- directory (負責從zookeeper中心生成的provider列表)
- router (路由)
- fault-tolerantStrategy(容錯策略)
- loadBalance(負載均衡)
- monitorFilter(監控攔截)
- zookeeperClient(Zoookeeper客戶端,咱們使用zookeeper作例子)
- proxy(代理對象)
- nettyClient(咱們以netty做爲通訊框架)
- nettyServer(咱們以netty做爲通訊框架)
- Hession2Serialization(咱們選hession2做爲序列化方案)
集羣容錯
Dubbo提供了6種容錯機制,分別以下:
- failsafe 失敗安全,能夠認爲是把錯誤吞掉(記錄日誌)
- failover(默認) 重試其餘服務器; retries(2)--重試兩次
- failfast 快速失敗, 失敗之後立馬報錯
- failback 失敗後自動恢復。
- forking forks. 設置並行數
- broadcast 廣播,任意一臺報錯,則執行的方法報錯
服務降級
- 降級的目的是爲了保證核心服務可用。
- 降級能夠有幾個層面的分類: 自動降級和人工降級;
- 按照功能能夠分爲:讀服務降級和寫服務降級;
- 對一些非核心服務進行人工降級,在大促以前經過降級開關關閉哪些推薦內容、評價等對主流程沒有影響的功能
- 故障降級,好比調用的遠程服務掛了,網絡故障、或者RPC服務返回異常。 那麼能夠直接降級,降級的方案好比設置默認值、採用兜底數據(系統推薦的行爲廣告掛了,能夠提早準備靜態頁面作返回)等等
- 限流降級,在秒殺這種流量比較集中而且流量特別大的狀況下,由於突發訪問量特別大可能會致使系統支撐不了。這個時候能夠採用限流來限制訪問量。當達到閥值時,後續的請求被降級,好比進入排隊頁面,好比跳轉到錯誤頁(活動太火爆,稍後重試等)
- dubbo的降級方式: Mock
- 實現步驟
- 在client端建立一個TestMock類,實現對應IGpHello的接口(須要對哪一個接口進行mock,就實現哪一個),名稱必須以Mock結尾
- 在client端的xml配置文件中,添加以下配置,增長一個mock屬性指向建立的TestMock
- 模擬錯誤(設置timeout),模擬超時異常,運行測試代碼便可訪問到TestMock這個類。當服務端故障解除之後,調用過程將恢復正常
配置的優先級別
- 以timeout爲例,顯示了配置的查找順序,其它retries, loadbalance等相似