通过客户端接入概述您已经了解了 HTTPDNS 接入的基本原理,本文介绍通过 Java SDK 接入 HTTPDNS 的方法。
若为 Android 应用,请优先参考Android SDK接入手册接入。Java SDK 不支持本地持久化缓存和网络变化自动解析等 Android 特有功能。
一、快速入门
1.1 开通服务
请参考快速入门开通HTTPDNS。
1.2 获取配置
请参考开发配置在EMAS控制台开发配置中获取AccountId/SecretKey/AESSecretKey等信息,用于初始化SDK。
二、安装配置
根据您的项目构建工具,选择 Gradle 或 Maven 其中一种方式配置即可。
2.1 配置仓库地址
SDK 发布在阿里云 Maven 仓库,需要先添加仓库地址。
Gradle
在 settings.gradle 或 build.gradle 中添加:
repositories {
maven {
url 'https://maven.aliyun.com/nexus/content/repositories/releases/'
}
}Maven
在 pom.xml 中添加:
<repositories>
<repository>
<id>aliyun</id>
<url>https://maven.aliyun.com/nexus/content/repositories/releases/</url>
</repository>
</repositories>2.2 添加 SDK 依赖
Gradle
在 build.gradle 的 dependencies 中添加:
dependencies {
implementation 'com.aliyun.ams:alicloud-java-httpdns:1.0.0'
}Maven
在 pom.xml 的 <dependencies> 中添加:
<dependency>
<groupId>com.aliyun.ams</groupId>
<artifactId>alicloud-java-httpdns</artifactId>
<version>1.0.0</version>
</dependency>三、配置和使用
3.1 初始化配置
应用启动后,需要先初始化 SDK,才能调用 HTTPDNS 能力。初始化主要是配置 AccountId/SecretKey 等信息及功能开关。示例代码如下:
import com.alibaba.sdk.java.httpdns.HttpDnsClient;
import com.alibaba.sdk.java.httpdns.InitConfig;
import com.alibaba.sdk.java.httpdns.RequestIpType;
// 创建配置
InitConfig config = new InitConfig.Builder()
.setSecretKey("your-secret-key") // 加签密钥
.setEnableHttps(true) // 使用 HTTPS 解析
.setTimeoutMillis(2000) // 超时时间(毫秒)
.setEnableExpiredIp(true) // 允许使用过期 IP
.enableMemoryCache(true) // 启用内存缓存(默认 true)
.build();
// 初始化
HttpDnsClient.init("your-account-id", config);
// 获取客户端实例
HttpDnsClient client = HttpDnsClient.getClient("your-account-id");3.1.1 日志配置
应用开发过程中,如果要输出 HTTPDNS 的日志,可以通过 HttpDnsLog 配置:
import com.alibaba.sdk.java.httpdns.log.HttpDnsLog;
import com.alibaba.sdk.java.httpdns.ILogger;
// 开启日志输出
HttpDnsLog.enable(true);
// 设置自定义日志接口
HttpDnsLog.setLogger(new ILogger() {
@Override
public void log(String msg) {
System.out.println("[HTTPDNS] " + msg);
}
});3.1.2 SessionId 记录
应用在运行过程中,可以获取 sessionId 记录到数据采集系统中,用于线上问题排查:
String sessionId = client.getSessionId();
System.out.println("SessionId = " + sessionId);3.2 域名解析
3.2.1 预解析
完成HTTPDNS初始化后,可以对后续可能用到的热点域名配置预解析,以便SDK提前解析,减少后续域名解析时请求的时延,示例代码如下:
List<String> hosts = Arrays.asList("www.aliyun.com", "www.example.com");
client.setPreResolveHosts(hosts, RequestIpType.both);3.2.2 域名解析
当需要解析域名时,可以通过调用域名解析方法解析域名获取IP,示例代码如下:
HTTPDNSResult result = client.getHttpDnsResultForHostSyncNonBlocking(
"www.aliyun.com",
RequestIpType.both
);
if (result != null && result.getIps() != null) {
String[] ipv4List = result.getIps();
}
if (result != null && result.getIpv6s() != null) {
String[] ipv6List = result.getIpv6s();
}四、后续步骤
获取到 IP 后,需要将其应用到实际的网络请求中,根据实际使用的网络库,可以参考Java端HTTPDNS+OkHttp最佳实践、Java端HTTPDNS+Apache HttpClient最佳实践。
如果要对SDK进行更精细的配置或者使用鉴权请求等其它功能,可以参考Java SDK API。
五、注意事项
升级SDK后编译失败
如果您升级SDK版本后,出现编译失败的情况,有可能是因为SDK的API有调整,请查看Java SDK API使用替换的新接口。
务必编写降级代码
降级代码指的是当HTTPDNS无法获取期望结果时,需要降级使用Local DNS去完成域名解析。
记录从HTTPDNS获取的IP及sessionId
我们提供了用于解析问题排查的解决方案,需要您将从HTTPDNS获取的IP及sessionId记录到日志中,详情请参见如何使用“会话追踪方案”排查解析异常。