Java SDK API

更新时间:
复制为 MD 格式

本文档详细介绍Java SDK提供的API接口。

一、基础配置接口

1.1 初始化配置

初始化 HTTPDNS 服务配置,在调用其他接口前必须先完成初始化。

接口定义

static void init(String accountId, InitConfig config)

所属类

HttpDnsClient

参数说明

参数

类型

是否必填

说明

accountId

String

系统分配的 Account ID,可在 EMAS 控制台获取

config

InitConfig

初始化配置对象

代码示例

InitConfig config = new InitConfig.Builder()
    .setSecretKey("your-secret-key")
    .setEnableHttps(true)
    .setTimeoutMillis(2000)
    .setEnableExpiredIp(true)
    .build();

HttpDnsClient.init("your-account-id", config);

1.2 获取服务实例

获取 HTTPDNS 客户端实例,用于后续的域名解析操作。

接口定义

static HttpDnsClient getClient(String accountId)
static HttpDnsClient getClient(String accountId, String secretKey)

所属类

HttpDnsClient

参数说明

参数

类型

是否必填

说明

accountId

String

系统分配的 Account ID

secretKey

String

鉴权密钥

返回说明

类型

说明

HttpDnsClient

HTTPDNS 客户端实例

代码示例

HttpDnsClient client = HttpDnsClient.getClient("your-account-id");

1.3 InitConfig 配置项

通过 InitConfig.Builder 构建初始化配置。

setSecretKey

设置 HTTPDNS 解析过程中加签时使用的密钥。

设置密钥后,SDK 内部向服务端发起请求时,会对请求进行签名,帮助 HTTPDNS 服务端对解析请求进行身份认证和防篡改,进而提升 SDK 与服务端的交互安全性。

接口定义

InitConfig.Builder setSecretKey(String secretKey)

所属类

InitConfig.Builder

参数说明

参数

类型

是否必填

说明

secretKey

String

加签密钥

setAesSecretKey

设置 HTTPDNS 解析过程中加密时使用的密钥。

设置加密密钥后,SDK 内部向服务端发起请求时,请求参数和响应结果将会使用 AES 算法进行加密。使用加密能力可以获得更高的安全性,但在计费逻辑上也存在差异。关于计费逻辑可参考产品计费

接口定义

InitConfig.Builder setAesSecretKey(String aesSecretKey)

所属类

InitConfig.Builder

参数说明

参数

类型

是否必填

说明

aesSecretKey

String

加密密钥

setEnableHttps

HTTPDNS SDK 进行域名解析时,默认是通过 HTTP 协议发起解析请求,如果需要使用 HTTPS 协议发起解析请求,需要配置使用 HTTPS 协议进行域名解析。

使用 HTTPS 请求将会获得更高的安全性,但也要关注 HTTP 和 HTTPS 两种方式在计费上的不同。关于计费逻辑可参考产品计费

说明

使用 HTTPS 请求是否还需要加密:两者工作在不同层次。HTTPS 协议保障传输层安全,但通过抓包方式仍可以查看参数和响应细节。AES 加密保障 HTTPDNS 业务层安全,即使抓包也无法看到明文内容。因此,可以按需求决定是否都启用。

接口定义

InitConfig.Builder setEnableHttps(boolean enableHttps)

所属类

InitConfig.Builder

参数说明

参数

类型

是否必填

说明

enableHttps

boolean

设置是否使用 HTTPS 协议解析域名。true:开启 HTTPS 解析;false:关闭 HTTPS 解析

setTimeoutMillis

设置域名解析超时时间,默认为 2000ms。

接口定义

InitConfig.Builder setTimeoutMillis(int timeoutMillis)

所属类

InitConfig.Builder

参数说明

参数

类型

是否必填

说明

timeoutMillis

int

设置域名解析超时时间,时间单位为毫秒。默认 2000ms,最大 5000ms

setEnableExpiredIp

