全部产品

HTTPDNS 不使用 SDK 时注意事项

更新时间:2020-05-22 17:32:03

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

安全建议

API 接口文档

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

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

  • 非鉴权解析:不需要鉴权签名,任何人都可以进行请求,存在一些不安全因素。比如 https://203.107.1.1/(此处为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请求校验示例:

  1. HttpURLConnection conn = (HttpURLConnection) new URL("").openConnection();
  2. if (conn instanceof HttpsURLConnection) {
  3. ((HttpsURLConnection) conn).setHostnameVerifier(new HostnameVerifier() {
  4. public boolean verify(String hostname, SSLSession session) {
  5. return HttpsURLConnection.getDefaultHostnameVerifier().verify("203.107.1.1", session);
  6. }
  7. });
  8. }