获取解析服务地址

HTTPDNS提供 HTTP API 形式的域名解析服务。为了确保您能就近访问最近的服务节点,同时保障高可用性,我们提供了动态的服务调度能力。本文档介绍如何通过调度接口实时获取服务IP地址。

应用场景

HTTPDNS提供了官方SDK为您提供域名解析服务,在SDK中,我们已经实现了自动获取、更新、维护服务IP地址的功能,您只需要通过接口调用即可完成解析。但在一些特定场景,可能您不希望集成SDK,而是自行根据HTTPDNS官方 HTTP API 来实现域名解析。此时,您就需要关注如何获取、更新、维护服务节点IP地址列表,保证域名解析链路能最近调度、高可用。

为此,我们提供了一个同样是 HTTP API 形式的调度接口,在使用HTTPDNS进行解析前,您需要调用该接口来获取服务地址。整体逻辑为:

  1. 您需要在应用中内置一份默认的HTTPDNS启动IP地址列表,应用启动后,您任意选择其中1个IP(或域名),向该地址发起请求,调用调度接口;

  2. 调度接口会根据请求的来源地址,自动发现距离最近,且健康的HTTPDNS服务节点;

  3. 调度接口在响应中返回该服务节点的服务IP地址列表;

  4. 从该服务IP地址列表,任意选择其中一个IP地址来调用解析接口,对域名做解析;

  5. 若应用重启、或发生网络切换,您可以使用调度接口再次发起调度请求,获取新的服务地址列表。

通过上述逻辑,您就可以获取、更新、维护一份就近调度、高可用的HTTPDNS服务地址列表。

重要

HTTPDNS官方SDK中已实现本能力,此文档主要针对无法使用SDK的场景。

术语介绍

调度服务:即本文档介绍的提供调度接口的服务,它根据请求来源IP,返回服务IP地址列表及其他服务调度信息,您通常只需要关注返回的IP地址列表。

解析服务:即HTTPDNS解析服务接口,用于将域名解析为对应IP地址。请参见解析服务接口文档。

启动IP:调度服务的IP(可能包含域名)入口。用于获得最新的服务IP地址列表。

服务IP:解析服务的IP入口,用于调用域名解析服务。

接入流程

整体接入流程如图示:

image

  1. 提工单或加入钉钉群35248489申请启动IP列表。

    说明

    启动IP应写死在App中,为保证服务可用性,我们会提供多个启动IP供您使用,若在调用调度接口时请求失败,可以更换另一个启动IP进行重试。

  2. 使用启动IP调用调度服务获取服务IP列表。

    说明
    • 调度服务支持HTTP/HTTPS方式访问。如使用HTTPS,则为了实现IP直连HTTPS请求,需要参考下文中验证服务器身份章节来验证服务器身份。

    • 启动IP仅可用于调用调度服务。

  3. 使用服务IP调用解析服务。

  4. 按需使用启动IP调用调度服务来更新服务IP列表,保持服务IP列表的有效性。

    说明
    • 建议App冷启动时进行更新

    • 建议切换网络环境时进行更新

    • 建议每8小时至少更新一次

    • 当服务IP列表经过重试发现都无法解析时,立即更新

重要

解析服务返回的服务IP列表需要有更新机制,长期固定使用可能有稳定性隐患。

调度接口具体说明

URLhttps://{启动IP}/{account_id}/ss

重要

{account_id}是您HTTPDNS服务的专属ID,您可以在HTTPDNS控制台上获取。

请求方式:GET

可选参数说明一

说明

可选参数用于支持调度异常的排查,详情请参考如何使用“会话追踪方案”排查解析异常

名称

是否必须

描述

sid

可选

sessionId,[a-zA-Z0-9]{12},在app启动时生成,用于标记一次独立的app生命周期。

net

可选

5g|4g|3g|2g|wifi|unknown,用于标记请求发起时刻os层提供的网络情况。

bssid

可选

WiFi环境的bssid,用于标记不同的WiFi网络。

可选参数说明二

名称

是否必须

描述

n

可选

待加签的随机数,要求是16进制数,字符长度最小为8,最长为16,例如:abcdef2345。

t

可选

1970年1月1日以来的秒数(整型正数,固定长度10)。

重要

客户端和服务器时间偏移需小于150秒,您可以根据响应头中的Date进行校准。

s

可选

用secret(在HTTPDNS控制台查看)生成的签名, 计算方式:s=md5sum(n-secret-t), 如:n=abcdef2345,secret=123456,t=1632912372, 则对字符串 "abcdef2345-123456-1632912372"对应的ASCII码进行加签,结果为: de7be63a9f19cf11e9d455d7d4f23cb4。

使用HTTPS请求时,需要验证服务器身份:

  • 当您使用HTTPS请求调度接口时,我们会提供主机名为203.107.1.1的有效证书(无论使用哪个IP请求),请据此验证服务器身份;这需要您手动忽略证书错误中的主机名错误,并自行编码验证证书所持主机名为203.107.1.1。

  • 调度接口返回结果时,我们会对响应内容做签名,并将签名值放置在响应头的X-Checksum-HmacMD5字段中。如果您对安全性有较高要求,可以根据此签名逻辑验证返回结果是否合法。

返回结果签名逻辑:

  • 假设secretKey为:IAmASecret,随机数n为:2EUenAaShVfy,当前时间戳1568802250, 响应内容为:{"service_ip":["203.107.1.33"],"service_ipv6":["64:ff9b::cb6b:121"]}

  • 请求url:http://{启动IP}/{account_id}/ss?n=2EUenAaShVfy&t=1568802250

  • sign = hmacMD5("IAmASecret", "2EUenAaShVfy-{"service_ip":["203.107.1.33"],"service_ipv6":["64:ff9b::cb6b:121"]}-1568802250") = 3C74A498A00EEE6C5E7C599B3B882658

  • 则返回结果的响应头中会包含:X-Checksum-HmacMD5:3C74A498A00EEE6C5E7C599B3B882658

说明

secretKey可在“HTTPDNS控制台>开发配置>鉴权secretkey”查看。

返回示例

请求成功时,HTTP响应的状态码为200,响应结果用JSON格式表示,示例如下:

{
  "service_ip": [
    "203.107.1.33"
  ],
  "service_ipv6": [
    "64:ff9b::cb6b:121"
  ]
}

字段

说明

service_ip

IPv4服务IP列表,一般只需使用此列表中的IP调用解析服务。

service_ipv6

IPv6服务IP列表,特殊场景下可以使用此列表中的v6 IP调用解析服务。

请求失败时,HTTP响应的状态码为4xx/5xx,同时也返回具体的错误码,响应结果用JSON格式表示,示例如下:

{
  "code": "MissingArgument"
}

状态码说明

错误码

HTTP状态码

描述

MissingArgument

400

缺少必要参数

TimeOutOfSync

400

时间偏差过大,请根据响应头中的Date进行校准

InvalidNonce

400

随机数不合要求

InvalidTimestamp

403

时间戳格式不正确

AccountNotExists

403

账户不存在或被禁用,或尚未在HTTPDNS控制台添加过域名

InternalError

500

服务端内部错误