遵循 DNS 协议,按照 TTL 缓存域名解析结果,从而提升应用在发起网络请求时获取 IP 的效率。当缓存过期后,若应用调用解析接口获取 IP,此时会有不同情况:

  1. 如果应用调用的是同步非阻塞接口,因为缓存已过期,但 SDK 又无法立即从服务端获得新的解析结果,为了不阻塞线程,该接口将返回空结果,需要调用方做降级到 LocalDNS 解析的处理。

  2. 如果应用调用的是同步接口或异步接口,则 SDK 会发起解析请求从服务端获取新的解析,这个过程需要一定时间,则同步接口会阻塞线程直到获得新的解析结果,异步接口将在获得新的解析结果后才回调。

SDK 提供设置选项,允许复用过期 IP,设置为 true 后,则上述两种情况,虽然缓存的 IP 过期了,但接口仍然可以立即返回这个过期的 IP,从而减少 DNS 环节处理时间,提升网络请求性能。同时,SDK 发现该 IP 过期,返回后,也会立即启动异步线程对这个域名进行解析,从而获取新的解析结果。

因此,开启这个选项的副作用非常小,特别是在所解析域名本身的解析配置不会频繁变动时(如主站域名、静态网关域名等)。若域名确实发生解析变更,则开启该选项也只会影响该域名缓存过期后的第一个请求,因为 SDK 在被调用时发现 IP 过期,总是会立即发起对这个域名的解析更新

默认允许。

重要

当设置为 true 时,SDK 在实时返回过期 IP 的同时依然会进行异步更新以获取最新的 IP 信息。

接口定义

InitConfig.Builder setEnableExpiredIp(boolean enableExpiredIp)

所属类

InitConfig.Builder

参数说明

参数

类型

是否必填

说明

enableExpiredIp

boolean

设置是否允许返回超过 TTL 的 IP。true:允许返回过期 IP;false:不返回过期 IP

enableMemoryCache

设置是否启用内存缓存。

接口定义

InitConfig.Builder enableMemoryCache(boolean enable)

所属类

InitConfig.Builder

参数说明

参数

类型

是否必填

说明

enable

boolean

true:启用内存缓存(默认);false:禁用内存缓存

setRegion

如果应用需要在海外环境使用 HTTPDNS,为了提升解析效率,可以主动设置本 SDK 的启动服务节点。设置节点后,SDK 会使用该节点进行域名解析和进行随后的调度节点列表更新。

接口定义

InitConfig.Builder setRegion(Region region)

所属类

InitConfig.Builder

参数说明

参数

类型

是否必填

说明

region

Region

服务节点区域枚举值,用于海外服务区域选择。缺省时,使用中国内地服务节点

setIPRankingList

设置 IP 优选列表。设置该接口后,如果解析了相应的域名,则 SDK 会对返回的 IP 进行 IP 测速,对返回的列表进行动态排序,以保证第一个 IP 是可用性较好的 IP。

说明

仅支持 IPv4 地址的优选。

接口定义

InitConfig.Builder setIPRankingList(List<? extends IPRankingBean> ipRankingList)

所属类

InitConfig.Builder

参数说明

参数

类型

是否必填

说明

ipRankingList

List<IPRankingBean>

IP 优选配置列表

configCacheTtlChanger

每条解析结果,默认是使用服务端下发的 TTL 来判断是否过期。如果您需要修改解析结果的 TTL,可以通过此接口进行配置。

接口定义

InitConfig.Builder configCacheTtlChanger(CacheTtlChanger changer)

所属类

InitConfig.Builder

参数说明

参数

类型

是否必填

说明

changer

CacheTtlChanger

自定义 TTL 接口实现

setNotUseHttpDnsFilter

如果您需要对特定域名限制不使用 HTTPDNS 去进行域名解析,可以在这个接口里过滤掉这些域名,被过滤的域名会返回空的解析结果,您需要降级到 LocalDNS 进行域名解析。

接口定义

InitConfig.Builder setNotUseHttpDnsFilter(NotUseHttpDnsFilter filter)

所属类

InitConfig.Builder

参数说明

参数

类型

是否必填

说明

filter

NotUseHttpDnsFilter

配置黑名单策略

setSdnsGlobalParams

设置自定义解析(SDNS)全局参数。该全局参数不影响自定义解析接口的额外参数设置,会和自定义解析接口的额外参数合并,每个自定义解析请求都会携带这些全局参数。

接口定义

InitConfig.Builder setSdnsGlobalParams(Map<String, String> params)

