动态 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 + 端口(非 0 端口)优先级第二,会从注册中心推送的地址中匹配。(不再匹配后续)
  3. IP 优先级第三,会从注册中心推送的地址中匹配。

特别地,如果指定 needToCreatetrue,则会根据传入的参数自动构建一个 invoker。对于通过指定 ip(+ 端口)指定的地址,它会自动使用注册中心中第一个地址的参数来创建模板;如果没有地址,则会根据 Dubbo 协议自动创建。要自定义创建 invoker 的逻辑,请实现 org.apache.dubbo.rpc.cluster.specifyaddress.UserSpecifiedServiceAddressBuilder SPI 接口。(此功能仅受 Dubbo 3 实现 支持)

在为每个请求构建 Address 参数之前,将 UserSpecifiedAddressUtil 工具类传递给 Dubbo 框架。

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

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

必须每次都设置,并且必须在设置后立即发起调用,如果存在拦截器错误(在地址选择过程中,在 Dubbo 框架中移除此值),建议设置为 null,以避免 ThreadLocal 内存泄漏影响后续传输。


上次修改时间:2023 年 1 月 2 日:增强 en 文档 (#1798) (95a9f4f6c1c)