问题:DNS 解析慢/被劫持?
使用 HTTPDSN,HTTPDNS 不是使用 DNS 协议,向 DNS 服务器传统的 53 端口发送请求,而是使用 HTTP 协议向 DSN 服务器的 80 端口发送请求。
HTTPDNS 优势
- 1、绕过运营商域名解析的过程,避免 Local DNS 的劫持。
- 2、降低平均访问时延,提供连接成功率。
- 3、HTTPDNS 服务器会增加流量调度、网络拨测/灰度、网络容灾等功能。
HTTPDNS在Android网络架构的位置及实践
目前我们App的Android网络流量都在okhttp之上,上层进行了网络门面的封装,封装内部的实现细节和对外友好的API,供各个业务和基础模块使用,在okhttp上我们扩展了DNS模块,使用HTTPDNS替换了原有的系统DNS。
代码如下(基于阿里HttpDns):
// OkhttpClient:httpDns 优化
builder.dns(OkHttpDns.getIns(WanAndroidApp.getAppComponent().getContext()));
public class OkHttpDns implements Dns {
private HttpDnsService dnsService;
private static OkHttpDns instance = null;
private OkHttpDns(Context context) {
dnsService = HttpDns.getService(context, "161133");
// 1、设置预解析的 IP 使用 Https 请求。
dnsService.setHTTPSRequestEnabled(true);
// 2、预先注册要使用到的域名,以便 SDK 提前解析,减少后续解析域名时请求的时延。
ArrayList<String> hostList = new ArrayList<>(Arrays.asList("www.wanandroid.com"));
dnsService.setPreResolveHosts(hostList);
}
public static OkHttpDns getIns(Context context) {
if (instance == null) {
synchronized (OkHttpDns.class) {
if (instance == null) {
instance = new OkHttpDns(context);
}
}
}
return instance;
}
@Override
public List<InetAddress> lookup(String hostname) throws UnknownHostException {
String ip = dnsService.getIpByHostAsync(hostname);
LogHelper.i("httpDns: " + ip);
if(ip != null){
List<InetAddress> inetAddresses = Arrays.asList(InetAddress.getAllByName(ip));
return inetAddresses;
}
// 3、如果从阿里云 DNS 服务器获取不到 ip 地址,则走运营商域名解析的过程。
return Dns.SYSTEM.lookup(hostname);
}
}
参考链接: