天天看點

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

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

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

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

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

第一種是通過啟動時在虛拟機參數中加上相關資訊

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

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

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

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

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

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

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 "容錯資料";
        }
    }
}