1. 程式人生 > >Dubbo在開發中的一些常用配置

Dubbo在開發中的一些常用配置

如果 本地 code info 技術 不兼容 mil 是否可用 文檔

介紹Dubbo在開發中的一些常用配置,文中內容主要參考dubbo文檔配置和示例兩節,詳細可移步訪問 傳送站

技術分享圖片

1. 屬性配置方法及加載順序

屬性常用配置方法主要有三種:

第一種是通過啟動時在虛擬機參數中加上相關信息

技術分享圖片

第二種也是最常用的是通過xml方式配置,隨著springboot和dubbo的集成,這種方式在springboot項目中表現為通過application.properties來配置,兩者優先級相同;

第三種是在classpath 根目錄下的創建 dubbo.properties,dubbo啟動時,如果沒有其他配置文件,會自動加載該配置。

技術分享圖片

2. 啟動檢查

Dubbo 缺省會在啟動時檢查依賴的服務是否可用,不可用時會拋出異常,阻止 Spring 初始化完成,以便上線時,能及早發現問題,默認 check="true"

可在xml和properties文件中進行配置,以顯式關閉啟動檢查

<!-- 關閉所有服務的啟動時檢查 (沒有提供者時報錯) -->
<dubbo:consumer check="false" />
dubbo.consumer.check=false

3. 超時設置 & 配置覆蓋關系

由於網絡或服務端不可靠,會導致調用出現一種不確定的中間狀態(超時)。為了避免超時導致客戶端資源(線程)掛起耗盡,必須設置超時時間。缺省使用<dubbo:consumer>的timeout,目前默認為1000。

Dubbo消費端

<!--
全局超時配置 --> <dubbo:consumer timeout="5000" /> <!-- 指定接口以及特定方法超時配置 --> <dubbo:reference interface="com.foo.BarService" timeout="2000"> <dubbo:method name="sayHello" timeout="3000" /> </dubbo:reference>

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 經由註冊中心傳遞給消費方。

技術分享圖片

建議由服務提供方設置超時,因為一個方法需要執行多長時間,服務提供方更清楚,如調用的超時時間,合理的重試次數,等等;如果一個消費方同時引用多個服務,就不需要關心每個服務的超時設置。另外,在服務提供方配置後,消費方不配置則會使用服務提供方的配置值,即服務提供方配置可以作為消費方的缺省值。否則,消費方會使用消費方的全局設置,這對於服務提供方不可控的,並且往往是不合理的。

4. 重試次數

失敗自動切換,當出現失敗,重試其它服務器,但重試會帶來更長延遲。可通過 retries="2" 來設置重試次數(不含第一次)

<!--針對服務提供方 -->
<dubbo:service retries="2" />
<!-- 針對服務消費方 -->
<dubbo:reference retries="2" />
<!-- 針對方法 -->
<dubbo:reference>
    <dubbo:method name="findFoo" retries="2" />
</dubbo:reference>

5. 多版本

當一個接口實現,出現不兼容升級時,可以用版本號過渡,版本號不同的服務相互間不引用。

可以按照以下的步驟進行版本遷移:

  1. 在低壓力時間段,先升級一半提供者為新版本
  2. 再將所有消費者升級為新版本
  3. 然後將剩下的一半提供者升級為新版本

老版本服務提供者配置:

<dubbo:service interface="com.foo.BarService" version="1.0.0" />

新版本服務提供者配置:

<dubbo:service interface="com.foo.BarService" version="2.0.0" />

老版本服務消費者配置:

<dubbo:reference id="barService" interface="com.foo.BarService" version="1.0.0" />

新版本服務消費者配置:

<dubbo:reference id="barService" interface="com.foo.BarService" version="2.0.0" />

如果不需要區分版本,可以按照以下的方式配置:

<dubbo:reference id="barService" interface="com.foo.BarService" version="*" />

6. 本地存根

遠程服務後,客戶端通常只剩下接口,而實現全在服務器端,但提供方有些時候想在客戶端也執行部分邏輯,比如:做 ThreadLocal 緩存,提前驗證參數,調用失敗後偽造容錯數據等等,此時就需要在 API 中帶上 Stub,客戶端生成 Proxy 實例,會把 Proxy 通過構造函數傳給 Stub ,然後把 Stub 暴露給用戶,Stub 可以決定要不要去調 Proxy。

服務提供方(服務消費方也可配置)

<dubbo:service interface="com.foo.BarService" stub="com.foo.BarServiceStub" />

業務邏輯放在Stub類中實現

package com.foo;
public class BarServiceStub implements BarService { 
    private final BarService barService;
    
    // 構造函數傳入真正的遠程代理對象
    public (BarService barService) {
        this.barService = barService;
    }
 
    public String sayHello(String name) {
        // 此代碼在客戶端執行, 你可以在客戶端做ThreadLocal本地緩存,或預先驗證參數是否合法,等等
        try {
            return barService.sayHello(name);
        } catch (Exception e) {
            // 你可以容錯,可以做任何AOP攔截事項
            return "容錯數據";
        }
    }
}

Dubbo在開發中的一些常用配置