文档

HTTPDNS不使用SDK时注意事项

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

本文介绍不使用SDK,直接访问HTTPDNS API进行解析时的注意点。

风险防范建议

当您通过API接入HTTPDNS服务时,为了降低解析失败对您业务的影响,我们有以下两点建议:

  1. 避免使用某个服务IP来请求解析,应该采用服务IP调度接口获取可用IP列表,并结合轮询逻辑实现解析。

  2. 如果轮询所有服务IP都未获得有效IP,请降级到LocalDNS来解析(即操作系统原生DNS链路)。

警告

如果不采取上述建议,将存在较高的安全风险,且可能对您的业务带来重大影响(例如:某些硬件环境,将单服务解析IP固定化在系统中,没有降级机制,遇到服务IP被攻击就只能等到攻击结束,服务才能恢复)。

API接口文档

HTTP API使用启动IP获取服务IP的方式,服务IP不固定。

解析接口建议使用鉴权解析,您可以在控制台设置开启/关闭非鉴权解析请求。

  • 非鉴权解析:不需要鉴权签名,任何人都可以进行请求,存在一些不安全因素。比如 https://203.107.XXX.XXX/(accountid)/d?host=域名,可以直接浏览器访问拿到解析结果,解析成功会计算解析次数,可以看到accountid携带在请求中。

  • 鉴权解析:需要使用鉴权解析的secretKey进行鉴权生成加密串,然后将生成的加密串携带在请求中,而secretKey无需在请求中携带,所以secretKey不会暴露,安全级别较高。

异步处理

访问HTTPDNS服务时请做异步化处理,避免业务主流程同步等待网络解析过程。

案例:某客户在App端固化了单一的服务IP,并在业务请求中采用同步访问HTTPDNS服务IP的方式进行解析,如果遇到该服务IP被DDoS攻击进入黑洞时,会导致业务请求阻塞等待超时,App业务层受影响。

IP池轮转机制

访问HTTPDNS服务端时,请使用IP池轮转机制,某个IP访问不通时轮转到下一个进行重试,避免某个IP被DDoS攻击时受影响。

SDK重点功能

不使用SDK,直接访问HTTPDNS API进行域名解析,可以参考SDK功能点来编写自行使用的逻辑。

预解析

需要解析的域名host先进行解析,拿到结果进行缓存(缓存的时间可以是TTL时间,TTL过期后是否还有缓存可以酌情配置),便于后续直接获取解析结果。

自动刷新域名解析结果

在网络切换时,会自动刷新所有域名的解析结果,但会产生一定流量消耗。

设置降级

设置降级后,对应的域名不使用HTTPDNS进行解析。

是否允许HTTPDNS返回TTL过期的IP

当允许返回TTL过期的IP时,SDK在实时返回过期IP的同时依然会进行异步更新以获取最新的IP信息。

是否允许启用持久化缓存功能

  • 该功能旨在提升首屏加载速度,但持久化缓存会将上一次解析到的结果保存到本地持久层,App重启后,如果启动持久化缓存会优先从持久层加载解析结果。

  • 存在第一次使用的IP为过期IP(TTL过期,大多数情况下该IP依然可以正常使用)的可能性。

  • 如果业务服务器IP变化较频繁,建议谨慎接入该功能,以免对业务造成影响。

  • 持久化缓存影响“首次启动/网络切换”后域名解析结果,后续解析仍会请求HTTPDNS服务器,并更新本地缓存。

异步解析接口

  • 首先查询缓存,若存在则返回结果,若不存在返回null并且进行异步域名解析更新缓存。

  • 若接口返回null,为避免影响业务建议降级到Local DNS解析策略。

sessionId生成并在解析请求时携带

  • 获取用于用户追踪的sessionId,便于追踪历史问题。

  • sessionId为随机生成,长度为12位,App生命周期内保持不变。

  • 详细使用请参见API接口问题。

region节点设置

  • 按照region更新服务IP,可设置海外region。

  • 在设置海外region时将获取到海外服务IP,从而解析请求使用海外服务IP。

请求

HTTPS请求校验示例:

HttpURLConnection conn = (HttpURLConnection) new URL("").openConnection();
if (conn instanceof HttpsURLConnection) {
    ((HttpsURLConnection) conn).setHostnameVerifier(new HostnameVerifier() {
        public boolean verify(String hostname, SSLSession session) {
            return HttpsURLConnection.getDefaultHostnameVerifier().verify("203.107.1.1", session);
        }
    });
}
  • 本页导读 (0)
文档反馈