【HttpDns】解决 APP 无法找到主机问题

本文中会提到部分厂商,不过均为举例需要或客观推荐的解决方案,并无任何利益关系

有用户反应产品偶然会出现『未能找到使用指定主机的服务器』问题,应该是 DNS 没有正确解析。从监控记录中并没有发现什么问题,各地的监测点的结果都很正常,那就应该是用户所处网络环境出了问题。

为了尽量提高产品可用性,进行了 HTTP DNS 的改造。


什么是 HTTP DNS

普通的网络请求,系统自动通过 DNS Server 将目标域名解析成 IP 地址,然后向这个 IP 地址发送请求完成数据交互。这个解析的过程对于 APP 来说是不可见的。

HTTP DNS 则是 APP 主动向 HTTP DNS Server 发送解析请求,Server 返回目标域名对应的 IP 地址,然后 APP 直接向目标地址发送请求,绕开了系统解析的这个环节,避免了用户所处环境带来的干扰。

当然 HTTP DNS Server 也是通过 IP 地址直接访问的,比如 DNSPod 免费版的 119.29.29.29,还有其他厂商可以自己寻找。

如何进行改造

根据改动范围是否设计后端(包括运维)有两种方法

A. 前后端配合版

这种改造方案非常简单,后端 Web Server 将 IP 地址直接绑定到目标站点,APP 在发起请求前,直接将所有 URL 中自己域名的部分换为通过 HTTP DNS 获得目标 IP 即可。

当然如果后端有针对域名的逻辑也需要处理下,比如防盗链用的 Referer 校验等。

另外有的第三方库(比如支付宝)需要 APP 传入 Server 回调地址。这种是没必要改的,毕竟请求来自 IDC 机房等网络环境很好的场合。不过一定要改的话,这种地址可能在第三方平台上有绑定审核,实际动手前请提前准备审核。

B. APP 单独版

不同公司合作开发或者一台 Server 托管了若干站点的情况,只能 APP 自己想办法了。这种稍微麻烦点,针对不同用途的 URL 需要做不同的处理。

  1. 普通请求,类似于 REFTful API,每次请求完成一个动作,比如获得数据之类
    这种可以直接用 IP 替换域名,然后在 HTTP request header 中将 Host 指定为域名即可。

  2. Webview 中加载 Web page
    如果只是加载用户协议、关于我们这种单页纯文本的东西,和普通请求相同改法即可。不过很多网页内都会有相对地址的超链接,Webview 内的超链接跳转时无法指定 Host 字段,后端 Server 可能无法正确处理这种请求。另外 cookie 等和域有关对的东西也容易出问题,所以这种类型最好还是维持域名访问的原状。

  3. 传给第三方库使用的回调地址
    同样,这种本来就没问题,强行改的话反而会出问题,所以不要更改。

  4. 第三方地址,比如 Apple Store 的评分页面,或者点击广告后跳转的营销页
    这种可改可不改,视具体情况而定,总体建议维持原状比较好。

一些有用的实践经验

  • APP 启动时异步 HTTP DNS 查询 IP 地址
    毕竟大部分用户网络状况都是正常的,没必要影响所有人的启动速度

  • 查到后将 IP 地址缓存
    除了内存外最好也能持久化缓存,这样下次启动时即使万一 HTTP DNS 查询比较慢也能确保有可用的 IP。

  • HTTP DNS 查询后触发进行一次系统的 DNS 解析
    仍有使用域名请求的场景(比如APP单独改造时用到 Webview)下使用。
    如果域名不是被刻意劫持或干扰,一般无法找到主机的问题只是解析过慢,提前触发查询后,等用户操作到相关逻辑时正常的概率就会更高。

  • 发送请求前若有 IP 则使用 IP,否则使用域名
    这是当然的 XD

  • 网络状况发生变化时,重新异步 HTTP DNS 查询 IP 地址
    如果产品在不同线路部署有不同 Server 的话,重新查询一遍可以确保总是使用最合适的那台。

第三方库

iOS/Android 都有现成的第三方库可供使用,GitHub 上有新浪和七牛的项目

Objective-C Java
新浪:貌似不成熟,开发者不推荐商用 新浪:功能异常强大,解释也很详细,请直接查看该项目主页
七牛:提供 DNSPod 等 HTTP 方式,也支持 nslookup 方式(可以指定 DNS Server) 七牛:同左边

另外七牛项目的分别发布到了 CocoaPods 和 maven 上更易使用,所以推荐七牛。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 最近,终于要把《WEB请求处理系列》提上日程了,一直答应小伙伴们给分享一套完整的WEB请求处理流程:从浏览器、Ng...
    七寸知架构阅读 31,040评论 27 253
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,382评论 25 707
  • 1. 概述 在网络环境中一般用户只需要在浏览器中输入url如www.sunny.com就可以到对应服务器获取相应的...
    ghbsunny阅读 2,859评论 0 7
  • "**附属医院在哪儿你知道吗?" "干嘛一定要去我们学校的附属医院呢?其他医院不行吗?" "不是,我是去看一位瑞士...
    台木阅读 251评论 0 0