ubbo缺省會在啓動時檢查依賴的服務是否可用,不可用時會拋出異常,阻止Spring初始化完成,以便上線時,能及早發現問題,默認check=true。若是check=false,老是會返回引用,當服務恢復時,能自動連上。數據庫
http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E5%90%AF%E5%8A%A8%E6%97%B6%E6%A3%80%E6%9F%A5服務器
在集羣調用失敗時,Dubbo提供了多種容錯方案,缺省爲failover重試。經過配置 retries="2"(注意,這個2不包含第一次錯誤的計數) 能夠達到3次錯誤就不在重試多線程
http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E9%9B%86%E7%BE%A4%E5%AE%B9%E9%94%99併發
在集羣負載均衡時,Dubbo提供了多種均衡策略,缺省爲random隨機調用。app
關鍵配置項:loadbalance="roundrobin"負載均衡
http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1dom
示例:異步
<dubbo:protocol name="dubbo" dispatcher="all" threadpool="fixed" threads="100" />
http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E7%BA%BF%E7%A8%8B%E6%A8%A1%E5%9E%8Bide
在開發及測試環境下,常常須要繞過註冊中心,只測試指定服務提供者,這時候可能須要點對點直連,性能
http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E7%9B%B4%E8%BF%9E%E6%8F%90%E4%BE%9B%E8%80%85
不一樣的服務使用不一樣的協議傳輸,不一樣服務在性能上適用不一樣協議進行傳輸,好比大數據用短鏈接協議,小數據大併發用長鏈接協議。
同一個服務使用多種協議,例如須要與http客戶端互操做
http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E5%A4%9A%E5%8D%8F%E8%AE%AE
服務消費者使用多個服務提供者的服務,
當一個接口有多種實現時,能夠用group區分。
示例:
<dubbo:service group="feedback" interface="com.xxx.IndexService" /> <dubbo:service group="member" interface="com.xxx.IndexService" />
<dubbo:reference id="feedbackIndexService" group="feedback" interface="com.xxx.IndexService" /> <dubbo:reference id="memberIndexService" group="member" interface="com.xxx.IndexService" />
當一個接口實現,出現不兼容升級時,能夠用版本號過渡,版本號不一樣的服務相互間不引用。
http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E5%8F%82%E6%95%B0%E9%AA%8C%E8%AF%81
回聲測試用於檢測服務是否可用,回聲測試按照正常請求流程執行,可以測試整個調用是否通暢,可用於監控。
MemberService memberService = ctx.getBean("memberService"); // 遠程服務引用 EchoService echoService = (EchoService) memberService; // 強制轉型爲EchoService String status = echoService.$echo("OK"); // 回聲測試可用性 assert(status.equals("OK"))
上下文中存放的是當前調用過程當中所需的環境信息。
xxxService.xxx(); // 遠程調用 boolean isConsumerSide = RpcContext.getContext().isConsumerSide(); // 本端是否爲消費端,這裏會返回true String serverIP = RpcContext.getContext().getRemoteHost(); // 獲取最後一次調用的提供方IP地址 String application = RpcContext.getContext().getUrl().getParameter("application"); // 獲取當前服務配置信息,全部配置信息都將轉換爲URL的參數 // ... yyyService.yyy(); // 注意:每發起RPC調用,上下文狀態會變化 // ...
public class XxxServiceImpl implements XxxService { public void xxx() { // 服務方法實現 boolean isProviderSide = RpcContext.getContext().isProviderSide(); // 本端是否爲提供端,這裏會返回true String clientIP = RpcContext.getContext().getRemoteHost(); // 獲取調用方IP地址 String application = RpcContext.getContext().getUrl().getParameter("application"); // 獲取當前服務配置信息,全部配置信息都將轉換爲URL的參數 // ... yyyService.yyy(); // 注意:每發起RPC調用,上下文狀態會變化 boolean isProviderSide = RpcContext.getContext().isProviderSide(); // 此時本端變成消費端,這裏會返回false // ... } }
RpcContext是一個ThreadLocal的臨時狀態記錄器,當接收到RPC請求,或發起RPC請求時,RpcContext的狀態都會變化。
好比:A調B,B再調C,則B機器上,在B調C以前,RpcContext記錄的是A調B的信息,在B調C以後,RpcContext記錄的是B調C的信息。
基於NIO的非阻塞實現並行調用,客戶端不須要啓動多線程便可完成並行調用多個遠程服務,相對多線程開銷較小。
http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E5%BC%82%E6%AD%A5%E8%B0%83%E7%94%A8
參數回調方式與調用本地callback或listener相同,只須要在Spring的配置文件中聲明哪一個參數是callback類型便可,Dubbo將基於長鏈接生成反向代理,這樣就能夠從服務器端調用客戶端邏輯。
http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E5%8F%82%E6%95%B0%E5%9B%9E%E8%B0%83
在調用以前,調用以後,出現異常時,會觸發oninvoke, onreturn, onthrow三個事件,能夠配置當事件發生時,通知哪一個類的哪一個方法。
http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E4%BA%8B%E4%BB%B6%E9%80%9A%E7%9F%A5
限制服務消費者調用服務提供者的併發數和鏈接數
http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E5%B9%B6%E5%8F%91%E6%8E%A7%E5%88%B6