背景:单位因为域名劫持(具体表象是某个地区的用户ping不通域名或者因为DNS解析的ip跨网段导致访问速度很慢)需要运维经常去定位,于是提出了httpDNS方案。

想法是美好的,现实是残酷的。没引入这个机制还好,引入后问题更多。

坑1: 因为DNSPod收费,为了节省费用,我们采用了优先使用本地DNS的策略,服务器出现非200错误码,就切HttpDNS。结果服务器一个接口出现问题,导致大批量流量走HttpDNS。

解决方案:非502和非200返回码才走HttpDNS

坑2:在测试环境测试OK,在正式环境很多用户访问时nginx不能进行负载均衡,返回404页面

原因:现网环境是多个出口ip同一个nginx去负载,反向代理到十几个业务。数据经过某些网关或者代理时,头部的host信息被替换成url中的ip,导致到了nginx没有了域名信息,区分不了业务。

解决方案1:消息头中加入Host的同时,加入X-Online-Host(具体没验证)

解决方案2:代理环境不要走HttpDNS,具体原因可以通过接下来的不太完善测试方案看出问题来

坑3:https证书验证问题

解决方案:参考下文链接:HTTPS(含SNI)业务场景“IP直连”方案说明

总体来说:这项技术还不成熟(特别是腾讯的DNSPod文档粗糙简陋),未知的网络问题估计还有不少。

这里先放出阿里上比较完善的一些帮助文档,建议仔细看完后再考虑是否用,怎么用

HTTPDNS iOS、android(安卓)平台:HTTPDNS接入过程中需要注意哪些问题?

https://help.aliyun.com/knowledge_detail/41956.html?spm=5176.11065259.1996646101.searchclickresult.779a5af6PUztAf

HTTPDNS Android SDK开发指南

https://help.aliyun.com/document_detail/30140.html?spm=a2c4g.11174283.6.576.2UQ2EO

HTTPS(含SNI)业务场景“IP直连”方案说明

https://help.aliyun.com/document_detail/30143.html

接下来,说下我这个针对安卓不太完善的测试方案:

准备工具:

1.支持设置手动代理的移动设备一台

2.在PC机上安装Fiddler工具

3.已经集成HttpDNS的App

操作步骤:

  1. 修改Fiddler脚本,显示相关的抓包信息

在Main函数中添加:

FiddlerObject.UI.lvSessions.AddBoundColumn("TrueServerIP",120,"X-HostIP");
         
FiddlerObject.UI.lvSessions.AddBoundColumn("HeaderHost",120,"X-Original-Host");

          其中TrueServerIP标识最终访问服务器采用的Ip,HeaderHost标识App端头信息中指定URL IP地址对应的域名服务

         修改完毕后点击保存

拖动分割栏可以看到新增的列,可以将其拖动到前几列去

       

        修改OnBeforeRequest,修复Fiddler清理头文件中Host的问题,在函数尾部加上

if (oSession.BitFlags & SessionFlags.ProtocolViolationInRequest)
        {
           
var
sOverride =
oSession["X-Original-Host"];
           
if (!String.IsNullOrEmpty(sOverride))
            {
               
oSession.oRequest["Host"] = sOverride;
               
oSession["X-overrideHost"] = sOverride;
               
oSession["ui-backcolor"] = "yellow";

// Be sure to bypass the gateway,
otherwise overrideHost doesn't work
               
oSession.bypassGateway
= true;
               
//
FiddlerApplication.Log.LogFormat("host {0}, {1}",
oSession["X-Original-Host"], oSession["X-overrideHost"]);
           
}  
        }

         保存修改

2.修改Fiddler Host文件,实现域名劫持

配置一个不存在的Ip

3.设置移动设备网络代理服务器IP为测试PC的ip,端口为8888(默认)

4.进入集成HttpDNS的App验证相关功能,使用无缓存接口进行测试

5.查看Fiddler 抓包信息,验证httpDNS效果

如图显示说明走httpDNS成功

6.第一次切httpDNS效果稍有不同(如果实现方案走的是先采用本地DNS,当出现异常才走httpDNS),抓包数据如下:

第一次请求TureServerIp显示是Host中配置的ip 1.2.3.4 且HeaderHost未显示域名,说明:未走httpDns采用了域名访问;

访问失败后,app会自动走HttpDns获取到真实ip再请求一次服务器

此后App将会一直采用Ip直连

可以对比没用httpDns的和用了httpDns的app,抓包数据HeaderHost和TrueServerIp会明显不同。

