本文主要介绍用户在Android端开发中使用阿里OSS SDK如何结合阿里公共DNS SDK进行域名解析的方案。
概述
阿里云对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务。如果您使用了OSS SDK那么可以结合阿里公共DNS SDK进行OSS域名的解析,可以实现域名防劫持,DNS解析加速的效果。
实践方案
以下提供Android端阿里OSS SDK结合阿里公共DNS SDK以及OkHttp实现自定义DNS解析的示例。阿里公共DNS SDK的集成方案请参考Android SDK开发指南。
自定义DNS接口。
public class OkHttpDns implements Dns {
private static OkHttpDns instance;
private static Object lock = new Object();
private DNSResolver mDNSResolver = DNSResolver.getInstance();
private OkHttpDns() {
}
public static OkHttpDns getInstance() {
if (null == instance) {
synchronized (lock) {
if (instance == null) {
instance = new OkHttpDns();
}
}
}
return instance;
}
@Override
public List<InetAddress> lookup(@NonNull String hostname) throws UnknownHostException {
//调用阿里云公共DNS Android SDK提供API进行域名解析
String ip = mDNSResolver.getIPV4ByHost(hostname);
Log.d(TAG, "mDnsCache IP: " + ip);
if (ip != null) {
//如果ip不为null,直接使用该ip进行网络请求
return Arrays.asList(InetAddress.getAllByName(ip));
}
//如果返回null,走系统DNS服务解析域名
return Dns.SYSTEM.lookup(hostname);
}
}
生成okHttpClient实例,并配置到OSS。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
ClientConfiguration conf = new ClientConfiguration();
conf.setConnectionTimeout(15 * 1000); // 连接超时,默认15秒。
conf.setSocketTimeout(15 * 1000); // socket超时,默认15秒。
conf.setMaxConcurrentRequest(5); // 最大并发请求书,默认5个。
conf.setMaxErrorRetry(2); // 失败后最大重试次数,默认2次。
OkHttpClient.Builder builder = new OkHttpClient.Builder()
.dns(OkHttpDns.getInstance());
// 如果设置了自定义的okHttpClient,ClientConfiguration的部分设置将会失效。您需要将其手动设置到builder上。
if (conf != null) {
Dispatcher dispatcher = new Dispatcher();
dispatcher.setMaxRequests(conf.getMaxConcurrentRequest());
builder.connectTimeout(conf.getConnectionTimeout(), TimeUnit.MILLISECONDS)
.readTimeout(conf.getSocketTimeout(), TimeUnit.MILLISECONDS)
.writeTimeout(conf.getSocketTimeout(), TimeUnit.MILLISECONDS)
.followRedirects(conf.isFollowRedirectsEnable())
.followSslRedirects(conf.isFollowRedirectsEnable())
.dispatcher(dispatcher);
if (conf.getProxyHost() != null && conf.getProxyPort() != 0) {
builder.proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(conf.getProxyHost(), conf.getProxyPort())));
}
}
// 仅Android OSS SDK 2.9.12或以上版本支持使用conf.setOkHttpClient();方法。
conf.setOkHttpClient(builder.build());
OSS oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider, conf);
重要
阿里公共DNS SDK初始化设置需要在阿里OSS SDK初始化设置之前完成。
文档内容是否对您有帮助?