通过安卓SDK使用HTTPDNS服务
所有文档

          对象存储 BOS

          通过安卓SDK使用HTTPDNS服务

          场景概述

          基于BOS的使用情况来看,目前移动端上传的问题主要集中在如下几个方面:

          • DNS解析失败,请求出错;
          • 域名劫持,数据在传输中有篡改,给用户带来诸如网络钓鱼、隐私窃取等网络访问风险;
          • 弱网下,速度慢,上传数据可能有超时。

          使用HTTPDNS服务访问BOS后,有以下优势:

          • 安全防劫持,可有效降低由域名劫持引起的成功率下降问题;
          • 精准调度可提供最优接入点,降低用户访问时延;
          • 域名解析结果变更时,HTTPDNS服务没有传统DNS服务多级缓存的影响,能够更快的令移动端获取新的解析结果,避免多层缓存的影响,可有效缩短域名切换的生效时间。

          适用场景:使用BOS时对请求的成功率、延迟、故障止损效速度敏感的场景。

          操作流程

          开通HTTPDNS服务

          • 进入HTTPDNS官方文档,完成服务的开通;
          • 在【配置管理】的域名管理中添加*.bcebos.com,或者业务使用的自定义域名或者CDN域名;
          • 测试HTTPDNS。

          添加项目依赖

          我们提供了方便的远程依赖便于用户使用httpdns。

          • 打开需要引用该sdk的module的build.gradle,在最后增加:
          repositories{
              jcenter()
              maven {
                  url "https://raw.githubusercontent.com/bdhttpdns/BDHttpDnsSDK/master"
              }
          }
          • 在dependencies下增加:
          dependencies{
              compile 'com.baidu:httpdns:1.3'
          }

          重载OkHttpDns

          设置刚刚开通HTTPDNS服务的账号和密码,对常用域名进行预加载,避免初次请求时缓存不命中。同时,还可以设置多种处理策略,以更好地完成业务需要,参考移动域名解析Android_SDK设置接口

          static class OkHttpDns implements Dns {
              private static OkHttpDns instance = null;
              private BDHttpDns httpDns;
              
              private OkHttpDns(Context context) {
                  this.httpDns = BDHttpDns.getService(context);
                  this.httpDns.setAccountID(account);
                  this.httpDns.setSecret(secret);
                  // 预加载域名
                  ArrayList<String> preResolveHosts = new ArrayList<String>();
                  preResolveHosts.add("bj.bcebos.com");
                  this.httpDns.setPreResolveHosts(preResolveHosts);
              }
              
              public static OkHttpDns getInstance(Context context) {
                  if(instance == null) {
                      instance = new OkHttpDns(context);
                  }
                  return instance;
              }
              
              @Override
              public List<InetAddress> lookup(final String hostname) throws UnknownHostException {
                  // 通过同步解析接口获取ip
                  final BDHttpDnsResult httpDnsResult = httpDns.syncResolve(hostname, false);
                  Log.v("dns", "HttpDns resolve type: " + httpDnsResult.getResolveType());
                  // 优先使用ipv6结果,对于ipv6结果,需要在ip前后增加[]字符
                  // 若不存在ipv6结果,则使用ipv4结果
                  ArrayList<String> ipv6List = httpDnsResult.getIpv6List();
                  ArrayList<String> ipv4List = httpDnsResult.getIpv4List();
                  String ip = null;
                  if (ipv6List != null && !ipv6List.isEmpty()) {
                      ip = "[" + ipv6List.get(0) + "]";
                  } else if (ipv4List != null && !ipv4List.isEmpty()) {
                      ip = ipv4List.get(0);
                  } else {
                      Log.v("DNS", "Get empty iplist from httpdns, use origin url");
                  }
                  if(ip != null) {
                      final String finalIp = ip;
                      //如果ip不为null,直接使用该ip进行网络请求
                      List<InetAddress> inetAddresses = Arrays.asList(InetAddress.getAllByName(ip));
                      Log.d("DNS", "inetAddresses:" + inetAddresses);
                      return inetAddresses;
                  }
                  //如果返回null,走系统DNS服务解析域名
                  return Dns.SYSTEM.lookup(hostname);
              }
          }

          调整Bosclient配置

          使用setDns。

          BosClientConfiguration config = new BosClientConfiguration();
          config.setCredentials(new DefaultBceCredentials(accessKeyId, secretAccessKey));
          config.setEndpoint(bos_endpoint);
          config.setProtocol(Protocol.HTTP);
          config.setDns(OkHttpDns.getInstance(getApplicationContext()));

          立即体验

          以上流程完成后,正常使用BOS就可以体验HTTPDNS域名解析服务了。

          注意

          • HTTPDNS虽然有一定免费额度(目前每自然月有300万次免费域名解析次数),超过初始额度后会产生一定的费用,通过dns的参数配置,可以减少对httpdns server的访问,例如:缓存过期处理策略、使用https协议或http协议等。
          • APP刚启动时,默认HTTPDNS降级标志为是。SDK、网络库自动使用DNS解析的方式发起请求。这属于正常情况,不会影响后续使用HTTPDNS服务来访问BOS。
          上一篇
          客户端加密实践
          下一篇
          AWS S3兼容