HttpDNS的坑以及一个针对安卓不太完善的测试方案的更多相关文章

  1. 自己编写的一个有关安卓应用开发培训PPT

    这个是我自己编写的一个有关安卓应用开发培训PPT,适合新手. 在这里下载PPT

  2. 更新 是 可用的 针对 安卓 软件开发包和工具 Updates are available for android software development packages and tools

    作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com E-mail: 313134555 @qq.com 更新 是 可用的 针对 安卓 软件开发包和工 ...

  3. 写一个针对IQueryable<T>的扩展方法支持动态排序

    所谓的动态排序是指支持任意字段.任意升序降序的排序.我们希望在客户端按如下格式写: localhost:8000/api/items?sort=titlelocalhost:8000/api/item ...

  4. html5shiv 是一个针对 IE 浏览器的 HTML5 JavaScript 补丁,目的是让 IE 识别并支持 HTML5 元素。

    html5shiv 是一个针对 IE 浏览器的 HTML5 JavaScript 补丁,目的是让 IE 识别并支持 HTML5 元素. 各版本html5shiv.js CDN网址:https://ww ...

  5. 从零开始一个http服务器(六)-多路复用和压力测试

    从零开始一个http服务器(六)-多路复用和压力测试 代码地址 : https://github.com/flamedancer/cserver git checkout step6 运行: make ...

  6. 《maven实战》笔记(2)----一个简单maven项目的搭建,测试和打包

    参照<maven实战>在本地创建对应的基本项目helloworld,在本地完成后项目结构如下: 可以看到maven项目的骨架:src/main/java(javaz主代码)src/test ...

  7. netty系列之:一个价值上亿的网站速度优化方案

    目录 简介 本文的目标 支持多个图片服务 http2处理器 处理页面和图像 价值上亿的速度优化方案 总结 简介 其实软件界最赚钱的不是写代码的,写代码的只能叫马龙,高级点的叫做程序员,都是苦力活.那么 ...

  8. 第一个Django应用 - 第五部分:测试

    一.自动化测试概述 什么是自动化测试 测试是一种例行的.不可缺失的工作,用于检查你的程序是否符合预期. 测试可以划分为不同的级别.一些测试可能专注于小细节(比如某一个模型的方法是否会返回预期的值?), ...

  9. html2canvas截屏在H5微信移动端踩坑,ios和安卓均可显示

    1.最近在做移动端开发,框架是vue,一产品需求是,后台返回数据,通过qrcode.js(代码比较简单,百度上已经很多了)生成二维码,然后通过html2canvas,将html元素转化为canvas, ...

随机推荐

  1. Java-Io之文件File

    File是"文件"和"目录路径名"的抽象表示形式.File之间继承Object,实现了Serializable和Comparable接口,因此文件支持File对 ...

  2. Uva - 1598 - Exchange

    本来想用优先队列做,可是不知道怎么处理之间的关系,最后还是用了map方法AC了,不过速度上有些慢,提交的时候跑了1.557秒.估计这道题时间都稍微长些,题目的时间限制也是4.5秒,不像一般题目的3秒限 ...

  3. AngularJS进阶(三十二)书海拾贝之特殊的ng-src和ng-href

    书海拾贝之特殊的ng-src和ng-href 在说明这两个指令的特殊之前,需要先了解一下ng的启动及执行过程,如下: 1) 浏览器加载静态HTML文件并解析为DOM: 2) 浏览器加载angular. ...

  4. JAVA之旅(六)——单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖

    JAVA之旅(六)--单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖 java也越来越深入了,大家加油吧!咱们一步步来 一.单例设计模式 什么是设计模式? JAVA当中有 ...

  5. JAVA之旅(二)——if,switch,for,while,do while,语句嵌套,流程控制break , continue ,函数,重载的示例总结

    JAVA之旅(二)--if,switch,for,while,do while,语句嵌套,流程控制break , continue ,函数,重载的示例总结 JAVA的思想真的很重要,所以要专心的学-- ...

  6. XBMC源代码分析 2:Addons(皮肤Skin)

    前文已经对XBMC源代码的整体架构进行了分析: XBMC源代码分析 1:整体结构以及编译方法 从这篇文章开始,就要对XBMC源代码进行具体分析了.首先先不分析其C++代码,分析一下和其皮肤相关的代码. ...

  7. Python学习笔记 - 函数参数

    >>> def power(x): ... return x * x ... >>> power(5) 25 >>> def power(x, n ...

  8. 【翻译】在Ext JS和Sencha Touch中创建自定义布局

    原文:Creating Custom Layouts in Ext JS and Sencha Touch 布局系统是Sencha框架中最强大和最独特的一部分.布局会处理应用程序中每个组件的大小和位置 ...

  9. 《java入门第一季》之面向对象(一个易错面试题)

    这个面试题有点难度,有一些饶.不明白可以在下面讨论.还是值得搞懂的. / * 看程序写结果: A:成员变量的问题 int x = 10; //成员变量x是基本类型 Student s = new St ...

  10. 非阻塞IO模式原理

    与阻塞模式对应的另一种模式叫非阻塞IO模式,在整个通信过程中读和写操作不会阻塞,当前处理线程不存在阻塞情况.从A机器到B机器它的通信过程是:A机器一条线程将通道设置为写事件后往下执行,而另外一条线程遍 ...