動態 IP 呼叫

在發起 Dubbo 呼叫前指定本次呼叫的目標 IP

功能說明

使用 Dubbo 的擴展點實現指定 IP 呼叫。

使用場景

發起請求時,需要指定本次呼叫的伺服器,例如訊息回調、流量隔離等。

使用方法

外掛依賴

適配 Dubbo 3 版本

<dependency>
  <groupId>org.apache.dubbo.extensions</groupId>
  <artifactId>dubbo-cluster-specify-address-dubbo3</artifactId>
  <version>1.0.0</version>
</dependency>

適配 Dubbo 2 版本

<dependency>
  <groupId>org.apache.dubbo.extensions</groupId>
  <artifactId>dubbo-cluster-specify-address-dubbo2</artifactId>
  <version>1.0.0</version>
</dependency>

呼叫範例

ReferenceConfig<DemoService> referenceConfig = new ReferenceConfig<>();
// ...init
DemoService demoService = referenceConfig. get();

// for invoke
// 1. find 10.10.10.10:20880 exist
// 2. if not exist, create a invoker to 10.10.10.10:20880 if `needToCreate` is true (only support in Dubbo 3.x's implementation)
UserSpecifiedAddressUtil.setAddress(new Address("10.10.10.10", 20880, true));
demoService.sayHello("world");


// for invoke
// 1. find 10.10.10.10:any exist
// 2. if not exist, create a invoker to 10.10.10.10:20880 if `needToCreate` is true (only support in Dubbo 3.x's implementation)
UserSpecifiedAddressUtil.setAddress(new Address("10.10.10.10", 0, true));
demoService.sayHello("world");

參數說明

指定 IP 呼叫的參數會包裝在一個 Address 物件中。 參數類型參考如下

package org.apache.dubbo.rpc.cluster.specifyaddress;

public class Address implements Serializable {
    // ip - priority: 3
    private String ip;

    // ip+port - priority: 2
    private int port;

    // address - priority: 1
    private URL urlAddress;
    
    private boolean needToCreate = false;

    // ignore setter and getter
}
  1. urlAddress 優先順序最高,如果指定了目標的 URL 地址,會優先使用。(不再進行後續匹配)
  2. ip + port(非 0 port)優先順序次之,會從註冊中心已推送的地址中進行匹配。(不再進行後續匹配)
  3. IP 優先順序最低,會從註冊中心已推送的地址中進行匹配。

特別地,如果將 needToCreate 指定為 true,則會根據傳入的參數自動構建一個 invoker。 對於通過指定 ip(+ port)指定的地址,它會自動使用註冊中心中第一個地址的參數來創建模板;如果沒有地址,則會基於 Dubbo 協定自動創建。 要自訂創建 invoker 的邏輯,請實現 org.apache.dubbo.rpc.cluster.specifyaddress.UserSpecifiedServiceAddressBuilder SPI 介面。(此功能僅**Dubbo 3 實現**支援)

每次請求前,將通過 UserSpecifiedAddressUtil 工具類將構造好的 Address 參數傳遞給 Dubbo 框架。

package org.apache.dubbo.rpc.cluster.specifyaddress;

public class UserSpecifiedAddressUtil {
    
    public static void setAddress(Address address) { ... }
    
}

每次都必須設定,而且設定後必須立即發起呼叫,如果發生攔截器錯誤(在 Dubbo 框架中移除此值是在地址選擇過程中執行的),建議設定為 null,以避免 ThreadLocal 記憶體洩漏影響後續傳輸。


最後修改日期:2023 年 1 月 2 日:增強英文文件 (#1798) (95a9f4f6c1c)