写点什么

对象存储 BOS: 通过安卓 SDK 使用 HTTPDNS 服务

  • 2023-03-15
    北京
  • 本文字数:1959 字

    阅读完需:约 6 分钟

本文介绍如何使用 HTTPDNS 服务访问 BOS。


需求场景


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


(1)DNS 解析失败,请求出错;


(2)域名劫持,数据在传输中有篡改,给用户带来诸如网络钓鱼、隐私窃取等网络访问风险;


(3)弱网下,速度慢,上传数据可能有超时。


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


(1)安全防劫持,可有效降低由域名劫持引起的成功率下降问题;


(2)精准调度可提供最优接入点,降低用户访问时延;


(3)域名解析结果变更时,HTTPDNS 服务没有传统 DNS 服务多级缓存的影响,能够更快的令移动端获取新的解析结果,避免多层缓存的影响,可有效缩短域名切换的生效时间。


因此,如果您对 BOS 的请求成功率、延迟、故障止损效速度较为敏感,您可以使用 HTTPDNS 服务访问 BOS。


方案概述


使用 HTTPDNS 服务访问 BOS,您需要开通 HTTPDNS 服务,并添加项目依赖,重载 OkHttpDns,并调整 Bosclient 配置。


注意事项:

  • HTTPDNS 虽然有一定免费额度(目前每自然月有 300 万次免费域名解析次数),超过初始额度后会产生一定的费用,通过 d 的参数配置,可以减少对 httpdns server 的访问,例如:缓存过期处理策略、使用 https 协议或 http 协议等。

  • APP 刚启动时,默认 HTTPDNS 降级标志为是。SDK、网络库自动使用 DNS 解析的方式发起请求。这属于正常情况,不会影响后续使用 HTTPDNS 服务来访问 BOS。


实践操作

1.开通 HTTPDNS 服务

  • 进入 HTTPDNS 官方文档,完成服务的开通;

  • 在【配置管理】的域名管理中添加*.bcebos.com,或者业务使用的自定义域名或者 CDN 域名;

  • 测试 HTTPDNS。

2.添加项目依赖


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


打开需要引用该 sdk 的 module 的 build.gradle,在最后增加:

repositories{    jcenter()    maven {        url "https://raw.githubusercontent.com/bdhttpdns/BDHttpDnsSDK/master"    }}
复制代码

在 dependencies 下增加:

dependencies{ compile 'com.baidu:httpdns:1.3' }3.重载 OkHttpDns

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



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;}
@Overridepublic 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);}
复制代码


4.调整 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()));
复制代码

5.立即体验

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

发布于: 刚刚阅读数: 3
用户头像

关注百度开发者中心,收获一手技术干货。 2018-11-12 加入

汇聚百度所有对外开放技术、平台和服务资源,提供全方位支持,助力开发者加速成功,实现开发者、消费者和百度三方共赢。https://developer.baidu.com/

评论

发布
暂无评论
对象存储BOS: 通过安卓SDK使用HTTPDNS服务_对象存储_百度开发者中心_InfoQ写作社区