一、超時時間
由於網絡或服務端不可靠,會導致調用出現一種不確定的中間狀態(超時)。為了避免超時導致客戶端資源(線程)掛起耗盡,必須設置超時時間。
1、Dubbo 消費端
指定接口以及特定方法超時配置
<!--
屬性覆蓋規則
以 timeout 為例:
1)精確優先 (方法級優先,接口級次之,全局配置再次之)
2)消費者設置優先(如果級別一樣,則消費方優先,提供方次之)
-->
<dubbo:reference interface="com.njf.gmall.service.UserService"
id="userService" check="false" timeout="4000">
<dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method>
</dubbo:reference>
<!-- 配置當前消費者的統一規則,所有的服務都不檢查-->
全局超時配置
<dubbo:consumer check="false" timeout="5000"></dubbo:consumer>
2、Dubbo 服務端
全局超時配置
<dubbo:provider timeout="5000" />
指定接口以及特定方法超時配置
<dubbo:provider interface="com.foo.BarService" timeout="2000">
<dubbo:method name="sayHello" timeout="3000" />
</dubbo:provider>
二、配置之間的關系

三、不同粒度配置的覆蓋關系
以 timeout 為例,下圖顯示了配置的查找順序,其它 retries, loadbalance, actives 等類似:
-
方法級優先,接口級次之,全局配置再次之。 -
如果級別一樣,則消費方優先,提供方次之。
其中,服務提供方配置,通過 URL 經由注冊中心傳遞給消費方。
配置的覆蓋規則:
-
方法級配置別優於接口級別,即小 Scope 優先 -
Consumer 端配置 優於 Provider 配置 優於 全局配置, -
最后是 Dubbo Hard Code 的配置值(見配置文檔)

dubbo 推薦在 Provider 上盡量多配置 Consumer 端屬性
1、作服務的提供者,比服務使用方更清楚服務性能參數,如調用的超時時間,合理的重試次數,等等
2、在 Provider 配置后,Consumer 不配置則會使用 Provider 的配置值,即 Provider 配置可以作為 Consumer 的缺省值。否則,Consumer 會使用 Consumer 端的全局設置,這對於 Provider 不可控的,並且往往是不合理的
(建議由服務提供方設置超時,因為一個方法需要執行多長時間,服務提供方更清楚,如果一個消費方同時引用多個服務,就不需要關心每個服務的超時設置)。
理論上 ReferenceConfig 中除了 interface 這一項,其他所有配置項都可以缺省不配置,框架會自動使用 ConsumerConfig,ServiceConfig, ProviderConfig 等提供的缺省配置。
1、2.1.0 開始支持,注意聲明:xmlns:p="http://www.springframework.org/schema/p"
2、引用缺省是延遲初始化的,只有引用被注入到其它 Bean,或被 getBean() 獲取,才會初始化。如果需要飢餓加載,即沒有人引用也立即生成動態代理,可以配置:<dubbo:reference ... init="true" />