Android端阿里OSS SDK结合阿里公共DNS SDK使用方案

本文主要介绍用户在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开发指南

  1. 自定义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);
    }
}
  1. 生成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初始化设置之前完成。