所属类

InitConfig.Builder

参数说明

参数

类型

是否必填

说明

params

Map<String, String>

用于自定义解析的全局参数

二、域名解析接口

2.1 设置预解析域名

在应用启动,完成 SDK 初始化后,可以立即调用此接口,设置您后续可能会使用到的热点域名,以便 SDK 提前解析,减少后续域名解析时请求的时延。

如果是在运行过程中调用,SDK 也会立即解析设置的域名列表中的域名,从而刷新这些域名的解析结果,记录到缓存中。相当于强制做一次更新。通常用于某些业务动作发生之后,希望刷新当前的域名解析,强制域名重新调度。

重要

基于解析效率和响应速度的平衡考量,SDK 每次向服务端提交的批量解析任务限制为 5 个域名。因此当预解析列表的域名个数超过 5 个时,SDK 会自动分批提交解析。

setPreResolveHosts

接口定义

void setPreResolveHosts(List<String> hostList)
void setPreResolveHosts(List<String> hostList, RequestIpType requestIpType)

所属类

HttpDnsClient

参数说明

参数

类型

是否必填

说明

hostList

List<String>

预解析域名列表。待解析的域名必须为纯域名字符串,不可包含协议头(如 http://)、路径或者端口,否则可能导致解析异常。不支持泛域名

requestIpType

RequestIpType

预解析的 IP 类型。如果没有此参数则默认为 RequestIpType.v4

代码示例

List<String> hosts = Arrays.asList("www.example.com", "api.example.com");
client.setPreResolveHosts(hosts, RequestIpType.both);

2.2 同步非阻塞解析

  • 使用同步非阻塞接口解析域名,不会阻塞当前线程,但可能会返回空结果。

  • 该接口仅查询缓存,返回缓存查询的解析结果。若缓存中没有解析结果或者缓存中的解析结果已经 TTL 过期,则会在工作线程中进行域名解析,解析成功后更新缓存,供下次调用域名解析使用。

getHttpDnsResultForHostSyncNonBlocking

接口定义

HTTPDNSResult getHttpDnsResultForHostSyncNonBlocking(String host, RequestIpType type)
HTTPDNSResult getHttpDnsResultForHostSyncNonBlocking(String host, RequestIpType type, String clientIp)
HTTPDNSResult getHttpDnsResultForHostSyncNonBlocking(String host, RequestIpType type, Map<String, String> params, String cacheKey)
HTTPDNSResult getHttpDnsResultForHostSyncNonBlocking(String host, RequestIpType type, Map<String, String> params, String cacheKey, String clientIp)

所属类

HttpDnsClient

参数说明

参数

类型

是否必填

说明

host

String

待解析域名

type

RequestIpType

待解析的 IP 类型。推荐使用 RequestIpType.both

clientIp

String

客户端 IP,用于服务端场景指定实际客户端 IP 以获取更精准的解析结果

params

Map<String, String>

解析域名携带的额外参数,对应服务端自定义解析函数中的 event.parameters 参数

cacheKey

String

域名对应的本地缓存 key。使用 SDNS 时必须传入非 null 值,如果额外参数变更导致需要重新去服务端解析,则需要变更 cacheKey

返回说明

类型

说明

HTTPDNSResult

解析结果

代码示例

HTTPDNSResult result = client.getHttpDnsResultForHostSyncNonBlocking(
    "www.example.com", 
    RequestIpType.both
);

if (result != null && result.getIps() != null && result.getIps().length > 0) {
    String ip = result.getIps()[0];
}

2.3 同步解析

  • 使用同步解析接口解析域名,会阻塞当前线程,直到获得有效解析结果并返回。

  • 该接口首先查询缓存,若缓存存在可用的解析结果则立即返回缓存解析结果,若缓存中没有可用的解析结果,则会阻塞当前调用解析的线程并且在工作线程中进行域名解析,等域名解析完成返回解析结果,或达到超时时间返回空值。

重要

同步解析接口,整体的耗时受超时配置控制,如果在超时配置内还没有解析成功,会立即返回空解析结果。

getHttpDnsResultForHostSync

接口定义

HTTPDNSResult getHttpDnsResultForHostSync(String host, RequestIpType type)
HTTPDNSResult getHttpDnsResultForHostSync(String host, RequestIpType type, String clientIp)
HTTPDNSResult getHttpDnsResultForHostSync(String host, RequestIpType type, Map<String, String> params, String cacheKey)
HTTPDNSResult getHttpDnsResultForHostSync(String host, RequestIpType type, Map<String, String> params, String cacheKey, String clientIp)

所属类

HttpDnsClient

参数说明

参数

类型

是否必填

说明

host

String

待解析域名

type

RequestIpType

待解析的 IP 类型。推荐使用 RequestIpType.both

clientIp

String

客户端 IP,用于服务端场景指定实际客户端 IP

params

Map<String, String>

解析域名携带的额外参数,对应服务端自定义解析函数中的 event.parameters 参数

cacheKey

String

域名对应的本地缓存 key。使用 SDNS 时必须传入非 null 值,如果额外参数变更导致需要重新去服务端解析,则需要变更 cacheKey

返回说明

类型

说明

HTTPDNSResult

解析结果

代码示例

HTTPDNSResult result = client.getHttpDnsResultForHostSync(
    "www.aliyun.com", 
    RequestIpType.both
);

2.4 异步解析

  • 使用异步解析接口解析域名,不会阻塞当前线程,解析结果会通过回调的形式返回。

  • 该接口首先查询缓存,若缓存存在可用的解析结果则立即通过回调返回缓存解析结果,若缓存中没有可用的解析结果,则会在工作线程中进行域名解析,等域名解析结束或者达到超时时间再通过回调返回解析结果。

重要

异步解析接口,整体的耗时受超时配置控制,如果在超时配置内还没有解析成功,会立即通过回调返回空解析结果。

getHttpDnsResultForHostAsync

接口定义

void getHttpDnsResultForHostAsync(String host, RequestIpType type, HttpDnsCallback callback)
void getHttpDnsResultForHostAsync(String host, RequestIpType type, String clientIp, HttpDnsCallback callback)
void getHttpDnsResultForHostAsync(String host, RequestIpType type, Map<String, String> params, String cacheKey, HttpDnsCallback callback)
void getHttpDnsResultForHostAsync(String host, RequestIpType type, Map<String, String> params, String cacheKey, String clientIp, HttpDnsCallback callback)

所属类

HttpDnsClient

参数说明

参数

类型

是否必填

说明

host

String

待解析域名

type

RequestIpType

待解析的 IP 类型。推荐使用 RequestIpType.both

callback

HttpDnsCallback

域名解析结果回调接口

clientIp

String

客户端 IP,用于服务端场景

params

Map<String, String>

解析域名携带的额外参数,对应服务端自定义解析函数中的 event.parameters 参数

cacheKey

String

域名对应的本地缓存 key。使用 SDNS 时必须传入非 null 值,如果额外参数变更导致需要重新去服务端解析,则需要变更 cacheKey

代码示例

client.getHttpDnsResultForHostAsync("www.example.com", RequestIpType.both, 
    new HttpDnsCallback() {
        @Override
        public void onHttpDnsCompleted(HTTPDNSResult result) {
            if (result != null && result.getIps() != null) {
                String[] ips = result.getIps();
                // 使用解析结果
            }
        }
    });

三、缓存管理接口

3.1 清空指定域名缓存

使用阿里云域名解析服务的用户,调用该接口主动清除本地缓存,可实现秒级域名配置生效。

例如:假设域名 xxx.com,解析 IP 地址为 ip1,当 ip1 遭受攻击,需要将流量迁移至 ip2,实现流程如下:

  1. 首先,用户在云解析控制台将域名对应 IP 修改为 ip2,此时在 HTTPDNS 服务端会立即获取到此变更信息,并清除服务端该域名的 ip1 缓存。

  2. 用户手动调用此接口,清空 xxx.com域名的本地缓存。

  3. 应用端清空缓存后的下一次请求,会使得服务端重新请求权威服务器,获取最新解析 IP 地址 ip2,从而使前端解析结果立即生效为 ip2。

cleanHostCache

接口定义

void cleanHostCache(ArrayList<String> hosts)

所属类

HttpDnsClient

参数说明

参数

类型

是否必填

说明

hosts

ArrayList<String>

需要清除的 host 域名数组。如果需要清空全部数据,传 null 或者空数组即可

代码示例

// 清除指定域名缓存
ArrayList<String> hosts = new ArrayList<>();
hosts.add("www.example.com");
client.cleanHostCache(hosts);

// 清除所有缓存
client.cleanHostCache(null);

四、排查追踪接口

4.1 获取 SessionId

获取用于追踪解析过程的 sessionId,若遇到解析异常的情况,通过钉群、工单等方式寻找技术支持协助排查时,需要提供此信息。

说明

sessionId 为随机生成,长度为 12 位,应用生命周期内保持不变。

getSessionId

接口定义

String getSessionId()

所属类

HttpDnsClient

返回说明

类型

说明

String

sessionId

代码示例

String sessionId = client.getSessionId();
System.out.println("SessionId: " + sessionId);

4.2 获取 SDK 版本号

获取当前 SDK 版本号。

getSdkVersion

接口定义

String getSdkVersion()

所属类

HttpDnsClient

返回说明

类型

说明

String

SDK 版本号

代码示例

String version = client.getSdkVersion();
System.out.println("SDK Version: " + version);

4.3 日志控制

HttpDnsLog.enable

设置是否打开 HTTPDNS 的日志开关,默认关闭。

接口定义

static void enable(boolean enable)

所属类

HttpDnsLog

参数说明

参数

类型

是否必填

说明

enable

boolean

是否打印 Log

代码示例

HttpDnsLog.enable(true);

HttpDnsLog.setLogger

可以通过设置日志的回调类来获取 SDK 内部输出的日志。

接口定义

static void setLogger(ILogger logger)

所属类

HttpDnsLog

参数说明

参数

类型

是否必填

说明

logger

ILogger

设置该接口后,SDK 内部的日志会通过 ILogger 接口进行回调,便于自行控制日志的打印和存储

代码示例

HttpDnsLog.setLogger(new ILogger() {
    @Override
    public void log(String msg) {
        System.out.println("[HTTPDNS] " + msg);
    }
});

HttpDnsLog.removeLogger

删除日志回调类。

接口定义

static void removeLogger(ILogger logger)

所属类

HttpDnsLog

参数说明

参数

类型

是否必填

说明

logger

ILogger

之前添加过的 logger

代码示例

HttpDnsLog.removeLogger(myLogger);

五、其他接口

5.1 设置 Region

动态更新 region 节点。

setRegion

接口定义

void setRegion(Region region)

所属类

HttpDnsClient

参数说明

参数

类型

是否必填

说明

region

Region

region 为节点,设置海外 region,用于海外服务区域选择

代码示例

client.setRegion(Region.HK);  // 切换到香港节点

5.2 校正签名时间

进行该操作后,如果有偏差,每次网络请求都会对设备进行时间校正;不进行该操作的话将以设备时间为准。

setAuthCurrentTime

接口定义

void setAuthCurrentTime(long time)

所属类

HttpDnsClient

参数说明

参数

类型

是否必填

说明

time

long

当前时间的时间戳(毫秒)

代码示例

HttpDnsClient client = HttpDnsClient.getClient(accountId);
client.setAuthCurrentTime(System.currentTimeMillis());

六、常用数据结构

6.1 HTTPDNSResult

域名解析返回的解析结果数据类。

getHost

获取对应域名。

接口定义

String getHost()

返回说明

类型

说明

String

域名

getIps

获取解析的 IPv4 地址。

接口定义

String[] getIps()

返回说明

类型

说明

String[]

域名解析的 IPv4 地址

getIpv6s

获取解析的 IPv6 地址。

接口定义

String[] getIpv6s()

返回说明

类型

说明

String[]

域名解析的 IPv6 地址

getExtras

获取解析的额外参数,只有自定义解析会有这部分数据。

接口定义

String getExtras()

返回说明

类型

说明

String

额外参数字符串

isExpired

解析结果是否已经过期,是否过期是根据解析结果获取时间和域名配置的 TTL 来计算。

接口定义

boolean isExpired()

返回说明

类型

说明

boolean

true:已过期;false:未过期

getTtl

获取解析结果的 TTL(生存时间)。

接口定义

int getTtl()

返回说明

类型

说明

int

TTL,单位秒

6.2 RequestIpType

请求的 IP 类型枚举。

枚举值

说明

v4

需要解析的类型为 IPv4

v6

需要解析的类型为 IPv6

both

需要解析的类型为 IPv4 和 IPv6

代码示例

// 同时解析 IPv4 和 IPv6
HTTPDNSResult result = client.getHttpDnsResultForHostSyncNonBlocking(
    "www.example.com", 
    RequestIpType.both
);

6.3 Region

服务节点区域枚举,用于海外服务区域选择。

枚举值

说明

DEFAULT

中国内地(默认)

HK

中国香港

SG

新加坡

DE

德国

US

美国

代码示例

new InitConfig.Builder().setRegion(Region.SG);  // 新加坡节点

6.4 HttpDnsCallback

异步域名解析接口的回调接口。

onHttpDnsCompleted

解析结束后的回调函数,成功/失败都会回调该函数。

接口定义

void onHttpDnsCompleted(HTTPDNSResult result)

参数说明

参数

类型

说明

result

HTTPDNSResult

解析结果对象

代码示例

client.getHttpDnsResultForHostAsync("www.example.com", RequestIpType.both, 
    new HttpDnsCallback() {
        @Override
        public void onHttpDnsCompleted(HTTPDNSResult result) {
            if (result != null && result.getIps() != null) {
                // 解析成功
            } else {
                // 解析失败或无结果
            }
        }
    });

6.5 ILogger

日志接口。

log

日志方法。

接口定义

void log(String msg)

参数说明

参数

类型

说明

msg

String

日志

代码示例

HttpDnsLog.setLogger(new ILogger() {
    @Override
    public void log(String msg) {
        // 自定义日志处理
        System.out.println("[HTTPDNS] " + msg);
    }
});

6.6 CacheTtlChanger

自定义域名解析结果 TTL 的接口。

changeCacheTtl

自定义 TTL。

接口定义

int changeCacheTtl(String host, RequestIpType type, int ttl)

参数说明

参数

类型

说明

host

String

域名

type

RequestIpType

IP 类型

ttl

int

原始的 ttl

返回说明

类型

说明

int

自定义后的 ttl,如果不需要自定义,请返回原始的 ttl

代码示例

new InitConfig.Builder()
    .configCacheTtlChanger(new CacheTtlChanger() {
        @Override
        public int changeCacheTtl(String host, RequestIpType type, int ttl) {
            if ("www.aliyun.com".equals(host)) {
                return ttl * 10;
            }
            return ttl;
        }
    });

6.7 NotUseHttpDnsFilter

不使用 HTTPDNS 解析的域名过滤接口。

notUseHttpDns

配置不使用 HTTPDNS 解析的域名。

接口定义

boolean notUseHttpDns(String hostName)

参数说明

参数

类型

说明

hostName

String

域名

返回说明

类型

说明

boolean

true:过滤当前域名,当前域名不走 HTTPDNS 的云端解析;false:不过滤当前域名,当前域名走 HTTPDNS 的云端解析

代码示例

new InitConfig.Builder()
    .setNotUseHttpDnsFilter(new NotUseHttpDnsFilter() {
        @Override
        public boolean notUseHttpDns(String hostName) {
            return "www.aliyun.com".equals(hostName);
        }
    });

6.8 IPRankingBean

IP 优选配置项。设置该接口后,如果解析了相应的域名,则 SDK 会对返回的 IP 进行 IP 测速,对返回的列表进行动态排序,以保证第一个 IP 是可用性较好的 IP。

构造方法

IPRankingBean(String hostName, int port)

参数说明

参数

类型

说明

hostName

String

进行 IP 优选的域名

port

int

用于测试速度的端口

getHostName

获取域名。

接口定义

String getHostName()

getPort

获取端口。

接口定义

int getPort()

代码示例

List<IPRankingBean> list = new ArrayList<>();
list.add(new IPRankingBean("www.example.com", 443));
list.add(new IPRankingBean("api.example.com", 8080));

new InitConfig.Builder()
    .setIPRankingList(list);